【发布时间】: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