Основы работы с сервомоторами на Arduino

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

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

Вы также можете посетить репозиторий Servo на GitHub, чтобы узнать больше об этой библиотеке.

Необходимое оборудование

  • Плата Arduino

  • Сервомотор

  • Потенциометр 10 кОм

  • Соединительные провода

  • Конденсаторы

  • Источник питания

Питание сервомоторов

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

Но как только мотор начинает двигаться, он начинает потреблять больше энергии и получает её, забирая больший ток от источника питания.

Если двигатель испытывает более высокие нагрузки — например, при добавленном весе или объекте, блокирующем его движение, — ему естественным образом требуется ещё больше энергии для преодоления препятствия, и в результате потребление тока возрастает. Потребление тока упомянутого выше мотора может достигать 800 мА.

Такое высокое потребление тока, как правило, небезопасно для платы Arduino. Чтобы не повредить плату, необходимо питать сервомотор от внешнего источника питания. Выбор правильного источника питания зависит от используемого сервомотора, поэтому всегда проверяйте характеристики. Особое внимание обращайте на:

  • диапазон рабочего напряжения

  • ток холостого хода — потребление в состоянии покоя

  • рабочий ток — потребление при свободном движении

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

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

Примечание

USB-зарядные устройства ограничены 500 мА (USB 2.0) или 900 мА (USB 3.0).

Если ваш проект должен перемещаться свободно без привязки к розетке, вы также можете использовать батареи для питания сервомотора. Если вам нужно ровно 5 В, можно использовать две аккумуляторные батареи 18650 Li-Ion вместе с понижающим преобразователем напряжения (step-down converter).

Понижающий преобразователь необходим, потому что батареи 18650 Li-Ion дают около 7,4 В. Максимальный ток зависит от конкретной батареи, но большинство из них рассчитаны на выходной ток свыше 1 А, чего достаточно для питания небольшого сервомотора.

Важно

Если вы используете более крупные или несколько сервомоторов, обязательно пересчитайте требования к питанию соответствующим образом.

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

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

Конденсатор

Конденсатор

Предупреждение

Некоторые конденсаторы являются полярными (то есть имеют направление подключения), поэтому необходимо быть осторожными при их подключении в схему. Убедитесь, что подключаете их правильно: проверьте маркировку — белую полоску, символ «+» или более длинный вывод. Если на вашем конденсаторе есть такие обозначения, совместите их с соответствующими знаками в вашей схеме (следите за знаками «+» и «−») и не превышайте допустимое напряжение. Это предотвратит такие проблемы, как утечка или повреждение, которые могут вывести вашу схему из строя.

Подробнее о конденсаторах можно прочитать здесь.

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

Сервомоторы имеют три провода: питание, земля и сигнал. Провод питания, как правило, красный и должен подключаться к положительному полюсу (+) источника питания. Провод земли, как правило, чёрный или коричневый и должен подключаться к отрицательному полюсу (−) источника питания.

Сигнальный провод, как правило, жёлтый или оранжевый и должен подключаться к пину ШИМ на плате. В данных примерах используется пин 9.

Схема «Ручка»

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

Схема «Ручка»

Схема «Ручка»

Схема «Сканирование»

Для примера Sweep подключите сервомотор, как показано на схеме ниже.

Схема «Сканирование»

Схема «Сканирование»

Примеры

Ручка (Knob)

Управление положением сервомотора с помощью потенциометра (переменного резистора).

#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)

Поворот вала RC-сервомотора туда и обратно на 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 мс, пока сервомотор достигнет позиции
  }
}