簡體   English   中英

使用Python觸發Arduino中的數據采集

[英]Triggering data acquisition in Arduino with Python

我想使用Python在連接了加速度計(MPU 6050)的Arduino UNO上觸發數據采集。 這個想法是,當使用Python給出命令時,Arduino將開始在其SRAM上保存數據,並且當將保存一定數量的測量值時,數據將以包的形式發送回Python。

這是我當前的Arduino代碼:

#include<Wire.h>
#define MPU6050_DLPF_94HZ     MPU6050_DLPF_CFG_2

const int MPU_addr_1 = 0x68; // I2C address of the first MPU-6050
const int baudrate = 19200;
int16_t AcX1; // definition of variables

const int len = 200; // Buffer size
float analogDataArray[len];
int count = 0;

void setup() {
  Wire.begin();
  Wire.beginTransmission(MPU_addr_1);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  Serial.begin(baudrate);
}

void loop() {
  Wire.beginTransmission(MPU_addr_1);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU_addr_1, 8, true); // request a total of 14 registers
  float AcX1 = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)


  if (Serial.available())
  {
    if (Serial.read() == 'Y') {
      analogDataArray[count] = AcX1;
      count = count + 1;
      if (count >= len) {
        for (int i; i <= len; i = i + 1) {
          Serial.println(analogDataArray[i] / 16384);
        }
      }
      count = 0;

    }
  }
  delay(5);
}

這是我的Python代碼:

import serial
arduinoData = serial.Serial('COM3', 19200)
com = input('Press "Y":' )
arduinoData.write(bytes(com, 'utf-8'))

vec = []

run = True
while run is True:
    while (arduinoData.inWaiting() == 0):
        pass
    arduinoString = arduinoData.readline()
    vec.append(float(arduinoString))
    if len(vec) >= 100:
        run = False
print(vec)

我設法使其能夠進行1次測量,但是一旦我在Arduino內部定義了一個數組來保存多次測量,該代碼就無法正常工作。 我確定它已經接近工作了,但是我找不到阻止我這樣做的細節。

感謝您提供的任何幫助。 親切的問候,

大號

我得到了它的解決,問題出在我的Arduino代碼中,正如預期的那樣。

#include<Wire.h>
#define MPU6050_DLPF_94HZ     MPU6050_DLPF_CFG_2

const int MPU_addr_1 = 0x68; // I2C address of the first MPU-6050
const int baudrate = 9600;
int16_t AcX1; // definition of variables

const int len = 200; // Buffer size
float analogDataArray[len];
int count = 0;

int ans;

void setup() {
  Wire.begin();
  Wire.beginTransmission(MPU_addr_1);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  Serial.begin(baudrate);
}

void loop() {
  Wire.beginTransmission(MPU_addr_1);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU_addr_1, 8, true); // request a total of 14 registers
  float AcX1 = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)


  if (Serial.available() && Serial.read() == 'Y') {
    ans = 1;
  }
  if (ans == 1) {
    analogDataArray[count] = AcX1;
    count = count + 1;
    if (count >= len) {
      for (int i; i <= len; i = i + 1) {
        Serial.println(analogDataArray[i] / 16384);
      }
      ans = 0;
    }
  }
  delay(5);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM