Урок 9. Сервоприводы и моторы
Моторы делают проект живым: поворачивают заслонку, едут, открывают кормушку. Но мотор — первая деталь в курсе, которой мало тока с вывода платы. Поэтому здесь важнее всего не код, а питание.
Главное правило
Вывод Arduino Uno R3 рассчитан на ток до 20 мА. Даже маленькому мотору нужны сотни миллиампер, а при старте и под нагрузкой — ещё больше. Кроме того, мотор при выключении выдаёт обратный выброс напряжения, а пока работает — создаёт помехи в питании.
Не подключайте мотор к выводу платы напрямую и не питайте моторы от вывода 5V платы: сгорят вывод, стабилизатор платы или порт USB компьютера. Мотор подключается через драйвер или транзистор, а питается от отдельного источника.
И второе правило: GND отдельного источника соединяется с GND платы. Без общего «минуса» сигнал от платы драйвер не поймёт.
Сервопривод
Сервопривод (серво) — мотор с редуктором и платой управления внутри. Ему сообщают угол — от 0 до 180 градусов, — и он поворачивается в это положение и держит его. Самый распространённый маленький сервопривод — SG90.
У сервопривода три провода:
- коричневый или чёрный —
GND; - красный — питание
+5 В; - оранжевый, жёлтый или белый — сигнал, к любому цифровому выводу.
Угол задаётся импульсами: примерно 50 раз в секунду на сигнальный провод приходит импульс длиной около 1–2 мс, и от его длины зависит угол. Формировать импульсы вручную не нужно — это делает встроенная библиотека Servo.
Скетч поворачивает вал от 0 до 180 градусов и обратно (на основе примера File → Examples → Servo → Sweep):
#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);
}
}servo.attach(9)— к какому выводу подключён сигнал;servo.write(угол)— повернуть на угол от 0 до 180.
Управление ручкой — потенциометр на A0, угол через map (пример Knob):
#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);
}Тонкости сервоприводов:
- Питание. Один SG90 без нагрузки для опыта можно питать от
5Vплаты, подключённой к USB. Если плата перезагружается, монитор порта теряет связь или серво дёргается — нужен отдельный источник 5 В (на несколько сервоприводов — на 2 А и больше) с общим GND. Большие сервоприводы (MG996R и подобные) — только от отдельного источника. - Крайние углы. Многие недорогие сервоприводы не доходят ровно до 0 и 180 градусов и на краях гудят, упираясь. Ограничьте диапазон, например 10–170.
- ШИМ на выводах 9 и 10. На Uno и Nano библиотека Servo отключает
analogWriteна выводах 9 и 10 — даже если серво подключено к другому выводу. - Сервопривод 360° (постоянного вращения) угол не держит: значение около 90 — стоп, меньше и больше — вращение в разные стороны с разной скоростью.
Мотор постоянного тока через драйвер
Обычный моторчик (как в игрушечной машинке) крутится, пока на него подано напряжение; поменяли полярность — крутится в другую сторону. Скорость регулируют ШИМ. Между платой и мотором ставят драйвер — микросхему, которая по слабому сигналу платы коммутирует сильный ток от отдельного источника. Популярные модули: L298N (старый и простой, греется и теряет на себе заметную часть напряжения — порядка 2 В) и TB6612FNG (экономнее). Оба управляют двумя моторами.
Подключение одного мотора к модулю типа L298N:
- Мотор — к клеммам
OUT1иOUT2. - Источник для моторов (например, батарейный отсек на 6–9 В) — плюс к клемме питания моторов, минус — к
GNDмодуля. GNDмодуля — кGNDArduino.IN1→ вывод 7,IN2→ вывод 8 (направление),ENA→ вывод 5 (скорость, ШИМ). На многих модуляхENAзакрыт перемычкой — для управления скоростью её снимают.
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);
}При слишком малом значении ШИМ мотор только гудит и не трогается: силы не хватает сдвинуть редуктор. Подберите наименьшее рабочее значение опытом. У 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 В.
Коротко
- Мотор — никогда напрямую к выводу и никогда от
5Vплаты: только через драйвер и от отдельного источника. - GND отдельного источника обязательно соединяют с GND Arduino.
- Сервопривод: библиотека
Servo,attach(вывод)иwrite(угол 0–180); на Uno отключает ШИМ на 9 и 10. - Мотор постоянного тока: направление — два вывода драйвера, скорость — ШИМ на вывод
EN. - Шаговые двигатели — через свои драйверы (ULN2003, A4988, DRV8825).