【发布时间】: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)<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