【问题标题】:Processing Sketch Using Data from Arduino is Lagging使用来自 Arduino 的数据处理草图是滞后的
【发布时间】:2017-03-15 12:05:43
【问题描述】:

我正在使用带有 Arduino 的陀螺仪/加速度计传感器 (https://www.sparkfun.com/products/13284) 来记录旋转。我一共使用了八个这样的传感器。我还使用多路复用器来帮助处理多个传感器 (https://learn.adafruit.com/adafruit-tca9548a-1-to-8-i2c-multiplexer-breakout/overview)。在我的 Arduino 接收到数据后,我在处理中使用它来创建所有旋转传感器的二维图像。

我目前遇到了严重滞后的问题(旋转动画停止,然后多次重新启动)。我将处理用于可视界面和串行通信,以将数据从 Arduino(带有连接的传感器)发送到运行处理的计算机。

目前,我的代码读取传感器,然后发送一个带有字母前缀的值,稍后由处理代码解析。例如,如果它读取“传感器的 x1 值”,它会发送“S”,后跟相关的 x1 值。在处理方面,它首先检查“S”是否存在,如果存在,则将以下值读入适当的变量以供动画显示。

附件是 Arduino 代码(.ino 文件)和处理草图(.pde 文件)。为了加快数据的处理速度,我尝试每帧动画读取四分之一的数据。因此,在每次从 Arduino 发送数据时运行的“serialEvent”方法中,有类似“if(frameCount % 4 == 0){ read first Quarter of data}”、“if(frameCount % 4 == 1){ read second quarter of data}" 等。这也不起作用,但您会在下面的代码中看到它。

任何帮助!

ARDUINO 代码:

#include<Wire.h>
#include "Wire.h"
#define TCAADDR 0x70
extern "C" {
  #include "utility/twi.h"  // from Wire library, so we can do bus scanning

  #include <LSM9DS1_Registers.h>
  #include <LSM9DS1_Types.h>
  #include <SparkFunLSM9DS1.h>
  #include <SPI.h>
  LSM9DS1 imu;
  #define LSM9DS1_AG  0x6B // Would be 0x6A if SDO_AG is LOW
  #define PRINT_CALCULATED
}

const int MPU_addr = 104; // I2C address of the MPU-6050
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;

void tcaselect(uint8_t i) {
  if (i > 7) return;

  Wire.beginTransmission(TCAADDR);
  Wire.write(1 << i);
  Wire.endTransmission();
}

void setup() {
  Serial.begin(9600);
  Wire.begin();

  tcaselect(0);
  setter();

  tcaselect(1);
  setter();

  tcaselect(2);
  setter();

  tcaselect(3);
  setter();

  tcaselect(4);
  setter();

  tcaselect(5);
  setter();

  tcaselect(6);
  setter();

  tcaselect(7);
  setter();

  Serial.println("done");

}
void loop() {

  tcaselect(0);
  looperZero();

  tcaselect(1);
  looperOne();

  tcaselect(2);
  looperTwo();

  tcaselect(3);
  looperThree();

  tcaselect(4);
  looperFour();

  tcaselect(5);
  looperFive();

  tcaselect(6);
  looperSix();

  tcaselect(7);
  looperSeven();

}

void setter() {
  Serial.begin(9600);
  imu.settings.device.commInterface = IMU_MODE_I2C;
  imu.settings.device.agAddress = LSM9DS1_AG;
  imu.begin();
}



void looperZero() {
  imu.readAccel();

  Serial.print("A");
  Serial.println(imu.calcAccel(imu.ax), 2);
  //delay(10);
  Serial.print("B");
  Serial.println(imu.calcAccel(imu.ay), 2);
  //delay(10);

  Serial.print("C");
  Serial.println(imu.calcAccel(imu.az), 2);
  //delay(10);

//
//  imu.readGyro(); // Update gyroscope data
//  Serial.print("a");
//  Serial.println(imu.calcGyro(imu.gx)); // Print x-axis rotation in DPS
//  Serial.print("b");
//  Serial.println(imu.calcGyro(imu.gy)); // Print y-axis rotation in DPS
//  Serial.print("c");
//  Serial.println(imu.calcGyro(imu.gz)); // Print z-axis rotation in DPS

}

void looperOne() {
  imu.readAccel();

  Serial.print("D");
  Serial.println(imu.calcAccel(imu.ax), 2);
    //delay(10);

  Serial.print("E");
  Serial.println(imu.calcAccel(imu.ay), 2);
    //delay(10);

  Serial.print("F");
  Serial.println(imu.calcAccel(imu.az), 2);
    //delay(10);


//
//  imu.readGyro(); // Update gyroscope data
//  Serial.print("d");
//  Serial.println(imu.calcGyro(imu.gx)); // Print x-axis rotation in DPS
//  Serial.print("e");
//  Serial.println(imu.calcGyro(imu.gy)); // Print y-axis rotation in DPS
//  Serial.print("f");
//  Serial.println(imu.calcGyro(imu.gz)); // Print z-axis rotation in DPS
}

void looperTwo() {
  imu.readAccel();

  Serial.print("G");
  Serial.println(imu.calcAccel(imu.ax), 2);
  //delay(10);

  Serial.print("H");
  Serial.println(imu.calcAccel(imu.ay), 2);
  //delay(10);

  Serial.print("I");
  Serial.println(imu.calcAccel(imu.az), 2);
  //delay(10);


//  imu.readGyro(); // Update gyroscope data
//  Serial.print("g");
//  Serial.println(imu.calcGyro(imu.gx)); // Print x-axis rotation in DPS
//  Serial.print("h");
//  Serial.println(imu.calcGyro(imu.gy)); // Print y-axis rotation in DPS
//  Serial.print("i");
//  Serial.println(imu.calcGyro(imu.gz)); // Print z-axis rotation in DPS
//  
}

void looperThree() {
  imu.readAccel();

  Serial.print("J");
  Serial.println(imu.calcAccel(imu.ax), 2);
  //delay(10);

  Serial.print("K");
  Serial.println(imu.calcAccel(imu.ay), 2);
  //delay(10);

  Serial.print("L");
  Serial.println(imu.calcAccel(imu.az), 2);
    //delay(10);


//  imu.readGyro(); // Update gyroscope data
//  Serial.print("j");
//  Serial.println(imu.calcGyro(imu.gx)); // Print x-axis rotation in DPS
//  Serial.print("k");
//  Serial.println(imu.calcGyro(imu.gy)); // Print y-axis rotation in DPS
//  Serial.print("l");
//  Serial.println(imu.calcGyro(imu.gz)); // Print z-axis rotation in DPS
//  
}

void looperFour() {
  imu.readAccel();

  Serial.print("M");
  Serial.println(imu.calcAccel(imu.ax), 2);
    //delay(10);

  Serial.print("N");
  Serial.println(imu.calcAccel(imu.ay), 2);
  //delay(10);

  Serial.print("O");
  Serial.println(imu.calcAccel(imu.az), 2);
  //delay(10);

//
//    imu.readGyro(); // Update gyroscope data
//  Serial.print("m");
//  Serial.println(imu.calcGyro(imu.gx)); // Print x-axis rotation in DPS
//  Serial.print("n");
//  Serial.println(imu.calcGyro(imu.gy)); // Print y-axis rotation in DPS
//  Serial.print("o");
//  Serial.println(imu.calcGyro(imu.gz)); // Print z-axis rotation in DPS

}

void looperFive() {
  imu.readAccel();

  Serial.print("P");
  Serial.println(imu.calcAccel(imu.ax), 2);
  //delay(10);

  Serial.print("Q");
  Serial.println(imu.calcAccel(imu.ay), 2);
  //delay(10);

  Serial.print("R");
  Serial.println(imu.calcAccel(imu.az), 2);
  //delay(10);

//
//    imu.readGyro(); // Update gyroscope data
//  Serial.print("p");
//  Serial.println(imu.calcGyro(imu.gx)); // Print x-axis rotation in DPS
//  Serial.print("q");
//  Serial.println(imu.calcGyro(imu.gy)); // Print y-axis rotation in DPS
//  Serial.print("r");
//  Serial.println(imu.calcGyro(imu.gz)); // Print z-axis rotation in DPS

}

void looperSix() {
  imu.readAccel();

  Serial.print("S");
  Serial.println(imu.calcAccel(imu.ax), 2);
  //delay(10);

  Serial.print("T");
  Serial.println(imu.calcAccel(imu.ay), 2);
  //delay(10);

  Serial.print("U");
  Serial.println(imu.calcAccel(imu.az), 2);
  //delay(10);

//
//    imu.readGyro(); // Update gyroscope data
//  Serial.print("s");
//  Serial.println(imu.calcGyro(imu.gx)); // Print x-axis rotation in DPS
//  Serial.print("t");
//  Serial.println(imu.calcGyro(imu.gy)); // Print y-axis rotation in DPS
//  Serial.print("u");
//  Serial.println(imu.calcGyro(imu.gz)); // Print z-axis rotation in DPS

}

void looperSeven() {
  imu.readAccel();

  Serial.print("V");
  Serial.println(imu.calcAccel(imu.ax), 2);
  //delay(10);

  Serial.print("W");
  Serial.println(imu.calcAccel(imu.ay), 2);
  //delay(10);

  Serial.print("X");
  Serial.println(imu.calcAccel(imu.az), 2);
  //delay(10);

//
//    imu.readGyro(); // Update gyroscope data
//  Serial.print("v");
//  Serial.println(imu.calcGyro(imu.gx)); // Print x-axis rotation in DPS
//  Serial.print("w");
//  Serial.println(imu.calcGyro(imu.gy)); // Print y-axis rotation in DPS
//  Serial.print("x");
//  Serial.println(imu.calcGyro(imu.gz)); // Print z-axis rotation in DPS
  delay(50);
}

处理代码serialEvent:

void serialEvent(Serial port) { 
  String inData = port.readStringUntil('\n');
  inData = trim(inData);                 // cut off white space (carriage return)
  //println(inData);
  if (frameCount % 4 == 0) {

    if (inData.charAt(0) == 'S') {       //S
      inData = inData.substring(1);     
      rightHipX1 = float(inData);
    }
    if (inData.charAt(0) == 'T') {      //T
      inData = inData.substring(1);    
      rightHipY1 = float(inData);
    }
    if (inData.charAt(0) == 'U') {     
      inData = inData.substring(1);   //U
      rightHipZ1 = float(inData);
    }
    if (inData.charAt(0) == 'V') {       //V
      inData = inData.substring(1);     
      rightHipX2 = float(inData);
    }
    if (inData.charAt(0) == 'W') {       //W
      inData = inData.substring(1);     
      rightHipY2 = float(inData);
    }
    if (inData.charAt(0) == 'X') {        //X
      inData = inData.substring(1);      
      rightHipZ2 = float(inData);
    }
  }
  if (frameCount % 4 == 1)
  {
    if (inData.charAt(0) == 'M') {       
      inData = inData.substring(1);     
      rightLegX1 = float(inData);
    }
    if (inData.charAt(0) == 'N') {      
      inData = inData.substring(1);    
      rightLegY1 = float(inData);
    }
    if (inData.charAt(0) == 'O') {     
      inData = inData.substring(1);   
      rightLegZ1 = float(inData);
    }
    if (inData.charAt(0) == 'P') {       
      inData = inData.substring(1);     
      rightLegX2 = float(inData);
    }
    if (inData.charAt(0) == 'Q') {       
      inData = inData.substring(1);     
      rightLegY2 = float(inData);
    }
    if (inData.charAt(0) == 'R') {        
      inData = inData.substring(1);      
      rightLegZ2 = float(inData);
    }
  }
  if (frameCount % 4 == 2)
  {
    if (inData.charAt(0) == 'D') {       
      inData = inData.substring(1);     
      leftHipX1 = float(inData);
    }
    if (inData.charAt(0) == 'E') {      
      inData = inData.substring(1);    
      leftHipY1 = float(inData);
    }
    if (inData.charAt(0) == 'F') {     
      inData = inData.substring(1);   
      leftHipZ1 = float(inData);
    }
    if (inData.charAt(0) == 'A') {       
      inData = inData.substring(1);     
      leftHipX2 = float(inData);
    }
    if (inData.charAt(0) == 'B') {       
      inData = inData.substring(1);     
      leftHipY2 = float(inData);
    }
    if (inData.charAt(0) == 'C') {        
      inData = inData.substring(1);      
      leftHipZ2 = float(inData);
    }
  }
  if (frameCount % 4 == 3)
  {
    if (inData.charAt(0) == 'G') {       
      inData = inData.substring(1);     
      leftLegX1 = float(inData);
    }
    if (inData.charAt(0) == 'H') {      
      inData = inData.substring(1);    
      leftLegY1 = float(inData);
    }
    if (inData.charAt(0) == 'I') {     
      inData = inData.substring(1);   
      leftLegZ1 = float(inData);
    }
    if (inData.charAt(0) == 'J') {       
      inData = inData.substring(1);     
      leftLegX2 = float(inData);
    }
    if (inData.charAt(0) == 'K') {       
      inData = inData.substring(1);     
      leftLegY2 = float(inData);
    }
    if (inData.charAt(0) == 'L') {        
      inData = inData.substring(1);      
      leftLegZ2 = float(inData);
    }
  }
}

然后在导入数据之后,它就全部用于我的处理草图的视觉元素上的旋转。

【问题讨论】:

    标签: arduino processing accelerometer lag gyroscope


    【解决方案1】:

    您的多路复用器板的实际芯片是 TCA954A。 datasheet 表示最大频率为 400kHz。您的吞吐量将取决于 * 数据包大小(以位为单位)(读/写命令、地址和数据:每轴 2 个字节) * i2c 设备数量

    如果您进行计算,您可能会发现您无法充分发挥传感器的潜力。最重要的是,I2C 总线比 SPI 慢,因为有控制数据交换。最快的是带有 DMA 的 SPI 流。完整时钟仅用于数据,并直接写入 MCU 存储器(通常为阵列)。您可以在单个 SPI 总线上添加多个从机,您只需为每个从机提供一个用于芯片选择 (CS) 的引脚。有一个nice diagram on Wikipedia

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多