Библиотека Servo
Управляет сервоприводами: задаёт угол, библиотека сама формирует нужные импульсы.
Сервопривод ждёт импульс длиной от одной до двух миллисекунд каждые двадцать миллисекунд, и длина импульса задаёт угол. Делать это вручную в loop() неудобно, поэтому Servo берёт таймер платы и генерирует импульсы сама: вы пишете угол, остальное происходит в фоне.
На UNO и Nano библиотека занимает таймер 1 — тот же, что даёт ШИМ на выводах 9 и 10. Пока хотя бы один сервопривод подключён через attach(), analogWrite() на этих двух выводах не работает. Подключить можно до двенадцати сервоприводов на любые цифровые выводы.
Установка и подключение
В менеджере библиотек ищите Servo автора Arduino. Если менеджер предложит поставить зависимости — соглашайтесь. Как открыть менеджер и что делать, если библиотека не находится, — в общей статье про библиотеки.
#include <Servo.h>Создание объекта — обычно до setup():
Servo myServo; // объект на каждый сервопривод
myServo.attach(9); // в setup(): к какому выводу подключён сигнальный проводМетоды
Только то, что нужно в обычном скетче. Сигнатуры сверены с версией 1.3.0.
attach(int pin)- Привязать сервопривод к выводу. Возвращает номер канала; 0 — свободных каналов нет.
attach(int pin, int min, int max)- То же, но с длиной импульса в микросекундах для 0° и 180°. По умолчанию 544 и 2400; для дешёвых серво часто ближе к 500–2500.
write(int angle)- Повернуть на угол 0–180. Значение больше 200 считается длиной импульса в микросекундах.
writeMicroseconds(int us)- Задать длину импульса напрямую, обычно 1000–2000. Точнее, чем угол, и единственный способ для сервоприводов непрерывного вращения.
read()- Текущий заданный угол 0–180 (не реальное положение вала — обратной связи у серво нет).
readMicroseconds()- Текущая длина импульса в микросекундах.
attached()- true, если сервопривод привязан к выводу.
detach()- Отвязать: импульсы прекращаются, серво перестаёт держать положение и не гудит. Освобождает ШИМ на 9 и 10.
Пример
#include <Servo.h>
Servo servo;
void setup() {
servo.attach(9); // сигнальный провод на D9
}
void loop() {
for (int a = 0; a <= 180; a += 5) {
servo.write(a);
delay(30); // серво не успевает за мгновенным прыжком
}
for (int a = 180; a >= 0; a -= 5) {
servo.write(a);
delay(30);
}
}Питание сервопривода — от 5V платы только для одного маленького SG90. Два и больше или что-то крупнее питают от отдельного источника, объединив землю с платой.
На чём попадаются
Дёргается и перезагружает плату
Пусковой ток сервопривода до ампера, а стабилизатор платы столько не даёт. Отдельное питание 5–6 В и общая земля решают почти всё.
Не доходит до краёв или упирается и гудит
Диапазон импульсов по умолчанию не совпадает с конкретным экземпляром. Подберите min и max в attach(): начните с 500 и 2500 и сужайте, пока не перестанет упираться.
Пропал ШИМ на выводах 9 и 10
Так работает библиотека на ATmega328: таймер 1 занят. Светодиод с analogWrite() переносят на 3, 5, 6 или 11.
Серво непрерывного вращения не останавливается
У таких «угол» — это скорость, а стоп где-то около 1500 мкс. Точку остановки ищут writeMicroseconds() с шагом в 5–10.