ОБНОВЛЕНИЯ
- v3.6 – Исправлены мелкие баги, вырезан дебаг с 3.5
- v3.7 – Добавлено задание ускорения в градусах/сек/сек
- v3.8 – Исправлен невозврат тика при autoDetach(false)
ТЕОРИЯ
Вы наверняка работали с сервоприводами из под Arduino и знаете, как это выглядит: сервоприводу можно приказать повернуться на угол, и он с максимальной скоростью начнёт поворачиваться на этот угол. Это очень неправильно применять в реальных устройствах, потому что создаются лишние нагрузки и растёт потребление тока (большой стартовый ток). Можно ли крутить серво плавно? Можно! Я сделал библиотеку ServoSmooth, которая в этом поможет.
Зачем это нужно? В реальных устройствах, где нужно сервой повернуть/подвинуть тяжёлый объект, стандартный подход (дать сигнал и ждать поворота) работает на уничтожение редуктора привода, потому что объекты инерционные и быстро их разогнать и остановить невозможно! Ограничив максимальную скорость серво, разгон и торможение мы продлеваем ресурс редуктора в десятки раз, а также потребляем меньший ток за счёт плавности прикладывания момента. И очевидно получаем приятный визуальный эффект – нет резких рывков всей конструкции при разгоне-остановке.
Так как ESC контроллеры используют такой же протокол связи, мы автоматически получаем плавный разгон и торможение для бесколлекторных моторов (в этом случае за ускорение мотора отвечает максимальная скорость, метод setSpeed. Подумайте, это уже производная). И это круто!
[УСТАРЕЛО] Алгоритм работы для любопытных: работает всё на экспоненциальном бегущем среднем, именно оно обеспечивает плавный разгон и торможение. Ограничение скорости делается “дроблением” поворота серво по времени: серво поворачивается на несколько градусов по таймеру.
Старый алгоритм
//по таймеру:
_newSpeed = _servoTargetPos - _servoCurrentPos; // расчёт скорости
if (_servoState) {
_newSpeed = constrain(_newSpeed, -_servoMaxSpeed, _servoMaxSpeed); // ограничиваем по макс.
_servoCurrentPos += _newSpeed; // получаем новую позицию
_newPos += (float)(_servoCurrentPos - _newPos) * _k; // и фильтруем её
_newPos = constrain(_newPos, _min, _max); // ограничиваем
_servo.writeMicroseconds(_newPos); // отправляем на серво
}
Новый алгоритм работает по другому, обеспечивая более плавный разгон. Ускорение осуществляется двойным интегрированием позиции: к ней прибавляется скорость, к которой прибавляется ускорение. Торможение начинается с момента, полученного из школьной формулы S=V*V/(2*a). Для любознательных прикреплю алгоритм ниже.
Новый алгоритм
float err = _targetPos - _currentPos;
if (abs(err) > 0.1) {
bool thisDir = (_speed * _speed / _maxAcceleration / 2.0 >= abs(err)); // пора тормозить
_speed += _maxAcceleration * delta * (thisDir ? -_sign(_speed) : _sign(err));
_speed = constrain(_speed, -_maxSpeed, _maxSpeed);
_currentPos += _speed * delta;
}


БИБЛИОТЕКА
ServoSmooth v3.8

