Как остановить программу во время вращения сервопривода
Если я напишу так:
motor.write(0);
Serial.println("Before");
motor.write(180);
Serial.println("After");
И "До", и "После" распечатываются мгновенно, пока мотор еще вращается.
Я хочу, чтобы «После» или любой другой оператор выполнялся ПОСЛЕ двигателя
достигает 180 градусов.
Как я могу реализовать это? Можно ли прочитать заявление Серво?
Кстати, я не хочу ставить задержку после write(), так что это другая стратегия.
@Ultim8_Clock, 👍0
Обсуждение2 ответа
Лучший ответ:
Как это реализовать? Можно ли прочитать заявление Серво?
Нет, это невозможно. Когда вы выполняете servo.write()
, он просто изменяет рабочий цикл ШИМ. Затем сервопривод должен использовать это для установки своего положения. Arduino вообще не имеет представления о текущем положении сервопривода.
Кстати, я не хочу ставить задержку после write(), так что это другая стратегия.
Единственный другой способ, помимо задержки или иного использования millis()
для ожидания предопределенного периода после записи
, заключается в реализации некоторой формы обратной связи между валом сервопривода и Arduino. Возможно, потенциометр или поворотный энкодер подойдет.
Ну, я только что сорвал поворотный энкодер со своей старой мыши., @Ultim8_Clock
Это была отличная идея, большое спасибо. Можете ли вы порекомендовать мне хорошую библиотеку Arduino для использования с поворотным энкодером?, @Ultim8_Clock
Это невозможно только с сервоприводом, но вы можете добавить отзыв. Некоторые варианты:
- Кодер (может быть дорогим или недоступным для вашего сервопривода) сообщит вам положение.
- Вы также можете сделать свой собственный энкодер, подключив потенциометр к оси. Сопротивление горшка будет связано с положением сервопривода.
- если вам не нужно быть точным, что-то простое, например, переключение на пределе, которого вы хотите достичь.
- Если позиция не обязательно должна быть достигнута, вы можно измерить среднее время, необходимое (под нагрузкой) для перехода от минимальный угол к максимальному углу. Это будет самое длинное, что когда-либо занимает двигаться. Затем в вашем коде подождите 150% этого времени, прежде чем продолжается (чтобы дать немного буфера "на всякий случай").
Как сказал Маженко, если вы не хотите использовать задержку, используйте millis() или micros() для отслеживания текущего и предыдущего времени выполнения строки в цикле; если разница больше, чем требуемая задержка, время истекло, и вы можете продолжить оставшуюся часть цикла. Таким образом, вы можете отслеживать время без необходимости «блокировать» оставшуюся часть цикла во время ожидания.
- Как заставить сервопривод вращаться на угол больше 180°
- 6 + 1 двигательей подключенных к arduino uno?
- Почему сервопривод вращается на 360 градусов?
- Как Arduino Uno может поддерживать до 12 сервоприводов, если у него всего 6 цифровых выводов ШИМ?
- Контакты ШИМ серводвигателей, Arduino Uno
- Как запитать 6 серводвигателей от батареи для создания робота-манипулятора?
- Как повторить код
- Серво не двигается
Хобби-сервоприводы не обеспечивают обратную связь: вы не можете знать, когда они достигли своего целевого положения., @Edgar Bonet