【问题标题】:Stop getting values from arduino after some time一段时间后停止从 arduino 获取值
【发布时间】:2019-05-23 14:54:35
【问题描述】:

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

此代码应该在到达所需位置后使用编码器(使用陀螺仪数据实现直线运动的 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;
}

串行监视器停止显示读数。这不是每次都发生,而且非常随机。我想获得正确和连续的数据。是逻辑问题还是板子问题?

【问题讨论】:

  • 这实在是太宽泛了,无法推测。当错误发生时,调试器中的程序计数器在哪里?复位线稳定还是MCU复位?
  • 随机重置。第一次工作正常,第二次相同的代码不起作用。然后一直不工作。我也试过MCU复位。没有变化。
  • 所以要么是崩溃,要么是看门狗。同样,当崩溃发生时,您的调试器在哪里?
  • else if((y+1)%2==0) { while(abs(yaw)-abs(setPoint)&lt;50) { timera=millis(); Vector norm = mpu.readNormalizeGyro(); yaw = yaw + norm.ZAxis * timeStep; Serial.print("Turning Yaw= "); Serial.println(yaw); turn(); delay((timeStep*2000) - (millis() - timera));} 它在这里停止,之后没有数据打印,但它在循环内。第一次工作正常,随机停止(大约停止 100 t0 150 个值)

标签: arduino serial-port embedded encode gyroscope


【解决方案1】:

通常情况下,随机崩溃表明可能存在未处理的中断或内存覆盖,但查看您的代码并且它是一个 Arduino 程序,这两者都不太可能。我也没有看到任何除法操作,因此您没有除以零。我看到的两件可能的事情是a)你有一个没有退出的“while(true)”,所以这肯定会给你带来麻烦,b)也许你的延迟函数被意外调用了一个非常大的值,并且MCU实际上只是拖延了很长时间。

【讨论】:

  • a) 你有一个没有退出的“while (true)”,所以这肯定会给你带来麻烦,我已经用一个简单的 U 形转弯和停止检查了这个案例,它工作得很好次。
  • @uvan,我不明白你程序的整个逻辑,但是 while (true) 意味着一旦进入循环,它就永远不会退出。所以它将继续执行该循环。那是你真正想要的吗?
  • 我同意你的观点。是的,while(true) 表示一旦进入循环,就永远不会退出。故意我没有打破,因为我想检查数据。这里的实际问题是什么,进入循环内部后,它开始掉头,然后Serial.println(yaw);停止打印数据。如果我没有得到数据,那我怎么能创造一个条件来打破循环?
  • 我已经更新了代码,非常简单的代码我在完成第二轮陀螺仪值停止后尝试过。下面给出的输出Turning Yaw= -1100.31 Turning Yaw= -1100.36 Turning Yaw= -1100.38 Turning Yaw= -1100.40 Turning Yaw= -1100.47 Turning Yaw= -1100.51 Turning Yaw= -1100.53 Turning Yaw= -1100.57 Turning Yaw= -1100.61 Turning Yaw= -1100.62 Turning Yaw= -1100.63 Turning Yaw= -1100.65 Turning Yaw= -1100.73 Turning Yaw= -1100.74 Turning Y
  • 嗨@uvan,我不明白你的整个程序。只要你的逻辑对你没问题,那就没问题。在您的情况下,一旦 loop() 执行您的永远循环,它将留在那里并且不会接受更多输入。很难进一步评论这一点,因为你现在已经完全改变了你的程序。
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 2013-03-03
  • 1970-01-01
相关资源
最近更新 更多