一段时间后停止从arduino获取值

时间:2019-05-23 14:54:35

标签: arduino serial-port embedded encode gyroscope

我有一个奇怪的问题,我有Arduino UNO / MEGA,我需要获取陀螺仪传感器的数据,我想在串行监视器中查看数据。似乎是一个简单的任务,我编写了一个简单的C程序,它可以通过串行监视器从Arduino收集数据,我可以看到这些数据。一切都工作了几分钟,然后停了下来。

该代码用于计算到达所需位置后机器使用U型转弯时使用编码器(使用陀螺仪数据实现直线运动的PID算法实现)在一条直线上的行进距离。

在掉头后停下来一秒钟,然后再次开始直线运动。我面临的问题是,机器转弯时,陀螺仪的读数会随机停止。因此,机器会一直围绕该点旋转而不会停止。

#include <Wire.h>
#include <MPU6050.h>
MPU6050 mpu;
float timeStep = 0.01, yaw=0;
const int motor11=6;//LEFT MOTOR FW
const int motor12=7;//LEFT MOTOR BK
const int motor1pwm=3;
const int motor21=8;//RIGHT MOTOR FW
const int motor22=9;//RIGHT MOTOR BK
const int motor2pwm=5;

int flag1 = 0;

int thres1=120;//PWM Values
int thres2=120;
void setup() 
{
    Serial.begin(115200);
    // Initialize MPU6050  
    while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
    {
      Serial.println("Could not find a valid MPU6050 sensor, check wiring!");
      delay(500);
    }
    mpu.calibrateGyro();
    mpu.setThreshold(1);  
    pinMode(motor11, OUTPUT);
    pinMode(motor12, OUTPUT);    
    pinMode(motor1pwm, OUTPUT);
    pinMode(motor21, OUTPUT);
    pinMode(motor22, OUTPUT);
    pinMode(motor2pwm, OUTPUT);
}

void loop()
{
  Vector norm=mpu.readNormalizeGyro();
  yaw=yaw+norm.ZAxis*timeStep;

  if(flag1 == 0){
  straight();
  }

  if(flag1 == 2){
  taketurn();
  }
}

void straight()
{
  digitalWrite(motor11, HIGH);
  digitalWrite(motor12, LOW);
  analogWrite(motor1pwm, thres1);   
  digitalWrite(motor21, HIGH);
  digitalWrite(motor22, LOW);
  analogWrite(motor2pwm, thres2); 
  delay(8000);    
  flag1 = 2;
}

void taketurn()
{
    float setPoint = yaw - 500; 
       digitalWrite(motor11, HIGH);
       digitalWrite(motor12, LOW);
       analogWrite(motor1pwm, 120);   
       digitalWrite(motor21, LOW);
       digitalWrite(motor22, LOW);
       analogWrite(motor2pwm, 120);

   while(true)
   {
       Vector norm = mpu.readNormalizeGyro();
       yaw = yaw + norm.ZAxis * timeStep;
       Serial.print("Turning Yaw= ");
       Serial.println(yaw);

    if(setPoint >= yaw)  {
    digitalWrite(motor11, LOW);
    digitalWrite(motor12, LOW);
    analogWrite(motor1pwm, thres2);   
    digitalWrite(motor21, LOW);
    digitalWrite(motor22, LOW);
    analogWrite(motor2pwm, thres1);      
    delay(2000);
    break;
    }
  }
      flag1 = 0;
}

串行监视器仅停止显示读数。这并非每次都发生,并且是非常随机的。我想获取正确且连续的数据。是逻辑问题还是董事会问题?

1 个答案:

答案 0 :(得分:0)

通常情况下,随机崩溃会表明可能未处理的中断或内存被覆盖,但是查看您的代码并将其作为Arduino程序,则不太可能。我也看不到任何除法运算,因此您未除以零。我看到的两种可能的情况是:a)您有一个“ while(true)”而没有退出,因此肯定会惹上您的麻烦; b)也许您的延迟函数被意外地以非常大的值调用,并且MCU实际上只是延迟了很长时间。