0
votes

I have a strange problem, I have Arduino UNO/MEGA and I need to get Gyro sensors's data and I want to see the data in the serial monitor. Seems like a simple task, I wrote a simple C program which collects data from Arduino through serial monitor I can see the data. Everything is working for few minutes and after that, it stops.

This code is supposed to calculate a distance travelled in a line using encoder (PID algorithm implemented using Gyroscope data for straight motion) after reaching desired position, machine takes a U-Turn.

It stop for a second after taking the U-Turn and then starts straight motion again. The problem I'm facing is that the gyroscope readings stop randomly while machine taking the turn. Due to this, the machine keeps rotating about that point without stopping.

#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;
}

The serial monitor just stops displaying the reading. This does not happen every time, and it is very random. I want to get proper and continuous data. Is it a logical problem or a board problem?

1
This is really too broad to speculate about. Where's the program counter at in your debugger when the bug strikes? Is reset line stable or did the MCU reset?Lundin
It is resetting randomly. The first time it is working fine, second time same code not working. Then continuously not working. I have tried MCU reset also. No changes.uvan
So it is either a crash or the watchdog. Again, where is your debugger at when the crash occurs?Lundin
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));} It is stopping here, after that no data printing, but it is inside the loop. First time it was working fine, the randomly stopping (100 t0 150 values stopping approximately)uvan

1 Answers

0
votes

Normally a random crash would indicate possibly unhandled interrupts or memory overwrite, but looking at your code and it being an Arduino program, it's unlikely to be either. I don't see any divide ops either, so you are not dividing by zero. The two possible things I see is that a) you have a "while (true)" without exit, so surely that could get you into trouble, and b) perhaps your delay functions are called with a very large value unexpectedly, and the MCU is actually just delaying a long time.