2017-10-05 26 views
0

私のジャイロのデータに従ってサーボを移動しようとしています。残念ながら、私のプログラムはwhileループの開始後に停止します。例えば、私のコードでは、gyroXの値が3000に達すると、シリアルモニタは私にジャイロデータを与えなくなり、サーボは動作しません。どのようにこの問題を解決するための任意の提案をいただければ幸いです。ループの開始後にプログラムが終了する

#include <Wire.h> 
#include <Servo.h> 

Servo servo; 

long accelX, accelY, accelZ; 
float gForceX, gForceY, gForceZ; 

long gyroX, gyroY, gyroZ; 
float rotX, rotY, rotZ; 

int pos1 = 90; 

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


void loop() { 
    recordAccelRegisters(); 
    recordGyroRegisters(); 
    printData(); 
    while(gyroX > 3000){ //problem happens here 
    pos1 += 5; 
    servo.write(pos1); 
    } 
} 

void setupMPU(){ 
    Wire.beginTransmission(0b1101000); 
    Wire.write(0x6B); 
    Wire.write(0b00000000); 
    Wire.endTransmission(); 
    Wire.beginTransmission(0b1101000); 
    Wire.write(0x1B); 
    Wire.write(0x00000000); 
    Wire.endTransmission(); 
    Wire.beginTransmission(0b1101000); 
    Wire.write(0x1C); 
    Wire.write(0b00000000); 
    Wire.endTransmission(); 
} 

void recordGyroRegisters() { 
    Wire.beginTransmission(0b1101000); 
    Wire.write(0x3B); 
    Wire.endTransmission(); 
    Wire.requestFrom(0b1101000,6); 
    while(Wire.available() < 6); 
    gyroX = Wire.read()<<8|Wire.read(); 
    gyroY = Wire.read()<<8|Wire.read(); 
    gyroZ = Wire.read()<<8|Wire.read(); 
} 

void recordAccelRegisters() { 
    Wire.beginTransmission(0b1101000); 
    Wire.write(0x43); 
    Wire.endTransmission(); 
    Wire.requestFrom(0b1101000,6); 
    while(Wire.available() < 6); 
    accelX = Wire.read()<<8|Wire.read(); 
    accelY = Wire.read()<<8|Wire.read(); 
    accelZ = Wire.read()<<8|Wire.read(); 
} 

void printData() { 
    Serial.print("Gyro (deg)"); 
    Serial.print(" X="); 
    Serial.print(gyroX); 
    Serial.print(" Y="); 
    Serial.print(gyroY); 
    Serial.print(" Z="); 
    Serial.print(gyroZ); 
    Serial.print(" Accel (g)"); 
    Serial.print(" X="); 
    Serial.print(accelX); 
    Serial.print(" Y="); 
    Serial.print(accelY); 
    Serial.print(" Z="); 
    Serial.println(accelZ); 
} 

答えて

3

whileループの中に、gyroXの値を変更するコマンドはありません。だからあなたが内部にいれば、それは無限ループになります。 whileループの中でrecordGyroRegisters関数を呼び出して、その間に変数が更新されるようにする必要があります。あるいは、ループ関数がすでにループしていることを利用して、単純にforループを取り除き、if文に基づいて何かを選択することもできます。

+0

恐ろしい!それが私の問題を解決しました!私はあなたにそれを簡単に説明していただきありがとうございます。お手伝いありがとう。 –

関連する問題