Главная chevron_right Уроки chevron_right Электроника chevron_right Управление сервоприводом с Arduino: основы

Управление сервоприводом с Arduino: основы

Подключаем сервопривод к Arduino и управляем им с помощью потенциометра или автоматической развёртки — два готовых примера с пояснениями.

Библиотека Servo Library — удобный и надёжный инструмент для управления сервоприводами. В этом уроке разберём два классических примера, которые подойдут для любой платы Arduino.

Первый пример — Knob — управляет положением RC-сервопривода (servo motor) с помощью потенциометра. Второй — Sweep — автоматически поворачивает вал сервопривода туда и обратно на 180 градусов.

Подробнее о возможностях библиотеки можно узнать в Servo GitHub repository.

Что понадобится

  • Плата Arduino
  • Сервопривод
  • Потенциометр 10 кОм
  • Провода для подключения
  • Конденсаторы
  • Внешний источник питания

Питание сервопривода

Сервоприводы потребляют очень разное количество энергии — всё зависит от размера мотора и нагрузки. Типичный небольшой сервопривод, например Feetech Mini Servo Motor, в режиме ожидания потребляет от 5 до 6 mA при напряжении 4,8–6 В. В покое это немного.

Как только мотор начинает двигаться, потребление тока резко возрастает. Если добавить нагрузку или заблокировать вал, ток растёт ещё сильнее — в таком режиме потребление может достигать 800 mA.

Такой ток небезопасно брать напрямую с пинов Arduino: это почти наверняка повредит плату. Поэтому сервопривод нужно питать от внешнего источника. Выбор источника зависит от конкретного мотора — всегда смотрите спецификацию и обращайте внимание на следующие параметры:

  • диапазон рабочего напряжения
  • ток холостого хода — потребление в состоянии покоя
  • рабочий ток — потребление при свободном движении
  • ток стопорения — потребление при максимальной нагрузке или заблокированном вале

Для сервопривода с питанием 4,8–6 В подойдёт адаптер 5 В / 1 А: обрежьте кабель и подключите провода к сервоприводу через макетную плату.

_Note что USB обычные USB-зарядки ограничены 500 mA (USB 2.0) или 900 mA (USB 3.0)._

Если проект должен быть мобильным, используйте аккумуляторы. Для стабильных 5 В хорошо подходят два аккумулятора 18650 Li-Ion вместе с понижающим DC-DC преобразователем (step-down). Без него напряжение двух таких банок составит около 7,4 В, что выходит за пределы допустимого для большинства сервоприводов.

_If вы используете более мощные или несколько сервоприводов — обязательно пересчитайте требования по току._

Зачем нужен конденсатор

Конденсаторы настоятельно рекомендуются при питании сервоприводов. Они сглаживают скачки напряжения, которые возникают при резком изменении нагрузки, снижают электрические помехи и делают работу мотора более стабильной.

При использовании Feetech Mini Servo Motor рекомендуется поставить конденсатор ёмкостью 100 мкФ.

Capacitor

Электролитический конденсатор: обозначение отрицательного и положительного выводов. Отрицательный вывод (−) часто отмечен белой полосой, положительный (+) — более длинной ножкой.

_Because некоторые конденсаторы полярные (имеют строго определённое направление подключения). Перед установкой проверьте маркировку: белая полоска, знак «+» или более длинный вывод. Совместите полярность конденсатора с полярностью в цепи и не превышайте допустимое напряжение. Неправильное подключение может привести к протечке электролита или разрушению компонента._

Подробнее о конденсаторах читайте here.

Схема подключения

Сервопривод имеет три провода: питание, земля и сигнал.

  • Красный провод — питание, подключается к положительному полюсу (+) источника питания.
  • Чёрный или коричневый провод — земля, подключается к отрицательному полюсу (−).
  • Жёлтый или оранжевый провод — сигнал, подключается к пину PWM на плате. В обоих примерах используется пин 9.

