Глиф Учебники

Урок 9. Сервоприводы и моторы

Курс «Arduino» · урок 9 из 10 · 6 минут чтения

Моторы делают проект живым: поворачивают заслонку, едут, открывают кормушку. Но мотор — первая деталь в курсе, которой мало тока с вывода платы. Поэтому здесь важнее всего не код, а питание.

Главное правило

Вывод Arduino Uno R3 рассчитан на ток до 20 мА. Даже маленькому мотору нужны сотни миллиампер, а при старте и под нагрузкой — ещё больше. Кроме того, мотор при выключении выдаёт обратный выброс напряжения, а пока работает — создаёт помехи в питании.

Не подключайте мотор к выводу платы напрямую и не питайте моторы от вывода 5V платы: сгорят вывод, стабилизатор платы или порт USB компьютера. Мотор подключается через драйвер или транзистор, а питается от отдельного источника.

И второе правило: GND отдельного источника соединяется с GND платы. Без общего «минуса» сигнал от платы драйвер не поймёт.

Сервопривод

Сервопривод (серво) — мотор с редуктором и платой управления внутри. Ему сообщают угол — от 0 до 180 градусов, — и он поворачивается в это положение и держит его. Самый распространённый маленький сервопривод — SG90.

У сервопривода три провода:

Угол задаётся импульсами: примерно 50 раз в секунду на сигнальный провод приходит импульс длиной около 1–2 мс, и от его длины зависит угол. Формировать импульсы вручную не нужно — это делает встроенная библиотека Servo.

Скетч поворачивает вал от 0 до 180 градусов и обратно (на основе примера File → Examples → Servo → Sweep):

Arduino
#include <Servo.h>

Servo servo;          // объект «сервопривод»

void setup() {
  servo.attach(9);    // сигнальный провод — на вывод 9
}

void loop() {
  for (int angle = 0; angle <= 180; angle++) {   // от 0 до 180 градусов
    servo.write(angle);
    delay(15);                                    // дать валу доехать
  }
  for (int angle = 180; angle >= 0; angle--) {   // и обратно
    servo.write(angle);
    delay(15);
  }
}
SG90 GND 5V вывод 9 коричневый или чёрный — GND красный — питание +5 В оранжевый, жёлтый или белый — сигнал 0° 90° 180° servo.write(90) servo.write(угол) угол от 0 до 180, держит его
Сервопривод SG90: коричневый провод к GND, красный к 5V, оранжевый к выводу 9; servo.write задаёт угол от 0 до 180°, при 90 вал стоит посередине.

Управление ручкой — потенциометр на A0, угол через map (пример Knob):

Arduino
#include <Servo.h>

Servo servo;

void setup() {
  servo.attach(9);
}

void loop() {
  int value = analogRead(A0);                // 0–1023
  int angle = map(value, 0, 1023, 0, 180);   // в угол 0–180
  servo.write(angle);
  delay(15);
}

Тонкости сервоприводов:

Мотор постоянного тока через драйвер

Обычный моторчик (как в игрушечной машинке) крутится, пока на него подано напряжение; поменяли полярность — крутится в другую сторону. Скорость регулируют ШИМ. Между платой и мотором ставят драйвер — микросхему, которая по слабому сигналу платы коммутирует сильный ток от отдельного источника. Популярные модули: L298N (старый и простой, греется и теряет на себе заметную часть напряжения — порядка 2 В) и TB6612FNG (экономнее). Оба управляют двумя моторами.

Подключение одного мотора к модулю типа L298N:

  1. Мотор — к клеммам OUT1 и OUT2.
  2. Источник для моторов (например, батарейный отсек на 6–9 В) — плюс к клемме питания моторов, минус — к GND модуля.
  3. GND модуля — к GND Arduino.
  4. IN1 → вывод 7, IN2 → вывод 8 (направление), ENA → вывод 5 (скорость, ШИМ). На многих модулях ENA закрыт перемычкой — для управления скоростью её снимают.
