Сервоприводы: attach() и write()
Я новичок в Arduino, поэтому вопрос может показаться слишком простым. Я пытаюсь запустить сервопривод непрерывного вращения с эффектом параллакса на Arduino Uno. Из справочника я узнал, что сервопривод нужно «присоединить» к одному из цифровых выводов с поддержкой ШИМ, а скорость сервопривода можно контролировать командой write(0~180, 90=stop).
Но мне сложно понять роль цифрового вывода ШИМ. Если скорость и направление вращения сервопривода определяются функцией write(), то какова роль attach(pin#)?
Заранее спасибо!
@J.stork, 👍0
3 ответа
attach сообщает библиотеке сервоприводов, на какой контакт следует производить запись. Эта информация хранится где-то в оперативной памяти, и write находит ее и связывается с правильным контактом.
Возможно, вы используете другие выводы с поддержкой ШИМ для других целей, и если библиотека вдруг станет этому мешать, то это нехорошо.
Во-первых, вам не нужно подключать его к одному из контактов ШИМ. Любой цифровой выходной контакт подойдёт.
Судя по справочнику Arduino, присоединение сервопривода к выводу похоже на объявление переменной. Используя myservo.attach(pin), вы также присваиваете сервоприводу имя (в данном случае myservo), а также можете задать максимальное и минимальное значения угла поворота сервопривода, добавив два дополнительных значения в конец: myservo.attach(pin, min, max)
Когда вы затем используете функцию myservo.write(), Arduino «запомнит», к какому контакту подключен myservo, а также его максимальные/минимальные настройки.
Если вы не используете библиотеку 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. Микросекунду было бы сложно разблокировать, не влияя на синхронизацию. Задержку выключения можно сделать разблокирующей, например, чтобы два сервопривода работали как будто вместе.
Дон
- Двигатель постоянного тока шумит, но не вращается
- Проблемы с пониманием минимальных и максимальных параметров серводвигателя
- Как Arduino Uno может поддерживать до 12 сервоприводов, если у него всего 6 цифровых выводов ШИМ?
- Управление сервоприводом без библиотеки сервоприводов
- Удерживайте кнопку/нажмите кнопку/нажмите кнопку
- Контакты ШИМ серводвигателей, Arduino Uno
- Можно ли использовать скетч Arduino для производства
- Как изменить скорость нескольких сервоприводов, работающих одновременно с модулем PCA9685?
Сервоприводам необходим ШИМ на линии управления, они сравнивают значение рабочего цикла с внутренним потенциометром и применяют крутящий момент для исправления любого несоответствия., @ratchet freak
@ratchetfreak Да, но я имел в виду, что не обязательно использовать один из контактов с надписью ШИМ. На Arduino Uno контакты 3, 5, 6, 9, 10 и 11 — это контакты ШИМ, но вам не обязательно использовать один из них., @David Holmén