Как переместить сервопривод между тремя положениями
Я хочу, чтобы мой сервопривод Tower Pro 9g стартовал с pos=0, подождал 1 секунду, затем достиг pos=90, подождал 1 секунду, затем достиг pos=180 и подождал 1 секунду. Теперь он возвращается к pos=0 и повторяет этот цикл. Для этой цели я написал следующий код:
#include <Servo.h>
Servo myservo; // создаем сервообъект для управления сервоприводом
// на большинстве плат можно создать двенадцать сервообъектов
int pos = 0; // переменная для хранения положения сервопривода
void setup() {
myservo.attach(12); // присоединяем сервопривод к контакту 9 к объекту сервопривода
}
void loop() {
for (pos = 0; pos <= 180; pos += 90) { // изменяется от 0 до 180 градусов
// с шагом 90 градусов
myservo.write(pos); // сообщаем сервоприводу перейти в позицию в переменной 'pos'
delay(1000); // ждем 1с, пока сервопривод не достигнет позиции
}
for (pos = 180; pos >= 0; pos -= 90) { // переход от 180 градусов к 0 градусам
myservo.write(pos); // сообщаем сервоприводу перейти в позицию в переменной 'pos'
delay(1000); // ждем 1с, пока сервопривод не достигнет позиции
}
}
Но поведение сервопривода неправильное. Он перемещается на несколько градусов от исходного положения, а затем возвращается.
Что не так с логикой моего кода?
@gpuguy, 👍0
Обсуждение2 ответа
Я думаю, что сервопривод работает слишком медленно. Когда вы просите его развернуться на 90 градусов, он запускается, затем через одну секунду (хотя он может достигать 5 градусов) вы просите его развернуться на 180 градусов, он, вероятно, достигает 10 градусов. Там он снова ждет одну секунду.
Затем вы просите его вернуться к 0 (что он и делает за те же 2 секунды, что и при перемещении с 0 на 10 градусов).
Попробуйте настроить время задержки или используйте более быстрый сервопривод.
Также обратите внимание, что в вашем примере (если вы хотите, чтобы он вел себя как закодированный), он будет заканчиваться 2 секундами при 0 и 180 градусах и 1 секундой при 90 градусах).
Попробуйте:
void move_servo(int pos)
{
myservo.write(pos);
delay(30000);
}
void loop()
{
move_servo( 0);
move_servo( 90);
move_servo(180);
move_servo( 90);
}
Между каждым шагом будет ждать 30 секунд. По возможности уменьшите это время. Чтобы заставить сервопривод ждать не дольше, чем нужно, проверьте старое и новое положение сервопривода и ждите по мере необходимости, это, вероятно, достаточно линейно.
Логика мне кажется приемлемой. Но имейте в виду, что эти сервоприводы не работают хорошо на своих предельных значениях или близко к ним - мои имеют тенденцию дрожать там, но могут быть и другие проблемы. У меня есть 10 таких сервоприводов для хобби; у каждого есть своя полоса джиттера на концах пути. Возможно, вам удастся добиться большего успеха, развернув их на 10, 90 и 170 градусов.
- Как заставить сервопривод вращаться на угол больше 180°
- Подключение Arduino к сервоприводу с внешним источником питания
- Мой сервопривод не работает плавно
- Бесполезная проводка коробки и код
- Почему сервопривод не перемещается по углам должным образом
- Микро сервопривод не работает с Arduino UNO
- поворот позиционного серводвигателя более чем на 180 градусов
- Почему loop() останавливается?
удалите второй цикл for ... первый цикл уже делает то, что вы хотите, @jsotola