2017-03-15 1 views
0

私は回転を記録するためにArduinoを使ってジャイロスコープ/加速度センサー(https://www.sparkfun.com/products/13284)を使用しています。私はこれらのセンサーの合計8つを使用しています。また、複数のセンサー(https://learn.adafruit.com/adafruit-tca9548a-1-to-8-i2c-multiplexer-breakout/overview)を支援するマルチプレクサも使用しています。私のArduinoがデータを受け取った後、私はすべての回転センサーの2D画像を作成するために処理中にこのデータを使用しています。Arduinoのデータを使用したスケッチの処理が遅れている

私は現在、重要な遅れ(回転のアニメーションが停止した後、複数回再起動)の問題に遭遇しています。私は処理を実行しているコンピュータにArduino(センサ付き)からのデータを送信するためのビジュアルインターフェイスとシリアル通信の処理を使用しています。

現在、私のコードはセンサーを読み取り、後で処理コードによって解析される文字プレフィックスを持つ値を送信します。たとえば、「センサのx1値」を読み取ると、「S」に続いて関連するx1値が送信されます。処理側では、最初に「S」が存在するかどうかを調べ、そうであれば、アニメーションの表示に適した変数に次の値を読み込みます。

Arduinoコード(.inoファイル)とProcessingスケッチ(.pdeファイル)が添付されています。データの処理を高速化するために、アニメーションの各フレームのデータの4分の1を読み込もうとしました。したがって、データがArduinoから送信されるたびに実行される "serialEvent"メソッドでは、 "if(frameCount%4 == 0){データの第1四半期を読み込みます}"、if(frameCount%4 == 1){データの第2四半期を読んでください} "など。これはうまくいかなかったが、あなたは以下のコードでそれを見ることができる。

何かが助けます!

ARDUINO CODE:

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

は、その後、データをインポートした後、それはすべて私の処理スケッチの視覚的要素に回転するために使用して、その後です。

答えて

1

マルチプレクサボードの実際のチップはTCA954Aです。 datasheetには、最大周波数が400kHzと記載されています。あなたは計算を行う場合、あなたはおそらくあなたがわかります * I2Cデバイス

の数を:あなたのスループットは、ビット単位のパケットサイズに(1軸あたり2バイト、/アドレスとデータを書き込みコマンドを読む)* に依存しますセンサーの潜在能力を最大限に引き出すことはできません。さらに、I2Cバスは、制御データが交換されるため、SPIよりも低速です。あなたが行くことができる最速のものは、DMAを備えたSPIストリームです。フルクロックはデータ専用に使用され、MCUメモリ(通常はアレイ)に直接書き込まれます。 1つのSPIバスに複数のスレーブを追加することができます。すべてのスレーブにチップセレクト(CS)ピンが必要です。 nice diagram on Wikipediaがあります。

関連する問題