Библиотека для плавного управления сервоприводами
- Является дополнением к стандартной библиотеке Servo
- Поддерживает работу с расширителем серво PCA9685 (начиная с v3.0)
- Настройка максимальной скорости сервопривода
- Настройка ускорения (разгон и торможение) сервопривода
- Плавный пуск из любого положения при запуске программы (начиная с v3.2)
- При использовании ESC и БК мотора получаем “плавный пуск” мотора
- Установка целевой позиции серво по углу (0-180) и длине импульса (500-2400)
- Автоматическое отключение привода по таймауту неактивности и включение при изменении позиции (настраивается)
- Нативная поддержка серво с любым диапазоном по углу (180, 270, 360), см. документацию
Поддерживаемые платформы: все Arduino-совместимые платы (библиотека является дополнением к стандартной библиотеке Servo и PCA9685)
УСТАНОВКА
- Библиотеку можно найти и установить через менеджер библиотек по названию ServoSmooth в:
-
- Arduino IDE (Инструменты/Управлять библиотеками)
- Arduino IDE v2 (вкладка “Library Manager”)
- PlatformIO (PIO Home, вкладка “Libraries”)
-
- Про ручную установку читай здесь
ДОКУМЕНТАЦИЯ
Данная библиотека является «дополнением» к стандартной библиотеке Servo.h и позволяет плавно управлять сервоприводом. Суть работы кроется в методе tick(), который нужно вызывать постоянно в loop (или прерывании таймера), внутри тика находится алгоритм с собственным таймером, который по чуть чуть поворачивает серво к нужному положению. Библиотека дублирует несколько методов из Servo.h (attach имеет расширенную инициализацию):
write()иwriteMicroseconds()— повернут вал серво с максимальной скоростьюattach()иdetach()— подключить и отключить серво от управления
Инициализация
Объект создаётся точно так же, как в Servo.h, без параметров. Также можно передать рабочий угол серво (если не передавать, будет равен стандартному 180 град.)
#include "ServoSmooth.h" // подключили либу ServoSmooth servo; // создали объект ServoSmooth servo(270); // создали с указанием макс. угла серво
По инициализации attach() есть несколько вариантов:
attach(pin);— подключит серво на указанныйpin, угол поворота будет установлен на 0 градусов. Длина импульса* мин-макс будет стандартная, 500-2400 мксattach(pin, target);— подключит серво на указанныйpin, угол поворота** будет установлен наtargetградусов. Длина импульса* мин-макс будет стандартная, 500-2400 мксattach(pin, min, max);— подключит серво на указанныйpin, угол поворота будет установлен на 0 градусов. Длина импульса* будет установленаminиmaxсоответственно.attach(pin, min, max, target);— подключит серво на указанныйpin, угол поворота будет установлен наtargetградусов. Длина импульса* будет установленаminиmaxсоответственно.
*Длина импульса — сервопривод управляется ШИМ сигналом, в котором длина импульса прямо управляет углом поворота, то есть подавая минимальную и максимальную длину мы получаем рабочий угол 180 градусов. По умолчанию мин. и макс. длина установлены 500 и 2400 соответственно, что подходит большинству сервоприводов, но желательно посмотреть и «откалибровать» свой привод так, чтобы он работал на все 180 градусов. Мин. и макс. время импульса отличаются у разных производителей и моделей серво.
**Указание угла поворота при инициализации устанавливает серво на нужный угол сразу при подаче сигнала, а также выставляет текущую и целевую позицию равными этой.
Плавный пуск (new!)
Сервопривод не имеет обратной связи по углу (для программы), поэтому при запуске будет «резко» повёрнут на стартовый угол («в ноль» по умолчанию или на указанный в attach(pin, target). Есть два варианта избежать резких рывков в механизме при запуске программы:
- Заранее знать, на какой угол физически повёрнут привод при запуске и передать его в
attach(pin, target). Как узнать? Зависит от конкретной задачи и логики работы программы. Можно запоминать положение сервы в ЕЕПРОМ и восстанавливать при запуске, можно устанавливать серво в один и тот же угол перед выключением/перезагрузкой системы, и т.д. - Воспользоваться фичей
smoothStart(), которая появилась в версии 3.2 данной библиотеки. Работает она очень просто: аттачит и детачит сервопривод с периодом в пару десятков миллисекунд, таким образом привод плавно движется до заданного угла из любого начального положения. ВызыватьsmoothStart()нужно однократно (при старте программы) сразу послеattach(pin, target)в блокеsetup(). Внимание! Функция блокирующая, выполнение занимает 900 миллисекунд. Период «рывка» сервопривода выбран минимальный, при котором серво начинает понимать, чего от неё хотят. Период довольно большой, поэтому движение к заданной позиции происходит рывками, но в целом гораздо плавнее, чем безsmoothStart(). В массивном механизме рывки практически незаметны!
servo.attach(2, 35); // стартовый угол 35 градусов servo.smoothStart(); // "плавно" движемся к нему
Управление
Движение серво происходит автоматически в методе tick(), нам нужно всего лишь вызывать его как можно чаще в loop() (tick() имеет встроенный таймер на 20 миллисекунд). Также есть метод tickManual(), который поворачивает серву на следующий «шаг» при каждом вызове (тот же tick(), но не имеет своего таймера). Оба метода tick() возвращают false, пока серво движется, и true, когда серво достигла установленного угла, это можно использовать. Также серво автоматически отключается от управления при достижении заданного угла поворота (это уменьшает жужжание серво в простое). Эту функцию можно отключить, вызвав setAutoDetach(false). Инструменты для управления движением привода:
setTarget(длина);— устанавливает целевую позицию для серво в величине длина импульса, мкс (~500-2400)setTargetDeg(угол);— устанавливает целевую позицию для серво в градусах (0-180)setSpeed(скорость);— установка максимальной скорости (больше нуля) в градусах в секундуsetAccel(ускорение);— установка ускорения (float числа 0.01 — 1.0). Можно больше 1, будет ещё резче. Если установить ускорение0— оно будет отключено и серво будет двигаться по профилю постоянной скорости (с бесконечным ускорением)- Если передавать ускорение в целых числах (с версии 3.7 библиотеки) — ускорение будет установлено в градусах/сек/сек. Рабочий диапазон ускорений
1 - 1500, чем больше — тем резче. При значении0ускорение будет отключено.
- Если передавать ускорение в целых числах (с версии 3.7 библиотеки) — ускорение будет установлено в градусах/сек/сек. Рабочий диапазон ускорений
start();— автоматический attach + разрешает работу tick — серво движется к заданной позицииstop();— detach + запрещает работу tick — серво останавливается
Полезные вспомогательные методы для различных ситуаций:
setDirection(напр);— принимаетNORMAL(false) илиREVERSE(true), меняет направление сервоsetCurrent(длина);— установка текущей позиции в мкс (500 — 2400). Может пригодиться в ситуации, когда мы знаем реальный угол серво и хотим сообщить о нём программе, чтобы алгоритм не дёргал привод.setCurrentDeg(угол);— установка текущей позиции в градусах (0-180). Зависит от min и max.getCurrent();— получение текущей позиции в мкс (500 — 2400)getCurrentDeg();— получение текущей позиции в градусах (0-180). Зависит от min и maxgetTarget();— получение целевой позиции в мкс (500 — 2400)getTargetDeg();— получение целевой позиции в градусах (0-180). Зависит от min и maxsetMaxAngle();— установка макс. угла серво, по умолчанию180. Позволяет удобно работать с разными сервами (на 270 и 360 градусов)
Расширитель серво PCA9685
В версии библиотеки 3 и выше добавлена поддержка драйвера PCA9685, подключать нужно файл #include "ServoDriverSmooth.h"
ServoDriverSmooth servo;// по умолчанию (адрес 0x40, угол 180)ServoDriverSmooth servo(0x40);// с указанием адреса драйвераServoDriverSmooth servo(0x40, 270);// с указанием адреса и макс. угла
Метод attach(pin) принимает номер вывода на драйвере. В остальном всё работает точно так же, как с обычной сервой.
void write(uint16_t angle); // аналог метода из библиотеки Servo
void writeMicroseconds(uint16_t angle); // аналог метода из библиотеки Servo
void attach(uint8_t pin); // аналог метода из библиотеки Servo
void attach(uint8_t pin, int min, int max); // аналог метода из библиотеки Servo. min по умолч. 500, max 2400
void detach(); // аналог метода detach из библиотеки Servo
void start(); // attach + разрешает работу tick
void stop(); // detach + запрещает работу tick
boolean tick(); // метод, управляющий сервой, должен опрашиваться как можно чаще.
// Возвращает true, когда целевая позиция достигнута.
// Имеет встроенный таймер с периодом SERVO_PERIOD
boolean tickManual(); // метод, управляющий сервой, без встроенного таймера.
// Возвращает true, когда целевая позиция достигнута
void setSpeed(int speed); // установка максимальной скорости (градусы в секунду)
void setAccel(float accel); // установка ускорения (0.05 - 1.0). При значении 1 ускорение максимальное. 0 - отключено
void setAccel(int accel); // установка ускорения в градусах/сек/сек (рабочее от 1 до ~1500). 0 - отключено
void setTarget(int target); // установка целевой позиции в мкс (500 - 2400)
void setTargetDeg(int target); // установка целевой позиции в градусах (0-макс. угол). Зависит от min и max
void setAutoDetach(boolean set); // вкл/выкл автоматического отключения (detach) при достижении угла. По умолч. вкл
void setCurrent(int target); // установка текущей позиции в мкс (500 - 2400)
void setCurrentDeg(int target); // установка текущей позиции в градусах (0-макс. угол). Зависит от min и max
void setMaxAngle(int maxAngle); // установка макс. угла привода
int getCurrent(); // получение текущей позиции в мкс (500 - 2400)
int getCurrentDeg(); // получение текущей позиции в градусах (0-макс. угол). Зависит от min и max
int getTarget(); // получение целевой позиции в мкс (500 - 2400)
int getTargetDeg(); // получение целевой позиции в градусах (0-макс. угол). Зависит от min и max
void smoothStart(); // вызывать сразу после attach(пин, таргет). Смягчает движение серво из неизвестной позиции к стартовой. БЛОКИРУЮЩАЯ НА 1 СЕК!
ПРИМЕРЫ
Остальные примеры смотри в папке examples библиотеки, также примеры можно открыть из Arduino IDE/Файл/Примеры
/*
Данный скетч крутит 4 сервопривода с разными скоростями и ускорениями
Документация: https://alexgyver.ru/servosmooth/
*/
#define AMOUNT 4 // кол-во серво
#include <ServoSmooth.h>
ServoSmooth servos[AMOUNT];
uint32_t servoTimer;
uint32_t turnTimer;
int position1 = 10; // первое положение серв
int position2 = 160; // второе положение серв
boolean flag;
void setup() {
Serial.begin(9600);
// подключаем
servos[0].attach(2);
servos[1].attach(3);
servos[2].attach(4);
servos[3].attach(5);
// настраиваем макс. скорости и ускорения
// скор. по умолч. 100 град/с
// ускорение по умолч. 0.2
servos[0].setSpeed(180);
servos[1].setAccel(0.1);
servos[2].setSpeed(90);
servos[3].setAccel(0.5);
}
void loop() {
// каждые 20 мс
if (millis() - servoTimer >= 20) { // взводим таймер на 20 мс (как в библиотеке)
servoTimer += 20;
for (byte i = 0; i < AMOUNT; i++) {
servos[i].tickManual(); // двигаем все сервы. Такой вариант эффективнее отдельных тиков
}
}
// каждые 2 секунды меняем положение
if (millis() - turnTimer >= 2000) {
turnTimer = millis();
flag = !flag;
for (byte i = 0; i < AMOUNT; i++) {
if (flag) servos[i].setTargetDeg(position1);
else servos[i].setTargetDeg(position2);
}
}
}
/*
Данный код плавно управляет одной сервой (на пине 2)
при помощи потенциометра (на пине А0).
Откройте порт по последовательному соединению для наблюдения за положением серво
Документация: https://alexgyver.ru/servosmooth/
*/
#include "ServoSmooth.h"
ServoSmooth servo;
uint32_t myTimer;
void setup() {
Serial.begin(9600);
servo.attach(A1, 600, 2400); // 600 и 2400 - длины импульсов, при которых
// серво поворачивается максимально в одну и другую сторону, зависят от самой серво
// и обычно даже указываются продавцом. Мы их тут указываем для того, чтобы
// метод setTargetDeg() корректно отрабатывал диапазон поворота сервы
servo.setSpeed(90); // ограничить скорость
servo.setAccel(0.1); // установить ускорение (разгон и торможение)
}
void loop() {
// желаемая позиция задаётся методом setTarget (импульс) или setTargetDeg (угол), далее
// при вызове tick() производится автоматическое движение сервы
// с заданным ускорением и ограничением скорости
boolean state = servo.tick(); // здесь происходит движение серво по встроенному таймеру!
if (millis() - myTimer >= 40) {
myTimer = millis();
int newPos = map(analogRead(A2), 0, 1023, 500, 2400); // берём с потенцометра значение 500-2400 (импульс)
servo.setTarget(newPos); // и отправляем на серво
Serial.println(String(newPos) + " " + String(servo.getCurrent())/* + " " + String(state)*/);
// state показывает сотояние сервы (0 - движется, 1 - приехали и отключились)
}
}
Работаем с расширителем серво
/*
Данный код плавно управляет одной сервой
при помощи потенциометра (на пине А0).
Используется драйвер PCA9685
Откройте порт по последовательному соединению для наблюдения за положением серво
Документация: https://alexgyver.ru/servosmooth/
*/
#include "ServoDriverSmooth.h"
ServoDriverSmooth servo;
//ServoDriverSmooth servo(0x40); // с указанием адреса драйвера
//ServoDriverSmooth servo(0x40, 270); // с указанием адреса и макс. угла
uint32_t myTimer;
void setup() {
Serial.begin(9600);
servo.attach(0, 150, 550); // 150 и 600 - длины импульсов, при которых
// серво поворачивается максимально в одну и другую сторону, зависят от самой серво
// и обычно даже указываются продавцом. Мы их тут указываем для того, чтобы
// метод setTargetDeg() корректно отрабатывал диапазон поворота сервы
// для драйвера диапазон в районе 150-600! Не как у обычной серво
servo.setSpeed(120); // ограничить скорость
servo.setAccel(0.5); // установить ускорение (разгон и торможение)
}
void loop() {
// желаемая позиция задаётся методом setTarget (импульс) или setTargetDeg (угол), далее
// при вызове tick() производится автоматическое движение сервы
// с заданным ускорением и ограничением скорости
boolean state = servo.tick(); // здесь происходит движение серво по встроенному таймеру!
if (millis() - myTimer >= 40) {
myTimer = millis();
int newPos = map(analogRead(0), 0, 1023, 0, 180); // берём с потенцометра значение 0-180
servo.setTargetDeg(newPos); // и отправляем на серво
Serial.println(String(newPos) + " " + String(servo.getCurrentDeg())/* + " " + String(state)*/);
// state показывает сотояние сервы (0 - движется, 1 - приехали и отключились)
}
}
ПОДДЕРЖАТЬ
Вы можете поддержать меня за создание доступных проектов с открытым исходным кодом, полный список реквизитов есть вот здесь.
СОДЕРЖАНИЕ ►
- Как плавно поворачивать микросерво на Ардуино
- Код плавного вращения сервы с циклом for
- Код плавного вращения сервы с циклом while
- Код для поворота серво без delay (на millis)
Управление скоростью вращения сервомотора Ардуино сделать довольно просто, если вы знакомы с циклами for или while в языке программирования Arduino. Рассмотрим, как сделать плавные повороты серво от 0 до 90 градусов, используя циклы. Представленные на этой странице примеры программ позволят вам использовать сервоприводы в различных проектах, где требуется плавный поворот.
Как сделать плавные повороты серво
Для этого занятия потребуется:
- Arduino Uno / Arduino Nano / Arduino Mega;
- микро сервомотор;
- провода папа-папа.
| Servo | Arduino Uno | Arduino Nano | Arduino Mega |
| черный провод | GND | GND | GND |
| красный провод | 5V | 5V | 5V |
| желтый провод | 11 | 11 | 11 |
Обратите внимание, что серво подключается к ШИМ (PWM) портам Ардуино и для работы с моторчиком необходима библиотека Servo.h. Для плавного вращения сервы, как и для плавного зажигания светодиодов используется цикл for или while. Схема подключения сервопривода к микроконтроллеру представлена на картинке выше. Соберите схему и загрузите следующую программу в плату Arduino.
Скетч для плавного поворота серво с циклом for
#include "Servo.h" Servo servo; int angle; // переменная для угла поворота микро серво void setup() { servo.attach(11); // пин для подключения микро серво } void loop() { // цикл для поворота от 0 до 90 градусов for (angle = 0; angle <= 90; angle++) { servo.write(angle); // сообщаем микро серво угол поворота delay(20); // ждем 20 мс, пока серво не сделает поворот } // цикл для поворота от 90 до 0 градусов for (angle = 90; angle >= 0; angle--) { servo.write(angle); // сообщаем микро серво угол поворота delay(20); // ждем 20 мс, пока серво не сделает поворот } }
Пояснения к коду:
- максимальный угол для плавного поворота микросерво — 180 градусов;
- увеличивая задержку
delay(20);, можно замедлить скорость поворота.
Скетч для плавного поворота серво с циклом while
#include "Servo.h" Servo servo; int angle; // переменная для угла поворота микро серво void setup() { servo.attach(11); // пин для подключения микро серво } void loop() { // цикл для поворота от 0 до 90 градусов while (angle < 90) { angle++; servo.write(angle); // сообщаем микро серво угол поворота delay(20); // ждем 20 мс, пока серво не сделает поворот } // цикл для поворота от 90 до 0 градусов while (angle > 0) { angle--; servo.write(angle); // сообщаем микро серво угол поворота delay(20); // ждем 20 мс, пока серво не сделает поворот } }
Пояснения к коду:
- цикл while выполняется до тех пор, пока выражение в круглых скобках является истиной. Т.е. первый цикл while
(angle < 90) {}будет выполнятся до тех пор, пока угол поворота микро серво мотора не станет больше 90 градусов
Скетч плавного поворота сервомотора без delay
#include "Servo.h" Servo servo; int angle; // переменная для угла поворота микро серво unsigned long timer; // переменная для отсчета времени void setup() { servo.attach(11); // пин для подключения микро серво } void loop() { // цикл для поворота от 0 до 90 градусов while (angle < 90) { // если прошло 20 мс - поворачиваем серво if (millis() - timer > 20) { angle++; servo.write(angle); // сообщаем микро серво угол поворота timer = millis(); } // в этом месте можно делать параллельно что-то еще } // цикл для поворота от 90 до 0 градусов while (angle > 0) { // если прошло 20 мс - поворачиваем серво if (millis() - timer > 20) { angle--; servo.write(angle); // сообщаем микро серво угол поворота timer = millis(); } // в этом месте можно делать параллельно что-то еще } }
Пояснения к коду:
- для задержки между поворотами серво используется функция millis Arduino
- программа позволяет Ардуино выполнять параллельно другие задачи, например, опрашивать датчики или включать другие устройства
Работаем с сервоприводами
Управляем через импульсы
Библиотека Servo
Sweep
Knob
Случайные повороты
Сервопривод — это механизм с электромотором с управлением. Вы можете вращать механический привод на заданный угол с заданной скоростью или усилием.
Наиболее популярны сервоприводы, которые удерживают заданный угол и сервоприводы, поддерживающие заданную скорость вращения.
Сервоприводы имеют несколько составных частей. Привод — электромотор с редуктором. Зачастую скорость вращения мотора бывает слишком большой для практического использования. Для понижения скорости используется редуктор: механизм из шестерней, передающий и преобразующий крутящий момент.
Включая и выключая электромотор, можно вращать выходной вал — конечную шестерню сервопривода, к которой можно прикрепить нечто, чем мы хотим управлять — рычаг в форме круга, крестовины или перекладинки для передачи вращающего движения на рабочий орган. Для контроля положения используется датчик обратной связи — энкодер, который будет преобразовывать угол поворота обратно в электрический сигнал. Для этого часто используется потенциометр. При повороте бегунка потенциометра происходит изменение его сопротивления, пропорциональное углу поворота. Таким образом, с его помощью можно установить текущее положение механизма.
Кроме электромотора, редуктора и потенциометра в сервоприводе имеется электронная начинка, которая отвечает за приём внешнего параметра, считывание значений с потенциометра, их сравнение и включение/выключение мотора. Она-то и отвечает за поддержание отрицательной обратной связи.
К сервоприводу тянется три провода. Два из них отвечают за питание мотора и землю, третий доставляет управляющий сигнал, который используется для выставления положения устройства.
Крутящий момент и скорость поворота
Крутящий момент — векторная физическая величина, равная произведению радиус-вектора, проведённого от оси вращения к точке приложения силы, на вектор этой силы. Характеризует вращательное действие силы на твёрдое тело. Эта характеристика показывает, насколько тяжёлый груз сервопривод способен удержать в покое на рычаге заданной длины. Если крутящий момент сервопривода равен 5 кг×см, то это значит, что сервопривод удержит на весу в горизонтальном положении рычаг длины 1 см, на свободный конец которого подвесили 5 кг. Или, что эквивалентно, рычаг длины 5 см, к которому подвесили 1 кг.
Скорость сервопривода измеряется интервалом времени, который требуется рычагу сервопривода, чтобы повернуться на 60°. Характеристика 0,1 с/60° означает, что сервопривод поворачивается на 60° за 0,1 с. Из неё несложно вычислить скорость в более привычной величине, оборотах в минуту, но так сложилось, что при описании сервоприводов чаще всего используют такую единицу.
Иногда приходится искать компромисс между этими двумя характеристиками, так как если мы хотим надёжный, выдерживающий большой вес сервопривод, то мы должны быть готовы, что эта могучая установка будет медленно поворачиваться. А если мы хотим очень быстрый привод, то его будет относительно легко вывести из положения равновесия. При использовании одного и того же мотора баланс определяет конфигурация шестерней в редукторе.
Виды сервоприводов
Сервоприводы бывают аналоговые и цифровые. Различаются они лишь внутренней управляющей электроникой. Вместо специальной микросхемы аналогового сервопривода у цифрового собрата можно заметить на плате микропроцессор, который принимает импульсы, анализирует их и управляет мотором. Таким образом, в физическом исполнении отличие лишь в способе обработки импульсов и управлении мотором.
Шестерни для сервоприводов бывают из разных материалов: пластиковые, карбоновые, металлические.
Пластиковые, чаще всего нейлоновые, шестерни очень лёгкие, не подвержены износу, более всего распространены в сервоприводах. Они не выдерживают больших нагрузок, однако если нагрузки предполагаются небольшие, то нейлоновые шестерни — лучший выбор.
Карбоновые шестерни более долговечны, практически не изнашиваются, в несколько раз прочнее нейлоновых. Основной недостаток — дороговизна.
Металлические шестерни являются самыми тяжёлыми, однако они выдерживают максимальные нагрузки. Достаточно быстро изнашиваются, так что придётся менять шестерни практически каждый сезон. Шестерни из титана — фавориты среди металлических шестерней, причём как по техническим характеристикам, так и по цене. Они достаточно дорогие.
Существует три типа моторов сервоприводов: обычный мотор с сердечником, мотор без сердечника и бесколлекторный мотор.
Обычный мотор с сердечником (справа) обладает плотным железным ротором с проволочной обмоткой и магнитами вокруг него. Ротор имеет несколько секций, поэтому когда мотор вращается, ротор вызывает небольшие колебания мотора при прохождении секций мимо магнитов, а в результате получается сервопривод, который вибрирует и является менее точным, чем сервопривод с мотором без сердечника. Мотор с полым ротором (слева) обладает единым магнитным сердечником с обмоткой в форме цилиндра или колокола вокруг магнита. Конструкция без сердечника легче по весу и не имеет секций, что приводит к более быстрому отклику и ровной работе без вибраций. Такие моторы дороже, но они обеспечивают более высокий уровень контроля, вращающего момента и скорости по сравнения со стандартными.
Сервоприводы с бесколлекторным мотором появились сравнительно недавно. У бесколлекторных моторов нет щёток, а значит они не создают сопротивление вращению и не изнашиваются, скорость и момент выше при токопотреблении равном коллекторным моторам. Сервоприводы с бесколлекторным мотором — самые дорогие сервоприводы, однако при этом они обладают лучшими характеристиками по сравнению с сервоприводами с другими типами моторов.
Многие сервоприводы могут быть подключены к Arduino непосредственно. Для этого от них идёт шлейф из трёх проводов:
- красный — питание; подключается к контакту 3.3/5V или напрямую к источнику питания
- коричневый или чёрный — земля
- жёлтый или белый — сигнал; подключается к цифровому выходу Arduino
Обычный хобби-сервопривод во время работы потребляет более 100 мА. При этом Arduino способно выдавать до 500 мА. Поэтому, если вам в проекте необходимо использовать мощный сервопривод, есть смысл задуматься о выделении его в контур с дополнительным питанием.
На большинстве плат Arduino библиотека Servo поддерживает управление не более 12 сервоприводами, на Arduino Mega — 48. При этом есть небольшой побочный эффект использования этой библиотеки: если вы работаете не с Arduino Mega, то становится невозможным использовать функцию analogWrite() на 9 и 10 контактах независимо от того, подключены сервоприводы к этим контактам или нет. На Arduino Mega можно подключить до 12 сервоприводов без нарушения функционирования ШИМ/PWM, при использовании большего количества сервоприводов мы не сможем использовать analogWrite() на 11 и 12 контактах.
Библиотеки для управления сервоприводами (Servo) и для работы с приёмниками/ передатчиками на 433 МГц VirtualWire используют одно и то же прерывание. Это означает, что их нельзя использовать в одном проекте одновременно. Существует альтернативная библиотека для управления сервомоторами — Servo2.
Сервоприводы обычно имеют ограниченный угол вращения 180 градусов, их так и называют «сервопривод 180°». Но существуют сервоприводы с неограниченным углом поворота оси. Это сервоприводы постоянного вращения или «сервоприводы 360°».
Иногда при подключении серводвигателя не отрабатывают заданные команды или отрабатывают некорректно. Причина в том, что сервомоторы требуют достаточно большую мощность для питания, особенно в начале движения ротора. Эти резкие скачки потребляемой мощности могут сильно «просаживать» напряжение на Arduino. Может произойти даже перезагрузка платы. Если подобное происходит, вам надо добавить конденсатор (470 мкФ или больше) между рельсами GND и 5V на вашей макетке. Конденсатор выполняет роль своеобразного резервуара для электрического тока. Когда серводвигатель начинает работать, он получает остатки заряда с конденсатора и от источника питания Arduino одновременно. Длинная нога конденсатора — это позитивный контакт, она подключается к 5V. Отрицательный контакт часто маркируется символом ‘-‘.
Управляем через импульсы
Для начала попробуем управлять вручную без библиотек. Считываем показания из Serial Monitor — нужно ввести число от 0 до 9. Эти значения равномерно распределим на 180 градусов и получим 20 градусов на каждую единицу показаний.
int servoPin = 9; // сигнальный провод от серво на порт 9
int val;
void setup()
{
pinMode(servoPin, OUTPUT);
Serial.begin(9600);
Serial.println("Servo is ready");
}
void loop()
{
// convert number 0 to 9 to corresponding 0-180 degree angle
val = Serial.read();
if (val >= '0' && val <= '9')
{
val = val - '0'; // convert to numerical variable
val = val * (180 / 9); // convert number to angle
Serial.print("moving servo to ");
Serial.print(val, DEC);
Serial.println();
// giving the servo time
//to rotate to commanded position
for (int i = 0; i <= 50; i++)
{
servoPulse(servoPin, val);
}
}
}
// define a servo pulse function
void servoPulse(int pin, int angle)
{
// convert angle to 500-2480 pulse width
int pulseWidth = (angle * 11) + 500;
digitalWrite(pin, HIGH); // set the level of servo pin as high
delayMicroseconds(pulseWidth); // delay microsecond of pulse width
digitalWrite(pin, LOW); // set the level of servo pin as low
delay(20 - pulseWidth / 1000);
}
Библиотека Servo
Можно генерировать управляющие импульсы самостоятельно, но это настолько распространённая задача, что для её упрощения существует стандартная библиотека Servo.
Сервопривод постоянного вращения можно управлять с помощью библиотек Servo или Servo2. Отличие заключается в том, что функция Servo.write(angle) задаёт не угол, а скорость вращения привода.
Библиотека Servo позволяет осуществлять программное управление сервоприводами. Управление осуществляется следующими функциями:
- attach() — присоединяет объект к конкретному выводу платы. Возможны два варианта синтаксиса для этой функции: servo.attach(pin) и servo.attach(pin, min, max). При этом pin — номер пина, к которому присоединяют сервопривод, min и max — длины импульсов в микросекундах, отвечающих за углы поворота 0° и 180°. По умолчанию выставляются равными 544 мкс и 2400 мкс соответственно. Возвращаемого значения нет.
- write() — отдаёт команду сервоприводу принять некоторое значение параметра. Синтаксис: servo.write(angle), где angle — угол, на который должен повернуться сервопривод
- writeMicroseconds() — отдаёт команду послать на сервопривод имульс определённой длины, является низкоуровневым аналогом предыдущей команды. Синтаксис следующий: servo.writeMicroseconds(uS), где uS — длина импульса в микросекундах. Возвращаемого значения нет.
- read() — читает текущее значение угла, в котором находится сервопривод. Синтаксис: servo.read(), возвращается целое значение от 0 до 180
- attached() — проверка, была ли присоединён объект к конкретному пину. Синтаксис следующий: servo.attached(), возвращается логическая истина, если объект была присоединён к какому-либо пину, или ложь в обратном случае
- detach() — производит действие, обратное действию attach(), то есть отсоединяет объект от пина, к которому был приписан. Синтаксис: servo.detach()
В библиотеке Servo для Arduino по умолчанию выставлены следующие значения длин импульса: 544 мкс — для 0° и 2400 мкс — для 180°.
Пример подключения двух сервоприводов.
#include <Servo.h>
// создаём объекты для управления сервоприводами
Servo myservo1;
Servo myservo2;
void setup()
{
// подключаем сервоприводы к выводам 11 и 12
myservo1.attach(11);
myservo2.attach(12);
}
void loop()
{
// устанавливаем сервоприводы в серединное положение
myservo1.write(90);
myservo2.write(90);
delay(500);
// устанавливаем сервоприводы в крайнее левое положение
myservo1.write(0);
myservo2.write(0);
delay(500);
// устанавливаем сервоприводы в крайнее правое положение
myservo1.write(180);
myservo2.write(180);
delay(500);
}
Библиотека Servo не совместима с библиотекой VirtualWire для работы с приёмником и передатчиком на 433 МГц, так как они используют одно и то же прерывание. Это означает, что их нельзя использовать в одном проекте одновременно. Существует альтернативная библиотека для управления сервомоторами — Servo2. Все методы библиотеки Servo2 совпадают с методами Servo.
При работе с сервоприводами на 360 градусов функции работают по другому.
| Функция Arduino | Сервопривод 180° | Сервопривод 360° |
|---|---|---|
| Servo.write(0) | Крайне левое положение | Полный ход в одном направлении |
| Servo.write(90) | Среднее положение | Остановка сервопривода |
| Servo.write(180) | Крайне правое положение | Полный ход в обратном направлении |
Sweep
Скетч File | Examples | Servo | Sweep постоянно поворачивает насадку на 180 градусов и возвращает её обратно. В примере используется встроенная библиотека Servo.
Общая схема — красный провод идёт к питанию 5V, чёрный или коричневый идёт к GND, а жёлтый или белый к выводу платы (в нашем примере вывод 9).
#include <Servo.h>
Servo myservo; // создадим объект сервопривода
int pos = 0; // начальная позиция
void setup() {
myservo.attach(9); // сервопривод на выводе 9
}
void loop() {
for (pos = 0; pos <= 180; pos += 1) { // от 0 до 180 градусов
// шаг в один градус
myservo.write(pos); // просим повернуться на позицию значения переменной 'pos'
delay(15); // ждём 15ms для достижения позиции
}
for (pos = 180; pos >= 0; pos -= 1) { // от 180 до 0 градусов
myservo.write(pos); // просим повернуться на позицию значения переменной 'pos'
delay(15); // ждём 15ms для достижения позиции
}
}
Knob
Скетч File | Examples | Servo | Knob управляет сервоприводом при помощи потенциометра. В примере используется встроенная библиотека Servo.
Общая схема: у сервопривода — красный провод идёт к питанию 5V, чёрный или коричневый идёт к GND, а жёлтый или белый к выводу платы (в нашем примере вывод 9). У потенциометра средняя ножка соединяется с аналоговым выходом A0, остальные к питанию и земле.
#include <Servo.h>
Servo myservo; // создадим объект сервопривода
int potpin = 0; // аналоговый выход A0 для потенциометра
int val; // значение, получаемое от аналогового выхода
void setup() {
myservo.attach(9); // сервопривод на выводе 9
}
void loop() {
val = analogRead(potpin); // считываем данные с потенциометра (от 0 до 1023)
val = map(val, 0, 1023, 0, 180); // Преобразуем в интервал от 0 до 180
myservo.write(val); // устанавливаем позицию сервопривода
delay(15); // небольшое ожидание, чтобы сервопривод успел выполнить команду
}
Случайные повороты
Будем поворачивать серводвигатель на случайную величину. Практического смысла немного, но для демонстрации подойдёт.
#include <Servo.h>
Servo servo; // создадим объект сервопривода
long randomNumber;
void setup() {
servo.attach(9);
randomSeed( analogRead(A0) );
}
void loop() {
randomNumber = random(0, 181);
servo.write(randomNumber);
delay(500);
}
Дополнительное чтение
Сервопривод для ESP32
Реклама
Сервоприводы PDM постоянного вращения — это моторы, которые управляются сигналом PDM (Pulse Duration Modulation) и поддерживает скорость вращения вала в любом направлении без ограничений по углу поворота.
Сервоприводы непрерывного вращения используются для моделирования движения различных механизмов. На основе сервопривода можно собрать вращающийся столик для предметной фотосъёмки, мобильного бота или радар кругового обзора.
Список моделей
Интерфейс управления
В сервоприводах PDM постоянного вращения скорость вращения вала зависит от длины импульса. Для управления мотором необходимо подавать особый сигнал PDM (Pulse Duration Modulation) — импульсы постоянной частоты и переменной ширины. При поступлении с внешнего контроллера управляющего импульса начинка сервопривода генерирует свой сигнал мотору.
В сигнале PDM частота импульсов постоянна и равна 50 Гц, т. е. период подачи импульсов равен 20 мс. А вот ширина импульса изменяется, и именно от неё зависит направление и скорость вращения мотора. Принято считать, что рабочая ширина импульса лежит в пределах 544–2400 мкс.
В качестве примера приведём данные для популярного хобби-сервопривода Feetech FS90R.
| Период импульсов | Ширина импульса | Положение сервопривода |
|---|---|---|
| 20 мс | 544 мкс | Вал сервопривода вращается по часовой стрелке (CW) с максимальной скоростью. |
| 20 мс | 1540 мкс | Вал сервопривода стоит на месте. |
| 20 мс | 2400 мкс | Вал сервопривода вращается против часовой стрелки (CWW) с максимальной скоростью. |

На разных приводах диапазон ширины импульсов и скорости поворота вала может отличатся от стандартного. Эти данные можно уточнить в характеристиках.
Даже в рамках одной и той же модели сервопривода существует погрешность, допускаемая при производстве, которая приводит к тому, что рабочий диапазон длин импульсов отличается. Для точной работы каждый конкретный сервопривод должен быть откалиброван: путём экспериментов необходимо подобрать корректный диапазон, характерный именно для него.
Часто способ управления сервоприводами называют PWM (Pulse Width Modulation) или PPM (Pulse Position Modulation). Это не так, и использование этих способов может даже повредить привод. Корректный термин — PDM (Pulse Duration Modulation) в котором важна длина импульсов, а не частота.
Если ваш сервопривод дребезжит, дёргается или стоит задача управлять несколькими серво, обратите внимание на плату расширения Multiservo Shield.
Сервоприводы с обратной связью
В сервоприводах PDM постоянного вращения также встречаются модели с обратной связью, у которых сигнал внутреннего потенциометра выведен отдельным проводом. Однако обратная связь показывает не скорость вращения вала, а его текущий угол поворота.

Обычно наличие сигнала обратной связи явно указывается в характеристиках сервопривода.
Питание сервопривода
Сервопривод можно запитать двумя способами: напрямую от контроллера (если позволяют характеристики) или же от внешнего источника питания.
Без внешнего источника питания
Если сервопривод питается напряжением 5 вольт и потребляет ток менее 500 мА, есть возможность запитать сервомотор непосредственно от контроллера.

Схема подключения
| Цвет провода | Контакт | Функция | Подключение |
|---|---|---|---|
| Оранжевый / Жёлтый / Белый | S | Пин управления сервоприводом | Подключите к пину ввода-вывода контроллера. |
| Красный | V | Питание | Подключите к питанию контроллера. |
| Коричневый / Чёрный | G | Земля | Подключите к земле контроллера. |
С внешним источником питания
Если сервопривод питается напряжением свыше 5 вольт или потребляет ток более 500 мА, то ему необходим внешний источник питания.

Схема подключения
| Цвет провода | Контакт | Функция | Подключение |
|---|---|---|---|
| Оранжевый / Жёлтый / Белый | S | Пин управления сервоприводом | Подключите к пину ввода-вывода контроллера. |
| Красный | V | Питание | Подключите к внешнему источнику питания с подходящим вольтажом. |
| Коричневый / Чёрный | G | Земля | Подключите к земле внешнего источника питания и земле контроллера. |
Примеры работы для Arduino
Возьмём для тестовых проектов популярный сервопривод Feetech FS90R. А мозгом выступит платформа Arduino Uno.
Подключение и настройка
Для наглядности схемы мы используем подключение сервопривода напрямую к контроллеру, без внешнего питания. Если вам нужен дополнительный блок питания, сверьтесь со схемами в разделе про питание сервопривода.
Что понадобится
Схема устройства
Для быстрой сборки и отладки устройства рекомендуем взять плату расширения Troyka Shield, которая надевается сверху на Uno R3 методом бутерброда.
Программная настройка
-
Для работы примеров понадобится библиотека AmperkaServo, которая является обёрткой штатной библиотеки Servo с дополнительными методами.
Вращение вала
Для старта протестируем мотор в трёх режимах вращения:
-
Максимальная скорость по часовой стрелке (CW).
-
Пауза — вал мотора стоит на месте.
-
Максимальная скорость против часовой стрелки (CCW).
Код для Arduino IDE
- servo-pdm-continuous-rotation-speed.ino
-
// Библиотека с расширенными функциями для работы с Servo #include <AmperkaServo.h> // Создаём объект для работы с сервомоторами AmperkaServo servo; // Задаём имя пина, к которому подключён сервопривод constexpr uint8_t SERVO_PIN = 9; void setup() { // Подключаем сервомотор // servo.attach(SERVO_PIN); // Подключаем сервомотор с расширенными параметрами // Советуем использовать именно этот вариант для точной настройки мотора // servo.attach(pin, minPulseWidth, maxPulseWidth); // - pin: номер пина, к которому подключён сервопривод // - minPulseWidth: ширина импульса, // соответствующая максимальной скорости по часовой стрелке CW. // Опциональный и по умолчанию стоит 544 мкс. // - maxPulseWidth: ширина импульса, // соответствующая максимальной скорости против часовой стрелки CW. // Опциональный и по умолчанию стоит 2400 мкс. // Данные возьмите из технических характеристик мотора servo.attach(SERVO_PIN, 544, 2400); } void loop() { // Задаём максимальную скорость вращения по часовой стрелке CW servo.writeSpeed(255); // Ждём 3 секунды delay(3000); // Останавливаем сервопривод servo.writeSpeed(0); // Ждём 1 секунду delay(1000); // Задаём максимальную скорость вращения против часовой стрелки CCW servo.writeSpeed(-255); // Ждём 3 секунды delay(3000); // Останавливаем сервопривод servo.writeSpeed(0); // Ждём 1 секунду delay(1000); }
После прошивки устройства вал сервопривода будет сначала вращаться с максимальной скоростью по часовой стрелке, сделает паузу, а затем начнёт вращение против часовой стрелки.

Вращение вала с плавным разгоном
Усложним задачу. Сделаем плавный разгон вала по очереди в каждую сторону:
-
Плавный разгон до максимальной скорости по часовой стрелке (CW).
-
Пауза — вал мотора стоит на месте.
-
Плавный разгон до максимальной скорости против часовой стрелки (CCW).
Код для Arduino IDE
- servo-pdm-continuous-rotation-speed-sweep.ino
-
// Библиотека с расширенными функциями для работы с Servo #include <AmperkaServo.h> // Создаём объект для работы с сервомоторами AmperkaServo servo; // Задаём имя пина, к которому подключён сервопривод constexpr uint8_t SERVO_PIN = 9; void setup() { // Подключаем сервомотор // servo.attach(SERVO_PIN); // Подключаем сервомотор с расширенными параметрами // Советуем использовать именно этот вариант для точной настройки мотора // servo.attach(pin, minPulseWidth, maxPulseWidth); // - pin: номер пина, к которому подключён сервопривод // - minPulseWidth: ширина импульса, // соответствующая максимальной скорости по часовой стрелке CW. // Опциональный и по умолчанию стоит 544 мкс. // - maxPulseWidth: ширина импульса, // соответствующая максимальной скорости против часовой стрелки CW. // Опциональный и по умолчанию стоит 2400 мкс. // Данные возьмите из технических характеристик мотора servo.attach(SERVO_PIN, 544, 2400); } void loop() { // Перебираем значения скорости вала сервы // от нуля до максимальной по часовой стрелке CW for (int speed = 0; speed < 255; speed++) { // Отправляем текущую скорость на серво servo.writeSpeed(speed); // Ждём 10 мс delay(10); } // Останавливаем сервопривод servo.writeSpeed(0); // Ждём 1 секунду delay(1000); // Перебираем значения скорости вала сервы // от нуля до максимальной против часовой стрелке CCW for (int speed = 0; speed > -255; speed--) { // Отправляем текущую скорость на серво servo.writeSpeed(speed); // Ждём 10 мс delay(10); } // Останавливаем сервопривод servo.writeSpeed(0); // Ждём 1 секунду delay(1000); }
После прошивки устройства вал сервопривода будет плавно разгоняться то в одну сторону, то в другую.
Считывание угла сервопривода
В продолжении считаем текущее положение вала мотора. Важно отметить, что лишь малая часть сервоприводов позволяет считывать данные обратной связи через отдельный провод.
Для теста сыграем в игру «Угадай угол». Будем включать сервопривод на максимальной скорости на случайный промежуток времени и после остановки измерять текущий угол вала.
Схема устройства

Код для Arduino IDE
- servo-pdm-continuous-rotation-speed-feedback.ino
-
// Библиотека с расширенными функциями для работы с Servo #include <AmperkaServo.h> // Создаём объект для работы с сервомоторами AmperkaServo servo; // Задаём имя пина, к которому подключён сервопривод constexpr uint8_t SERVO_PIN = 9; // Задаём имя пина FB, к которому подключён сервопривод constexpr uint8_t SERVO_PIN_FB = A5; void setup() { // Открываем Serial-порт Serial.begin(9600); // Подключаем сервомотор // servo.attach(SERVO_PIN); // Подключаем сервомотор с расширенными параметрами // Советуем использовать именно этот вариант для точной настройки мотора // servo.attach(pin, minPulseWidth, maxPulseWidth); // - pin: номер пина, к которому подключён сервопривод // - minPulseWidth: минимальная ширина импульса, соответствующая // максимальной скорости по часовой CW или против часовой CCW стрелки. // Опциональный и по умолчанию стоит 544 мкс. // - maxPulseWidth: максимальная ширина импульса, соответствующая // максимальной скорости по часовой CW или против часовой CCW стрелки. // Опциональный и по умолчанию стоит 2400 мкс. // - minAngle: минимальный угол поворота сервопривода. // Опциональный и по умолчанию стоит 0°. // Для сервопривода постоянного вращения установите 0°. // - maxAngle: максимальный угол поворота сервопривода. // Опциональный и по умолчанию стоит 180°. // Для сервопривода постоянного вращения установите 360°. // Данные возьмите из технических характеристик мотора // Если направление вращения окажется противоположным, // поменяйте показания импульсов местами servo.attach(SERVO_PIN, 544, 2400, 0, 360); // Подключаем обратную связь сервомотора // servo.attachFB(pinFB, voltageFBCW, voltageFBCCW); // - pinFB: номер пина, к которому подключён сигнал обратной связи от сервопривода // - voltageFBCW: напряжение обратной связи в крайнем положении по часовой стрелке CW // - voltageFBCCW: напряжение обратной связи в крайнем положении против часовой стрелки CCW // Данные возьмите из технических характеристик мотора servo.attachFB(SERVO_PIN_FB, 0, 3.3); } void loop() { // Задаём максимальную скорость вращения сервопривода по часовой стрелке CW servo.writeSpeed(255); // Ждём от 1 до 5 секунд delay(random(1000, 5000)); // Останавливаем сервопривод servo.writeSpeed(0); // Ждём одну секунду для полной остановки мотора delay(1000); // Считываем и выводим текущий угол сервопривода Serial.println(servo.readAngleFB()); // Ждём одну секунду для просмотра результата delay(1000); }
После прошивки устройства вал сервопривода будет вращаться случайный промежуток времени и выводить в Serial-порт угол после остановки.
Примеры работы для Espruino
Мозгом для проекта выступит платформа из семейства Espruino, например Iskra JS.
Подключение и настройка
Для наглядности схемы мы используем подключение сервопривода напрямую к контроллеру, без внешнего питания. Если вам нужен дополнительный блок питания, сверьтесь со схемами в разделе про питание сервопривода.
Что понадобится
Схема устройства
Для быстрой сборки и отладки устройства рекомендуем взять плату расширения Troyka Shield, которая надевается сверху на Iskra JS методом бутерброда.
Программная настройка
Вращение вала
Для старта протестируем мотор в трёх режимах вращения:
-
Максимальная скорость по часовой стрелке (CW).
-
Пауза — вал мотора стоит на месте.
-
Максимальная скорость против часовой стрелки (CCW).
Код для Espruino IDE
- servo-pdm-continuous-rotation-speed.js
-
// Подключаем сервопривод к пину 9 через библиотеку Servo var servo = require("@amperka/servo").connect(P9); // Создаём таймер, тикающий каждые 3 секунды var timerServo = require("@amperka/timer").create(3); // Задаём максимальную скорость сервопривода // По часовой и против часовой стрелки var SPEED_MAX_CW = 544; var SPEED_MAX_CCW = 2400; var SPEED_STOP = (SPEED_MAX_CW + SPEED_MAX_CCW) / 2; // Скорость вращения сервопривода var speed = SPEED_MAX_CW; // Функция вращения сервопривода function startServo() { servo.write(speed,'us'); // Запускаем таймер timerServo.run(); } // Подписываемся на событие таймера timerServo.on("tick", function () { // Останавливаем сервопривод servo.write(SPEED_STOP,'us'); // Запускаем мотор в противоположную сторону через одну секунду setTimeout(function () { if (speed == SPEED_MAX_CW) { speed = SPEED_MAX_CCW; } else if (speed == SPEED_MAX_CCW) { speed = SPEED_MAX_CW; } startServo(); }, 1000); }); // Выполняем событие таймера немедленно timerServo.tick();
После прошивки устройства вал сервопривода будет сначала вращаться с максимальной скоростью по часовой стрелке, сделает паузу, а затем начнёт вращение против часовой стрелки.

Вращение вала с плавным разгоном
Усложним задачу. Сделаем плавный разгон вала по очереди в каждую сторону:
-
Плавный разгон до максимальной скорости по часовой стрелке (CW).
-
Пауза — вал мотора стоит на месте.
-
Плавный разгон до максимальной скорости против часовой стрелки (CCW).
Код для Espruino IDE
- servo-pdm-continuous-rotation-speed-sweep.js
-
// Подключаем сервопривод к пину 9 через библиотеку Servo var servo = require("@amperka/servo").connect(P9); // Задаём максимальную скорость сервопривода // По часовой и против часовой стрелки var SPEED_MAX_CW = 544; var SPEED_MAX_CCW = 2400; var SPEED_STOP = (SPEED_MAX_CW + SPEED_MAX_CCW) / 2; // Переменная для хранения ID анимации var idAnimServo; // Создаём объект анимация // для плавного изменения параметров вращения мотора var animServo = require("@amperka/animation") .create({ // Начальное значение скорости from: SPEED_STOP, // Конечное значение скорости to: SPEED_MAX_CW, // Продолжительность полного перехода // за 3 секунды мотор пройдёт диапазон значений от 0 до 180 duration: 3, // Шаг обновления: каждые 20 мс updateInterval: 0.02, }) .queue({ // Начальное значение скорости from: SPEED_STOP, // Конечное значение скорости to: SPEED_MAX_CCW, // Продолжительность полного перехода // за 3 секунды мотор пройдёт диапазон значений от 180 до 0 duration: 3, }); // Запускаем анимацию idAnimServo = animServo.play(); // Обработчик анимации animServo.on("update", function (val) { servo.write(val,'us'); // Если анимация закончилась, // Запускаем её повторно if (idAnimServo._intervalID == null) { idAnimServo = animServo.play(); } });
После прошивки устройства вал сервопривода будет плавно разгоняться то в одну сторону, то в другую.
Примеры работы для Raspberry Pi
Подключение и настройка
Для наглядности схемы мы используем подключение сервопривода напрямую к контроллеру, без внешнего питания. Если вам нужен дополнительный блок питания, сверьтесь со схемами в разделе про питание сервопривода.
Что понадобится?
Схема устройства
Для быстрой сборки и отладки устройства рекомендуем взять плату расширения Troyka HAT, которая надевается сверху на Raspberry Pi методом бутерброда.
Имена пинов на Troyka HAT относятся к нумерации Wiring Pi, которая отличается от стандартной нумерации BCM/GPIO одноплатника Raspberry Pi. Подробности смотрите в распиновке Troyka HAT и нумерации в библиотеке.

Программная настройка
-
Для работы примеров понадобится модуль Servo из штатной библиотеки GPIO Zero.
Вращение вала
Для старта протестируем мотор в трёх режимах вращения:
-
Максимальная скорость по часовой стрелке (CW).
-
Пауза — вал мотора стоит на месте.
-
Максимальная скорость против часовой стрелки (CCW).
Код для Python
- servo-pdm-continuous-rotation-speed.py
-
# Библиотека для работы с сервоприводами from gpiozero import Servo # Библиотека для работы со временем from time import sleep # Создаём объект для работы с сервоприводом # - pin: номер пина, к которому подключён сервопривод # WPIx, нумерация WiringPi, где x — номер пина # GPIOx, нумерация GPIO/BCM, где x — номер пина # - min_pulse_width: ширина импульса, соответствующая # максимальной скорости по часовой стрелке CW # Опциональный и по умолчанию стоит: 0.001 c = 1000 мкс # - max_pulse_width: ширина импульса, соответствующая # максимальной скорости против часовой стрелки CCW # Опциональный и по умолчанию стоит: 0.002 c = 2000 мкс # Подробности нумерации: https://gpiozero.readthedocs.io/en/stable/recipes.html#pin-numbering # Каждая модель сервопривода имеет свои характеристики servo = Servo("WPI6", min_pulse_width=0.000544, max_pulse_width=0.0024) while True: # Задаём максимальную скорость вращения сервопривода по часовой стрелке servo.min() # Ждём 1 секунду sleep(1) # Останавливаем сервопривод servo.mid() # Ждём 1 секунду sleep(1) # Задаём максимальную скорость вращения сервопривода против часовой стрелки servo.max() # Ждём 1 секунду sleep(1) # Останавливаем сервопривод servo.mid() # Ждём 1 секунду sleep(1)
После прошивки устройства вал сервопривода будет сначала вращаться с максимальной скоростью по часовой стрелке, сделает паузу, а затем начнёт вращение против часовой стрелки.

Вращение вала с плавным разгоном
Усложним задачу. Сделаем плавный разгон вала по очереди в каждую сторону:
-
Плавный разгон до максимальной скорости по часовой стрелке (CW).
-
Пауза — вал мотора стоит на месте.
-
Плавный разгон до максимальной скорости против часовой стрелки (CCW).
Код для Python
- servo-pdm-continuous-rotation-speed-sweep.py
-
# Библиотека для работы с сервоприводами from gpiozero import Servo from time import sleep # Библиотека для расширенных методов обработки чисел import numpy as np # Создаём объект для работы с сервоприводом # - pin: номер пина, к которому подключён сервопривод # WPIx, нумерация WiringPi, где x — номер пина # GPIOx, нумерация GPIO/BCM, где x — номер пина # - min_pulse_width: ширина импульса, соответствующая # максимальной скорости по часовой стрелке CW # Опциональный и по умолчанию стоит: 0.001 c = 1000 мкс # - max_pulse_width: ширина импульса, соответствующая # максимальной скорости против часовой стрелки CCW # Опциональный и по умолчанию стоит: 0.002 c = 2000 мкс # Подробности нумерации: https://gpiozero.readthedocs.io/en/stable/recipes.html#pin-numbering # Каждая модель сервопривода имеет свои характеристики servo = Servo("WPI6", min_pulse_width=0.000544, max_pulse_width=0.0024) # Задаём максимальную скорость вращения сервопривода # По часовой (CW) и против (CCW) часовой стрелки SPEED_MAX_CW = -1 SPEED_MAX_CCW = 1 SPEED_STOP = 0 # Шаг сервопривода step_angle_servo = 0.005 while True: # Перебираем значения скорости вала сервы от 0 до максимального по часовой стрелке for val in np.arange(SPEED_STOP, SPEED_MAX_CW, -step_angle_servo): servo.value = val sleep(0.02) # Останавливаем сервопривод servo.value = SPEED_STOP # Ждём 1 секунду sleep(1) # Перебираем значения скорости вала сервы от 0 до максимального против часовой стрелки for val in np.arange(SPEED_STOP, SPEED_MAX_CCW, step_angle_servo): servo.value = val sleep(0.02) # Останавливаем сервопривод servo.value = SPEED_STOP # Ждём 1 секунду sleep(1)
После прошивки устройства вал сервопривода будет плавно разгоняться то в одну сторону, то в другую.
Библиотеки
Полезные статьи
Что такое сервопривод?
Сервопривод — это электродвигатель с редуктором и блоком управления в одном корпусе.
Сервоприводы используются для открывания/закрывания заслонок, поворота различных механизмов на заданный градус и в качестве суставов при создании разнообразных DIY-роботов.
Элементы сервопривода
Рассмотрим основные элементы сервопривода.
Электромотор
За преобразование электрической энергии в механическую отвечает электромотор. В зависимости от модели, сервопривод может быть наделён одним из трёх видов моторов:
- Коллекторный мотор с сердечником (Brush motor)
- Коллекторный мотор без сердечника (Coreless motor)
- Бесколлекторный мотор (Brushless motor)
Редуктор
На практике, скорость вращения мотора слишком большая, а крутящий момент — наоборот слишком маленький. Для решения двух проблем выходной вал мотора соединён с группой шестеренок, которые позволяют увеличить крутящий момент, но при этом пропорционально снизить скорость вращения выходного вала.
Шестерни редуктора могут быть пластиковые или металлические.
- Пластиковые шестерни изготавливаются из силикона или нейлона, они мало весят и мало стоят, но не способны вытягивать большие нагрузки. Сервоприводы с пластиковым редуктором довольно популярные в любительских проектах.
- Металлические шестерни изготавливаются из латуни или меди, они много весят и много стоят, но зато способны вытягивать большие нагрузки. Сервоприводы с металлическим редуктором применяются в устройствах, где требуется мускулы и сила.
Выходной вал
Выходной вал сервопривода — это последняя шестерёнка редуктора, которая выведена за пределы корпуса. К выходному валу крепится требуемая нагрузка: например качалка, втулка, тянущие или толкающие механизмы. Диаметр выходного вала и количество на нём зубьев отличается между разными моделями сервоприводов.
Схема управления
Для обработки входного сигнала с внешнего контроллера в сервоприводе расположена схема управления.
- В сервоприводе с удержанием угла, блок управления принимает импульсы, сравнивает их с показателем датчика обратной связи и по результату управляет мотором.
- В сервоприводе постоянного вращения, блок управления принимает импульсы и преобразует их в постоянное вращения с заданной скоростью.
Схема управления может быть аналоговой или цифровой.
В аналоговом сервоприводе входные данные c внешнего контроллера анализируются логической микросхемой. Аналоговый чип принимает внешние импульсы с частотой 50 Гц, а значит время реакции мотора составляет около 20 мс.
В цифровом сервоприводе входные данные анализируются собственным микроконтроллером. Контроллер принимает внешние импульсы с частотой 50 Гц, но позволяет увеличить внутреннюю частоту сигнала с 50 Гц до 500 Гц. В итоге время реакции мотора может сократится до 2 мс.
Характеристики сервопривода
Рассмотрим основные характеристики сервопривода.
Крутящий момент
Крутящий момент отвечает за ускорение выходного вала и его способность преодолевать сопротивление вращению. Чем выше крутящий момент, тем больше возможностей у мотора реализовать свой потенциал.
Крутящий момент высчитывается путём произведения максимального веса груза на длину рычага, который способен удержать сервопривод. При увеличении длины рычага, пропорционально уменьшается максимальный вес груза и наоборот. Например, если крутящий момент равен 10 кг·см:
- Сервопривод удержит груз 10 кг на рычаге длиной 1 см.
- Сервопривод удержит груз 5 кг на рычаге длиной 2 см.
- Сервопривод удержит груз 1 кг на рычаге длиной 10 см.
Скорость поворота
Скорость поворота — это время, за которое выходной вал сервопривода успевает повернуться на 60°. Из неё можно вычислить скорость в оборотах в минуту для сервопривода постоянного вращения.
Размеры
Внешне сервоприводы различаются между собой по формфактору и размеру. Для получения точных размеров используйте приложенные габаритные чертежи на каждый сервопривод.
Питание сервопривода
Напряжение к серве можно подключать двумя способами: без внешнего источника питания и с внешним источником питания.
Без внешнего источника питания
Если сервопривод питается напряжением 5 вольт и потребляет ток менее 500 мА, можно запитать сервомотор непосредственно от контроллера.
| Цвет провода | Контакт | Функция | Подключение |
|---|---|---|---|
| Оранжевый / Жёлтый / Белый | S | Пин управления сервоприводом | Подключите к пину ввода-вывода микроконтроллера. |
| Красный | V | Питание | Подключите к питанию микроконтроллера. |
| Коричневый / Чёрный | G | Земля | Подключите к земле микроконтроллера. |
С внешним источником питания
Если сервопривод питается напряжением свыше 5 вольт или потребляет ток более 500 мА, то ему необходим внешний источник питания с соответствующими характеристиками.
| Цвет провода | Контакт | Функция | Подключение |
|---|---|---|---|
| Оранжевый / Жёлтый / Белый | S | Пин управления сервоприводом | Подключите к пину ввода-вывода микроконтроллера. |
| Красный | V | Питание | Подключите к внешнему источнику питания с подходящим напряжением. |
| Коричневый / Чёрный | G | Земля | Подключите к земле внешнего источника питания и земле микроконтроллера. |
Сервоприводы с удержанием угла
Сервоприводы с удержанием угла — это моторы, которые преобразуют управляющие сигналы в установку и удержание заданного угла.
Интерфейс управления
Для управления мотором с удержанием угла необходимо подавать сигнал PDM (Pulse Duration Modulation) — импульсы постоянной частоты и переменной ширины. При поступлении с внешнего контроллера управляющего импульса, начинка сервопривода генерирует свой сигнал, длительность которого определяется датчиком обратной связи. Далее схема сравнивает длительность двух импульсов:
- Если длительность разная → электромотор включается. Направление вала зависит от знака разности импульсов.
- Если длины импульсов равны → электромотор останавливается.
В сигнале PDM частота импульсов постоянна и равна 50 Гц, т.е. период подачи импульсов равен 20 мс. А вот ширина импульса изменяется, и именно от неё зависит выходной угол удержания мотора. Принято считать, что диапазону выходного угла 0–180° соответствует ширина импульса 500–2500 мкс.
| Период импульсов | Ширина импульса | Положение сервопривода |
|---|---|---|
| 20 мс | 544 мск | Выходной вал установлен в максимальное положение по часовой стрелке CW — 0°. |
| 20 мс | 1540 мкс | Выходной вал установлен в условную середину относительно крайних максимальных точек CW и CWW — 90°. |
| 20 мс | 2400 мкс | Выходной вал установлен в максимальное положение против часовой стрелке CCW — 180°. |
Примеры работы
Сервоприводы постоянного вращения
Сервоприводы постоянного вращения — это моторы, которые преобразуют управляющие сигналы в заданную скорость вращения вала в любом направлении без ограничений по углу поворота.
Интерфейс управления
Для управления мотором постоянного вращения необходимо подавать особый сигнал PDM (Pulse Duration Modulation) — импульсы постоянной частоты и переменной ширины. При поступлении с внешнего контроллера управляющего импульса начинка сервопривода генерирует свой сигнал мотору.
В сигнале PDM частота импульсов постоянна и равна 50 Гц, т. е. период подачи импульсов равен 20 мс. А вот ширина импульса изменяется, и именно от неё зависит направление и скорость вращения мотора. Принято считать, что рабочая ширина импульса лежит в пределах 544–2400 мкс.
| Период импульсов | Ширина импульса | Положение сервопривода |
|---|---|---|
| 20 мс | 544 мск | Выходной вал вращается по часовой стрелке (CW) с максимальной скоростью. |
| 20 мс | 1540 мкс | Выходной вал не вращается вовсе, т.е. стоит на месте. |
| 20 мс | 2400 мкс | Выходной вал вращается против часовой стрелке (CCW) с максимальной скоростью. |
Примеры работы
Список моделей в магазине
- Микросервопривод TianKongRC TS90A
- Микросервопривод TianKongRC TS90D
- Микросервопривод TianKongRC MG90S
- Микросервопривод TianKongRC MG90D
- Микропривод постоянного вращения Tower Pro SG90
- Микросервопривод Tower Pro SG92R
- Сервопривод Tower Pro MG995
- Сервопривод Tower Pro MG996R
- Привод постоянного вращения DS04-NFC
- Сервопривод TianKongRC TD-8120MG
Ресурсы
- Руководство по использованию для Arduino.
- Руководство по использованию для Raspberry Pi.
Библиотеки
- Библиотека для Arduino
- Библиотека для Raspberry Pi
Управление сервоприводом Ардуино
Управление сервоприводом Ардуино
Сегодня мы поговорим про серводвигатели или сервоприводы, можно сказать и так и так.
Рассмотрим 2 модели двигателей.
- С фиксированным углом 180° градусов
- Сервопривод непрерывного вращения на 360° градусов.
Напишем простой скетч для управления движением одной и двумя сервами.
Если вы посмотрите видео, то там показано как я подключил лазер и управлял им двумя сервоприводами. И даже нарисовал квадрат. Правда на камеру снялось не очень хорошо, но движения были ровными и прямые и углы были чётко выражены.
Так что же такое сервопривод?
Сервопривод — это механизм с электромотором и с управлением обратной связи, который может вращать механический привод на заданный угол с заданной скоростью.
Отличия сервопривода от шагового мотора.
- Шаговый двигатель просто считает «шаги», сколько он должен прошагать в секунду, чтобы оказаться в месте назначения.
Его недостатки — это возможность потери шагов при больших нагрузках.
- В сервоприводах используется механизм обратной связи, поэтому он может обрабатывать ошибки и исправлять их.
Такая система называется следящей. Про шаговый двигатель я уже делал видео, посмотреть можно на моём канале.
Наиболее популярны типы сервоприводов:
- сервоприводы которые удерживают заданный угол
- сервоприводы поддерживающие заданную скорость вращения.
Управлять сервоприводом можно вручную, т.е. написав код самому или с помощью библиотеки Servo.h входящей в состав ARDUINO IDE, или библиотеки Servo2.h, если вам необходимо работать с приёмниками/ передатчиками работающими на частоте 433 МГц.
Библиотека VirtualWire.h используют одно и то же прерывание, что и Servo.h. Это означает, что их нельзя использовать в одном проекте одновременно.
Мы рассмотри вариант с библиотекой, так как он намного проще.
Подключение сервопривода к Ардуино.
Сервопривод обладает тремя контактами, провода которые идут к ним окрашены в разные цвета.
- Коричневый провод ведет к земле,
- красный – к питанию +5В,
- провод оранжевого или желтого цвета – сигнальный.
Не рекомендуется подключать мощные сервоприводы напрямую к плате , т.к. они потребляют большой ток, что может вывести из строя вашу Ардуино или вызовут другие симптому, например перегрузку платы или постоянном “дергании” сервопривода.
Для питания лучше использовать внешние источники, обязательно объединяя земли двух контуров.
Ограничение по количеству подключаемых сервоприводов
На большинстве плат Arduino библиотека Servo.h поддерживает управление не более 12 сервоприводами, на Arduino Mega это число вырастает до значения 48.
При этом есть небольшой побочный эффект использования этой библиотеки: если вы работаете не с Arduino Mega, то становится невозможным использовать функцию analogWrite() на 9 и 10 контактах независимо от того, подключены сервоприводы к этим контактам или нет.
Управление движением сервопривода
Управление движением сервопривода зависит от длинны импульсов.
Частота импульсов 50Гц. — это значит, что импульс срабатывает каждые 20мс.
Длительность импульса.
- 1520мкс = 90 градусов среднее положение
- 544мкс = 0 градусов
- 2400мкс = 180 градусов
В библиотеке Servo.h для Arduino по умолчанию выставлены следующие значения длин импульса: 544 мкс — для 0° и 2400 мкс — для 180°.
Плата управления анализирует сигнал на управляющем проводе, и если информация об угле поворота содержащаяся в сигнале отличается от фактического положения вала, то он поворачивается до тех пор, пока его положение не сравняется с заданным.
Скорость перемещения можно изменять либо путем изменения задержки между шагами функцией delay(), либо путем изменения шага, а именно правкой последнего значения в аргументах цикла — for (pos = 180; pos >= 0; pos -= 1)
Сервопривод SG90.
Характеристики и подключение SG-90
Если вы собрались купить самый дешевый и простой сервопривод, то SG 90 будет лучшим вариантом. Этот сервопривод чаще всего используется в управлении небольшими легкими механизмами с углом поворота от 0° до 180°.
Технические характеристики SG90:
- Скорость отработки команды 0,12с/60 градусов;
- Питание 4,8В; Питание 5 вольт допустимо.
- Рабочие температуры от -30°С до 60°С;
- Размеры 3,2 х 1,2 х 3 см;
- Вес 9 г.
Описание SG90.
Скорость поворота — это время поворота на угол 60°;
Крутящий момент (кг/см) — эта величина говорит о том, какой вес в килограммах выдерживает двигатель, при длине рычага в 1 см от вала;
Напряжение питания и потребляемый ток;
Такой сервопривод стоит недорого, поэтому он не обеспечивает точных настроек начальных и конечных позициях.
Для того, чтобы избежать лишних перегрузок и характерного треска, в положении 0° и 180° градусов лучше выставлять крайние точки в 10° и 170°.
При работе устройства важно следить за напряжением питания.
При сильной нагрузке могут повредиться механические элементы зубчатых механизмов, т.к. они пластмассовые.
Сервопривод непрерывного вращения на 360 градусов.
Сервопривод MG995
Сервопривод MG995 является второй по популярности моделью сервоприводов, чаще всего подключаемых к проектам Arduino. Это относительно недорогие сервоприводы, обладающие гораздо лучшими характеристиками по сравнению с SG90. Они выпускаются в двух модификациях, как обычные сервопривода, так и сервоприводы непрерывного вращения. В таком варианте управлять поворотом на определённый угол очень затруднительно, а управлять можно только скоростью и направлением вращения.
При этом важно отметить, что такой сервопривод не может поворачиваться на определенный угол и делать строго заданное количество оборотов.
#include <Servo.h>
Servo myservo;
void setup(){
myservo.attach(9);
myservo.write(90);
}
void loop(){
}
Отличие сервоприводов непрерывного вращения отличается в том, что функция Servo.write(angle) задаёт не угол, а скорость вращения привода:
|
Функция Arduino |
Сервопривод 180° |
Сервопривод 360° |
|
Servo.write(0) |
Крайне левое положение |
Полный ход в обратном направлении |
|
Servo.write(90) |
Среднее положение |
Остановка сервопривода |
|
Servo.write(180) |
Крайне правое положение |
Полный ход в прямом направлении |
Например.
Функция Servo.write(0) заставит сервопривод вращаться против часовой стрелки на полной скорости.
Функция Servo.write(90) остановит двигатель, а
Servo.write(180) будет вращать вал по часовой стрелке на полной скорости.
Описание работы скетчей показанных в видео, которые можно скачать в описании к видео.
Servo1
Подключаем сервомотор к пину 9 и программируем его на движение
Устанавливаем в нулевое положение
Затем двигаем на 90° градусов
Потом ещё на 90° и оказываемся в положении 180° градусов. Это максимально значение для этого сервомотора.
Потом возвращаемся в 90°, а затем снова в начальное положение.
В ноль.
Servo2
Подключаем два сервомотора.
Первый к пину 9 , второй к пину 10
Первую серву устанавливаем в начальное положение 0°, а вторую 180°.
Теперь если поставить их рядом то они будут двигаться в противоположных направлениях.
Servo3
Подключаем два сервомотора.
Первый к пину 9 , второй к пину 10
И подключаем два потенциометра по 10 кОм каждый.
Два крайних вывода подключаем к питанию.
Один к плюсу. Другой к земле.
А средний контакт к Аналоговому входу А 1, другой к А 2
Первую и вторую серву устанавливаем в начальное положение 0°.
Теперь можно управлять движением обоих сервомоторов просто вращая потенциометры.
Теперь посмотрим другой тип сервоприводов, а именно сервоприводы с непрерывным вращением.
Они могут вращаться на 360 градусов, но у них есть недостаток, они не могут повернуться на определённый угол.
У них можно управлять только скоростью вращения.
Servo4
Для Сервомоторов с непрерывным вращением также используется библиотека Servo.h
Только управление происходит не по градусам, а управляется скоростью.
90° это полная остановка,
А 0° и 180° это максимальные значения в одну и другую сторону.
В примере показано, что сначала мотор двигается с максимально скоростью против часовой стрелки 4 секунды.
Затем останавливается и ждёт 2 секунды.
Затем плавно ускоряется по часовой стрелке до максимума.
Потом остановка, и всё сначала.
Servo5
Теперь попробуем нарисовать лазером прямоугольник.
Для этого подключим лазер, Он подключается как обычный светодиод.
Если вы не знаете как подключить светодиод, то можете посмотреть моё видео, я там подробно описал как это сделать.
Если вы смотрели предыдущие примеры, то для вас это не составит труда.
В вкратце. Здесь в циклах for() мы даём команду сервомотору двигаться по определённому пути.
Servo6
Просто движение сервомоторов от минимальной до максимальной скорости.
В этом примере я изменил скорость вращения в цикле for().
Теперь он будет делать по 3 шага вместо 1.
Servo7
Управление через COM
Здесь я передаю градусы поворота.
Первые — это для первого сервопривода, вторые для второго.
Смотрите в видео.
Не забываем подписываться на канал, если вам интересно что я делаю.
Ставим лайк и оставляем комментарии – этим вы покажете мне, что я не просто так делаю обучающие уроки.
До встречи.


























