Подключение сервопривода к Arduino: SG90 и питание
Сервопривод SG90 подключается тремя проводами: коричневый это GND, красный 5 В, оранжевый сигнальный, на любой цифровой пин. Библиотека Servo.h встроена в Arduino IDE, и управление сводится к одному вызову write(угол).
Живая практика в уроках: первые углы и плавное движение. Серво можно крутить в симуляторе.
Ниже разбираем физику сервопривода, почему на шкале 0–180 градусов реально доступно меньше, чем кажется, что происходит с питанием при старте, какой серво стоит взять новичку и как проверить готовую схему по семи шагам.
Схема подключения SG90
| Провод SG90 | Arduino |
|---|---|
| Коричневый | GND |
| Красный | 5 В (лучше внешний источник) |
| Оранжевый | Цифровой пин, например D9 |
Цвета проводов у разных производителей отличаются, и путать их нельзя: у части серво чёрный это GND, а у некоторых красный бывает сигнальным. Проверьте по даташиту или прозвоните мультиметром: сигнальный провод ни с чем не соединён внутри корпуса, а земля и питание идут к мотору. Сам привод управляется не током, а длиной импульса: библиотека формирует на сигнальном выводе импульс шириной примерно от 1 мс до 2 мс, и по ней сервопривод понимает, в какой угол встать. Частота этих импульсов около 50 Гц, то есть один импульс каждые 20 мс.
Стоит знать про конструкцию. Внутри SG90 мотор с редуктором, потенциометр и микросхема, которая сравнивает положение потенциометра с командой и доворачивает мотор до нужного угла. Отсюда два следствия. Первое: серво удерживает позицию потреблением тока, поэтому в покое оно не «выключено» и заметно греется. Второе: у большинства SG90 реальный рабочий диапазон уже, чем заявленные 180 градусов, примерно от 10 до 170 градусов, а на краях упирается в механический стоп.
Код: поворот на 90 градусов
#include <Servo.h>Servo sv; void setup() { sv.attach(9);} void loop() { sv.write(0); delay(1000); sv.write(90); delay(1000); sv.write(180); delay(1000);}attach(9) говорит библиотеке, на каком пине живёт сигнальный провод. Дальше write(angle) принимает угол от 0 до 180 и сам пересчитывает его в длину импульса, а библиотека делает это через внутренний таймер, так что точность хода в градусах у SG90 заметно ниже заявленной: реальный угол может отличаться на единицы градусов. Если нужен нестандартный диапазон или более точное позиционирование, используйте writeMicroseconds(микросекунды): для SG90 обычно берут значения от 544 до 2400 мкс, а 1500 мкс это примерно 90 градусов. Читать текущее положение можно функцией read().
Плавное движение
Мгновенный write() создаёт рывок и просадку питания. Плавный ход получается в цикле с шагом в один градус и паузой 15 мс, а лучший вариант это миллис-версия без блокировки loop(). Оба варианта разобраны в уроке про плавное движение серво. Шаг подбирают по инерции: тяжёлый манипулятор на резком движении расшатывает питание сильнее всего, и плавный ход заодно работает как фильтр просадок.
Тупик: серво дёргается при старте
Первый наш сервопривод при включении платы начинал резко дёргаться, и плата при этом перезагружалась. Мы решили, что дело в коде, и переписали его: убрали delay, добавили плавное движение, переставили серво на другой пин. Стало лучше на секунду, а потом всё повторилось.
Настоящая причина была в питании. Серво в момент старта дёргается к текущему углу, потребляет пиковый ток, и на участке провода от USB-порта до серво напряжение проседает. У ATmega328P есть сторожевой детектор питания, и при просадке он перезагружает процессор, поэтому Arduino выглядит «зависшим». Мы перенесли питание серво на отдельный блок, соединили земли и добавили конденсатор по питанию сервы, после чего дёрганье исчезло полностью. Проверка, которая работает всегда: отключите серво от сигнального провода и включите плату. Если перезагрузка прекратилась, дело точно в питании, а не в скетче.
Личный опыт: сколько тока ест серво на самом деле
Цифры из даташита мы перепроверяли мультиметром и блоком питания с ограничением тока. SG90 в покое, удерживающий лёгкую нагрузку, тянет порядка сотни миллиампер, при движении под нагрузкой больше, а в момент упора в механический стоп ток уходит к верхней границе в несколько сотен миллиампер. Замеровый ток в момент старта привода мы отдельно не фиксировали, но он виден по тому, что блок питания уходил в ограничение, и это главный признак.
Отсюда практическое правило, которым мы пользуемся: любой привод с реальной нагрузкой получает отдельное питание, а от платы идёт только сигнальный провод. Простой тест без замеров: если при движении серво плата перезагружается, смотрите в сторону питания, а не кода. Если привод спокойно ездит, но Arduino при этом «дёргает» светодиодом на своём пине, питание общее и его надо разделять.
Авторская позиция: какой серво взять новичку
Берите SG90 или его аналог и учитесь на одном сервоприводе. Эти приводы маленькие, момент у них примерно 1,8 кг·см, и для учебных задач (маховик, стрелка, качалка) этого достаточно. Силовые серво вроде MG996R или SG90 с металлической передачей мы советуем оставить на второй-третий проект: у них другой ток, другая логика питания и заметно больше люфт.
Второе правило касается хранения. Сервоприводы продаются в комплекте с набором прочих мелочей, и руками в них часто стоят пластиковые вставки, удерживающие вал. Если вставку не вынуть, серво не провернётся, а новичок будет искать неисправность в коде. Вынимайте вставки сразу и храните серво в том положении, в котором оно стояло в магазине: у многих приводов это середина диапазона, и в крайних углах их лучше не оставлять надолго. И ещё: покупайте серво с запасом, у них ресурс ограничен, и первое же заклинившее привод уводит весь проект в ремонт.