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

Я хочу, чтобы мой сервопривод 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с, пока сервопривод не достигнет позиции
  }

}

Но поведение сервопривода неправильное. Он перемещается на несколько градусов от исходного положения, а затем возвращается.

Что не так с логикой моего кода?

, 👍0

Обсуждение

удалите второй цикл for ... первый цикл уже делает то, что вы хотите, @jsotola


2 ответа


0

Я думаю, что сервопривод работает слишком медленно. Когда вы просите его развернуться на 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 секунд. По возможности уменьшите это время. Чтобы заставить сервопривод ждать не дольше, чем нужно, проверьте старое и новое положение сервопривода и ждите по мере необходимости, это, вероятно, достаточно линейно.

,

1

Логика мне кажется приемлемой. Но имейте в виду, что эти сервоприводы не работают хорошо на своих предельных значениях или близко к ним - мои имеют тенденцию дрожать там, но могут быть и другие проблемы. У меня есть 10 таких сервоприводов для хобби; у каждого есть своя полоса джиттера на концах пути. Возможно, вам удастся добиться большего успеха, развернув их на 10, 90 и 170 градусов.

,