Сервоприводы: attach() и write()

Я новичок в Arduino, поэтому вопрос может показаться слишком простым. Я пытаюсь запустить сервопривод непрерывного вращения с эффектом параллакса на Arduino Uno. Из справочника я узнал, что сервопривод нужно «присоединить» к одному из цифровых выводов с поддержкой ШИМ, а скорость сервопривода можно контролировать командой write(0~180, 90=stop).

Но мне сложно понять роль цифрового вывода ШИМ. Если скорость и направление вращения сервопривода определяются функцией write(), то какова роль attach(pin#)?

Заранее спасибо!

, 👍0


3 ответа


1

attach сообщает библиотеке сервоприводов, на какой контакт следует производить запись. Эта информация хранится где-то в оперативной памяти, и write находит ее и связывается с правильным контактом.

Возможно, вы используете другие выводы с поддержкой ШИМ для других целей, и если библиотека вдруг станет этому мешать, то это нехорошо.

,

-1

Во-первых, вам не нужно подключать его к одному из контактов ШИМ. Любой цифровой выходной контакт подойдёт.

Судя по справочнику Arduino, присоединение сервопривода к выводу похоже на объявление переменной. Используя myservo.attach(pin), вы также присваиваете сервоприводу имя (в данном случае myservo), а также можете задать максимальное и минимальное значения угла поворота сервопривода, добавив два дополнительных значения в конец: myservo.attach(pin, min, max)

Когда вы затем используете функцию myservo.write(), Arduino «запомнит», к какому контакту подключен myservo, а также его максимальные/минимальные настройки.

,

Сервоприводам необходим ШИМ на линии управления, они сравнивают значение рабочего цикла с внутренним потенциометром и применяют крутящий момент для исправления любого несоответствия., @ratchet freak

@ratchetfreak Да, но я имел в виду, что не обязательно использовать один из контактов с надписью ШИМ. На Arduino Uno контакты 3, 5, 6, 9, 10 и 11 — это контакты ШИМ, но вам не обязательно использовать один из них., @David Holmén


0

Если вы не используете библиотеку Servo и вместо этого подключаете сигнальный провод сервопривода к контакту, назначьте этот контакт выходным и установите на нём низкий уровень. Затем установите на контакте высокий уровень на заданное количество микросекунд, и сервопривод переместится в нужное положение. После этого на контакте устанавливается низкий уровень, и он должен оставаться низким в течение 20 миллисекунд (сервоприводы работают при частоте 50 Гц, то есть один импульс каждые 20 мс).

    #define servopin 9
    t=1000;
    int step=10;
    Setup() {
    pinmode(servopin,OUTPUT);
    digitalWrite(servopin,LOW);
    }
    loop() {   

     while (t<2001) {
       digitalWrite(servopin,HIGH);  // с задержкой отправляет синхронизированный импульс
       delayMicroseconds(t);
       digitalWrite(servopin,LOW);
       t+=step;
       delay(19);  // до следующего импульса
     }
     while (t> 999) {
       digitalWrite(servopin,HIGH);
       delayMicroseconds(t);
       t-=step;  
       delay(19);
     }
    }

Это заставит сервопривод непрерывно отклоняться на 90 градусов назад. Изменение шага изменит требуемое время, уменьшите его до 1, и выполнение займет гораздо больше времени. Точное назначение функции Attach неясно, но она регистрирует переменную и связывает её с таймером и используемым пином. В приведённом выше коде используются встроенные таймеры Millis и Micros. Микросекунду было бы сложно разблокировать, не влияя на синхронизацию. Задержку выключения можно сделать разблокирующей, например, чтобы два сервопривода работали как будто вместе.

Дон

,