Как переместить робота на определенное расстояние и при этом управлять датчиками?

У меня есть робот с обратной связью с энкодером, и я хочу использовать функции, которые перемещают робота на определенное расстояние и поворачивают его на определенный угол, например:

void loop(){

  if (Obstacle==false){  // if no obstacles

      forward(1000);  // move forward 1000 mm
      backward(1000); // move backward 1000 mm

      //...  
  }
}

Вперед функция:

void forward(int distance){  // distance in mm

   int desiredRotationNumber= round(distance/circumference) ; 

   int desiredTicks = encoderResolution * desiredRotationNumber;

   if (counter < desiredTicks) // variable counter counts the pulses from the encoder
   {  
       analogWrite(motor,255);
   } 
   else 
   {
       analogWrite (motor,0); 
   }

}

Проблема в том, что если я использую условие "если", моя функция вперед будет выполняться только один раз, а затем программа переходит к следующей функции, но если я использую "цикл цикла", мои функции перемещения будут выполняться правильно, но я не буду в состоянии управлять датчиками или что-нибудь.

1 ответ

Решение

То, что вы, вероятно, хотите, чтобы сократить ваши шаги с шагом, и проверить датчики между каждым из этих шагов:

while (distance > 0 && !Obstacle){
    forward(step);
    distance-=step;
    check_sensors();
}

Благодаря многопоточности вы можете заставить эти операции (перемещение и распознавание) работать асинхронно и использовать какую-то публикацию событий, чтобы предупредить каждый поток об изменении. Здесь мы моделируем эту функциональность, переплетая задачи (вы также можете найти сопрограммы для аналогичной, но гораздо более эффективной идеи).

Другие вопросы по тегам