скорость направление общий GND M мотор Arduino вывод 5 вывод 7 вывод 8 GND драйвер L298N ENA IN1 IN2 OUT1 OUT2 перемычку снять питание моторов GND + − батарейный отсек 6–9 В — для мотора
Мотор через драйвер L298N: выводы 5, 7 и 8 идут на ENA, IN1 и IN2, мотор — на OUT1 и OUT2, батарейный отсек питает мотор, а GND платы, модуля и батареи общий.
Arduino
const int ENA = 5;   // скорость: вывод с ШИМ
const int IN1 = 7;   // направление
const int IN2 = 8;

void setup() {
  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
}

void loop() {
  digitalWrite(IN1, HIGH);   // вперёд
  digitalWrite(IN2, LOW);
  analogWrite(ENA, 200);     // скорость 200 из 255
  delay(2000);

  analogWrite(ENA, 0);       // стоп
  delay(1000);

  digitalWrite(IN1, LOW);    // назад
  digitalWrite(IN2, HIGH);
  analogWrite(ENA, 200);
  delay(2000);

  analogWrite(ENA, 0);       // стоп
  delay(1000);
}
мотор IN1 · вывод 7 IN2 · вывод 8 ENA · вывод 5 вперёд стоп назад стоп HIGH LOW LOW HIGH 200 0 200 0 0 2 с 3 с 5 с 6 с
Один проход loop: 2 секунды вперёд (IN1 HIGH, IN2 LOW, ENA 200), секунда стоп, 2 секунды назад (IN1 LOW, IN2 HIGH), снова секунда стоп с ENA 0.

При слишком малом значении ШИМ мотор только гудит и не трогается: силы не хватает сдвинуть редуктор. Подберите наименьшее рабочее значение опытом. У TB6612FNG выводы называются иначе (AIN1, AIN2, PWMA), и есть вывод STBY, на который нужно подать HIGH, иначе драйвер спит.

Если мотор должен крутиться только в одну сторону, вместо драйвера можно поставить транзистор (полевой, рассчитанный на управление от 5 В) и диод параллельно мотору, который гасит обратный выброс напряжения. Новичку проще и безопаснее начать с готового модуля драйвера.

Шаговый двигатель

Шаговый двигатель поворачивается точными шагами — на нём держится точность 3D-принтеров и станков. Им тоже управляют только через драйвер: маленький 28BYJ-48 на 5 В — через плату с ULN2003, двигатели NEMA 17 — через драйверы A4988 или DRV8825, обычно с питанием 12–24 В. В Arduino IDE есть встроенная библиотека Stepper, для плавного разгона часто берут библиотеку AccelStepper.

Драйверы A4988 и DRV8825 нельзя подключать и отключать от двигателя при поданном питании — драйвер сгорит. Ток драйвера настраивают винтом на его плате по инструкции к конкретному модулю.

Реле и сеть 230 В

Реле — выключатель, который переключает плата: им включают нагрузку с отдельным питанием, например насос или вентилятор на 12 В. Модули реле для Arduino обычно уже содержат транзистор и защитный диод, поэтому их вход подключают к выводу платы напрямую, а питание модуля и GND — как указано в его описании.

Контакты таких реле рассчитаны и на сеть 230 В, но собирать сетевые схемы без опыта и знания правил электробезопасности нельзя: на открытых контактах модуля окажется смертельно опасное напряжение, а ошибка в монтаже может вызвать пожар. Учитесь на низком напряжении — светодиодные ленты, вентиляторы и насосы на 5–12 В.

Коротко

Проверьте себя

1. Почему мотор нельзя подключать к выводу Arduino напрямую?
2. Что обязательно сделать, если мотор питается от отдельного источника?
3. Что делает servo.write(90) для обычного сервопривода на 180°?
4. Скетч использует библиотеку Servo, а analogWrite(10, 128) на Uno не работает. Почему?