ELECTRONICS

Библиотека Servo

менеджер: ServoArduinoверсия 1.3.0

Управляет сервоприводами: задаёт угол, библиотека сама формирует нужные импульсы.

Сервопривод ждёт импульс длиной от одной до двух миллисекунд каждые двадцать миллисекунд, и длина импульса задаёт угол. Делать это вручную в 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.

Где используется на сайте

Что дальше