当前位置: 首页 > 知识库问答 >
问题:

使用Arduino的数据处理草图是滞后的

周辰沛
2023-03-14

我使用的是陀螺仪/加速计传感器(https://www.sparkfun.com/products/13284)用Arduino来记录旋转。我总共使用了八个这样的传感器。我还使用多路复用器来帮助多个传感器(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);
}

处理代码序列事件:

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);
    }
  }
}

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

共有1个答案

岳俊晖
2023-03-14

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

如果你进行计算,你可能会发现你无法充分发挥传感器的潜力。最重要的是,I2C总线比SPI慢,因为有控制数据交换。最快的速度是使用DMA的SPI流。完整时钟仅用于数据,并直接写入MCU内存(通常为阵列)。你可以在一条SPI总线上加几个从机,你只需要为每个从机选择一个芯片引脚(CS)。维基百科上有一个很好的图表。

 类似资料:
  • 我已经成功地将Arduino草图连接到加工草图上,但我仍然无法确定如何让Arduino在加工过程中控制对象。 使用倾斜传感器,目的是当倾斜传感器以一种方式倾斜时,它将以这种方式移动对象进行处理,然后当它以另一种方式倾斜时,它将以另一种方式移动对象。 有人能帮忙吗? 这是我的Arduino代码: 这是我的处理代码:

  • 这是如何使用公共类frome的一个后续步骤。其他处理选项卡中的java文件?;使用来自的Usage类中的示例。java文件-有完整的文档吗?-处理2。x和3。x论坛,我有这个: /tmp/Sketch/Foo.java 这个例子运行得很好,但是如果我取消注释import peasy。组织 行,则编译失败: 当然,我确实在下安装了PeasyCam,如果我导入peasy.*它工作得很好 来自草图。 我

  • 我正在从事一个项目,该项目使用处理从文件中读取数据,然后使用串行将这些数据发送到arduino Uno板,然后将这些值提供给arduino braccio braccio。ServoMovement()函数,根据它们移动机械臂。然而,每当我运行代码时,我总是在函数中输入错误的值,并且手臂以一种奇怪的方式移动,我测试了相同的代码,并试图点亮一个led,但出于某种原因,它工作正常。 Arduino代码

  • 本研究基于以下环节。geomerative库文档可以从以下链接中看到。 有时错误发生在加载草图时。大多数情况下,它加载正常,但当你稍微拖动点时,它会抛出一个错误。错误代码有时是指曲线的控制点被鼠标位置更新的点,但是因为错误经常发生在草图加载的时候,我认为这不是一个与更新的位置有关的问题。 错误代码如下;

  • 我的Arduino代码: 我的处理代码: 我已经非常努力地去理解处理,但是我仍然不明白如何根据arduino发送的数据绘制图形。我认为我的问题主要是线部分。我不知道如何画一条连接上一个点和新点的线。 但总的来说,这个问题甚至不起作用......问题在哪里:(?

  • 我一直在尝试为我的Arduino串行数据创建一个示波器。在Arduino串行绘图仪中,我可以获得合适频率的良好波形,但当我尝试将数据发送到处理时,它无法接收来自Arduino的所有数据。有办法解决这个问题吗? 阿杜伊诺 加工 谢谢