Как остановить программу во время вращения сервопривода

Если я напишу так:

motor.write(0);
Serial.println("Before");
motor.write(180);
Serial.println("After");

И "До", и "После" распечатываются мгновенно, пока мотор еще вращается.
Я хочу, чтобы «После» или любой другой оператор выполнялся ПОСЛЕ двигателя достигает 180 градусов.
Как я могу реализовать это? Можно ли прочитать заявление Серво?

Кстати, я не хочу ставить задержку после write(), так что это другая стратегия.

, 👍0

Обсуждение

Хобби-сервоприводы не обеспечивают обратную связь: вы не можете знать, когда они достигли своего целевого положения., @Edgar Bonet


2 ответа


Лучший ответ:

1

Как это реализовать? Можно ли прочитать заявление Серво?

Нет, это невозможно. Когда вы выполняете servo.write(), он просто изменяет рабочий цикл ШИМ. Затем сервопривод должен использовать это для установки своего положения. Arduino вообще не имеет представления о текущем положении сервопривода.

Кстати, я не хочу ставить задержку после write(), так что это другая стратегия.

Единственный другой способ, помимо задержки или иного использования millis() для ожидания предопределенного периода после записи, заключается в реализации некоторой формы обратной связи между валом сервопривода и Arduino. Возможно, потенциометр или поворотный энкодер подойдет.

,

Ну, я только что сорвал поворотный энкодер со своей старой мыши., @Ultim8_Clock

Это была отличная идея, большое спасибо. Можете ли вы порекомендовать мне хорошую библиотеку Arduino для использования с поворотным энкодером?, @Ultim8_Clock


1

Это невозможно только с сервоприводом, но вы можете добавить отзыв. Некоторые варианты:

  • Кодер (может быть дорогим или недоступным для вашего сервопривода) сообщит вам положение.
  • Вы также можете сделать свой собственный энкодер, подключив потенциометр к оси. Сопротивление горшка будет связано с положением сервопривода.
  • если вам не нужно быть точным, что-то простое, например, переключение на пределе, которого вы хотите достичь.
  • Если позиция не обязательно должна быть достигнута, вы можно измерить среднее время, необходимое (под нагрузкой) для перехода от минимальный угол к максимальному углу. Это будет самое длинное, что когда-либо занимает двигаться. Затем в вашем коде подождите 150% этого времени, прежде чем продолжается (чтобы дать немного буфера "на всякий случай").

Как сказал Маженко, если вы не хотите использовать задержку, используйте millis() или micros() для отслеживания текущего и предыдущего времени выполнения строки в цикле; если разница больше, чем требуемая задержка, время истекло, и вы можете продолжить оставшуюся часть цикла. Таким образом, вы можете отслеживать время без необходимости «блокировать» оставшуюся часть цикла во время ожидания.

,