У меня есть робот с обратной связью с энкодером, и я хочу использовать функции, которые перемещают робота на определенное расстояние и поворачивают его на определенный угол, например:
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);
}
}
Проблема в том, что если я использую условие «если», моя функция вперед будет выполняться только один раз, а затем программа переходит к следующей функции, но если я использую «цикл цикла», мои функции перемещения будут выполняться правильно, но я не буду в состоянии управлять датчиками или что-нибудь.
Что вы, вероятно, хотите, чтобы сократить ваши шаги с шагом, и проверить датчики между каждым из этих шагов:
while (distance > 0 && !Obstacle){
forward(step);
distance-=step;
check_sensors();
}
Благодаря многопоточности вы можете заставить эти операции (перемещение и распознавание) работать асинхронно и использовать какую-то публикацию событий, чтобы предупредить каждый поток об изменении. Здесь мы моделируем эту функциональность, переплетая задачи (вы также можете найти сопрограммы для аналогичной, но гораздо более эффективной идеи).