Практическое замечание: землю внешнего источника питания обязательно соедините с GND Arduino. Без общей земли сигнальный провод сервопривода не будет работать корректно — это одна из самых частых ошибок новичков.

Схема для примера Knob

Для примера Knob подключите потенциометр так: два крайних вывода — к питанию (+5V) и земле, средний вывод (движок) — к пину A0 на плате. Сервопривод подключите согласно схеме ниже.

The Knob Circuit.

Схема «Knob» (потенциометр): подключение сервопривода и потенциометра к Arduino Uno с внешним источником питания.

Схема для примера Sweep

Для примера Sweep потенциометр не нужен. Подключите только сервопривод согласно схеме ниже.

The Sweep Circuit.

Схема «Sweep»: подключение сервопривода к Arduino Uno с внешним источником питания.

Примеры кода

Knob — управление сервоприводом через потенциометр

Программа считывает аналоговое значение с потенциометра (пин A0) и преобразует его в угол поворота сервопривода от 0 до 180 градусов. Поворачивайте ручку — вал сервопривода будет следовать за ней в реальном времени.

#include <Servo.h>

Servo myservo;  // создаём объект servo для управления сервоприводом

int potpin = 0;  // аналоговый пин для подключения потенциометра
int val;    // переменная для хранения значения с аналогового пина

void setup() {
  myservo.attach(9);  // подключаем сервопривод на пине 9 к объекту servo
}

void loop() {
  val = analogRead(potpin);            // считываем значение потенциометра (от 0 до 1023)
  val = map(val, 0, 1023, 0, 180);     // масштабируем значение для использования с сервоприводом (от 0 до 180)
  myservo.write(val);                  // устанавливаем положение сервопривода согласно масштабированному значению
  delay(15);                           // ждём, пока сервопривод достигнет позиции
}

Sweep — автоматическая развёртка на 180 градусов

Программа плавно поворачивает вал сервопривода от 0° до 180° и обратно в бесконечном цикле. Никакого дополнительного управления не требуется — удобно для проверки исправности мотора и диапазона его движения.

#include <Servo.h>

Servo myservo;  // создаём объект servo для управления сервоприводом
// на большинстве плат можно создать до двенадцати объектов servo

int pos = 0;    // переменная для хранения позиции сервопривода

void setup() {
  myservo.attach(9);  // подключаем сервопривод на пине 9 к объекту servo
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // движение от 0 до 180 градусов
    // с шагом 1 градус
    myservo.write(pos);              // отправляем сервопривод в позицию, заданную переменной 'pos'
    delay(15);                       // ждём 15 мс, пока сервопривод достигнет позиции
  }
  for (pos = 180; pos >= 0; pos -= 1) { // движение от 180 до 0 градусов
    myservo.write(pos);              // отправляем сервопривод в позицию, заданную переменной 'pos'
    delay(15);                       // ждём 15 мс, пока сервопривод достигнет позиции
  }
}

Типичные ошибки

  • Сервопривод дёргается или не удерживает позицию — скорее всего, недостаточно тока от источника питания. Проверьте, что блок питания рассчитан на нужный ток.
  • Arduino перезагружается при движении сервопривода — сервопривод питается от пина 5V платы и тянет слишком много тока. Переведите питание мотора на внешний источник.
  • Нет общей земли — сервопривод не реагирует на сигнал, хотя питание есть. Убедитесь, что GND внешнего источника и GND Arduino соединены.
  • Конденсатор подключён с обратной полярностью — это может повредить как конденсатор, так и остальную схему. Всегда проверяйте маркировку перед подключением.

Как проверить результат

Для примера Knob: медленно поворачивайте потенциометр — вал сервопривода должен плавно следовать за ним. Если движение рывками, попробуйте добавить небольшую задержку (delay(15)) после вызова write().

Для примера Sweep: после загрузки скетча сервопривод должен сразу начать двигаться туда и обратно без каких-либо дополнительных действий.