Arduino 程序在while循环开始后停止

Arduino 程序在while循环开始后停止,arduino,gyroscope,servo,mpu6050,Arduino,Gyroscope,Servo,Mpu6050,我正试图根据陀螺仪的数据移动伺服装置。不幸的是,我的程序在while循环开始后停止。例如,在我的代码中,一旦gyroX值达到3000,串行监视器将停止向我提供gyro数据,并且伺服不会运行。如有任何关于如何解决此问题的建议,将不胜感激 #include <Wire.h> #include <Servo.h> Servo servo; long accelX, accelY, accelZ; float gForceX, gForceY, gForceZ; long

我正试图根据陀螺仪的数据移动伺服装置。不幸的是,我的程序在while循环开始后停止。例如,在我的代码中,一旦gyroX值达到3000,串行监视器将停止向我提供gyro数据,并且伺服不会运行。如有任何关于如何解决此问题的建议,将不胜感激

#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);
}
#包括
#包括
伺服;
长加速,加速,加速;
浮动gForceX、gForceY、gForceZ;
长陀螺X、陀螺Y、陀螺Z;
浮动rotX、rotY、rotZ;
int pos1=90;
无效设置(){
Serial.begin(9600);
Wire.begin();
setupMPU();
}
void循环(){
记录加速寄存器();
记录寄存器();
printData();
当(gyroX>3000){//问题发生在这里
pos1+=5;
伺服写入(pos1);
} 
}
void setupMPU(){
导线开始传输(0b1101000);
线写入(0x6B);
连线写入(0b00000000);
导线端传动();
导线开始传输(0b1101000);
线写入(0x1B);
连线写入(0x00000000);
导线端传动();
导线开始传输(0b1101000);
线写入(0x1C);
连线写入(0b00000000);
导线端传动();
}
无效记录寄存器(){
导线开始传输(0b1101000);
线写入(0x3B);
导线端传动();
请求自(0b1101000,6)的电线;
while(Wire.available()<6);

gyroX=Wire.read()在while循环中,没有任何命令可以更改gyroX的值。因此,一旦进入该循环,它将成为一个无限循环。您需要在while循环中调用recordGyroRegisters函数,以便在该循环中更新变量。或者,您可以利用循环函数已经在循环和简化的事实y去掉for循环,选择基于if语句的内容。

在while循环中,没有可以更改gyroX值的命令。因此,一旦进入该循环,它就变成了一个无限循环。您需要在while循环中调用recordGyroRegisters函数,以便在该循环中更新变量。或者y你可以利用循环函数已经在循环的事实,简单地摆脱for循环,选择基于if语句的内容。

太棒了!这解决了我的问题!我感谢你用简单的术语解释它。谢谢你的帮助。太棒了!这解决了我的问题!我感谢你用simp解释它谢谢你的帮助。