Как остановить программу во время вращения сервопривода
Если я напишу так:
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?
- Управление двигателями и сервоприводами с помощью L298N
- Почему сервопривод вращается на 360 градусов?
- Как Arduino Uno может поддерживать до 12 сервоприводов, если у него всего 6 цифровых выводов ШИМ?
- Контакты ШИМ серводвигателей, Arduino Uno
- Как запитать 6 серводвигателей от батареи для создания робота-манипулятора?
- Как повторить код
Хобби-сервоприводы не обеспечивают обратную связь: вы не можете знать, когда они достигли своего целевого положения., @Edgar Bonet