Прекратите получать значения от Arduino через некоторое время - PullRequest
0 голосов
/ 23 мая 2019

У меня странная проблема, у меня есть Arduino UNO / MEGA, и мне нужно получить данные гироскопических датчиков, и я хочу видеть данные в последовательном мониторе. Похоже на простую задачу, я написал простую программу на C, которая собирает данные из Arduino через последовательный монитор, который я вижу. Все работает несколько минут и после этого останавливается.

Предполагается, что этот код рассчитывает расстояние, пройденное по линии, с использованием кодера (алгоритм ПИД-регулятора, реализованный с использованием данных гироскопа для движения по прямой), после достижения желаемого положения машина совершает разворот.

Он останавливается на секунду после разворота, а затем снова начинает движение прямо. Проблема, с которой я сталкиваюсь, заключается в том, что показания гироскопа останавливаются случайно, когда машина поворачивается. Благодаря этому машина продолжает вращаться вокруг этой точки без остановки.

#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 голосов
/ 23 мая 2019

Обычно случайный сбой может указывать на необработанные прерывания или перезапись памяти, но, глядя на ваш код и на то, что это программа Arduino, вряд ли это будет так.Я также не вижу операций деления, поэтому вы не делите на ноль.Я вижу две возможные вещи: а) у вас есть «while (true)» без выхода, так что это наверняка может привести к неприятностям, и б) возможно, ваши функции задержки вызываются с очень большим значением неожиданно, и MCUна самом деле просто задерживается на долгое время.

...