Программа останавливается после начала цикла

Я пытаюсь переместить свои сервоприводы в соответствии с данными из моего гироскопа. К сожалению, моя программа останавливается после начала цикла 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);
}

1 ответ

Решение

Внутри цикла while нет команд, которые могли бы изменить значение gyroX. Так что, как только вы внутри, это становится бесконечной петлей. Вам нужно вызвать функцию recordGyroRegisters внутри цикла while, чтобы переменная обновлялась во время нее. Или вы можете воспользоваться тем фактом, что функция цикла уже выполняется в цикле, и просто избавиться от цикла for и выбрать что-то на основе оператора if.

Другие вопросы по тегам