Робот на Arduino своими руками: машинка для начинающих
Робот-машинка — второй по популярности проект после мигалки, и я советую его каждому, кто прошёл основы: на одной платформе вы встречаете моторы, драйвер, питание и первый по-настоящему движущийся результат. Пугаться нечего: без программирования STM32 и пайки СМД справится любая машинка из двух моторов, драйвера и платы Uno. Бюджет честного варианта — 2000-3000 ₽, сроки — пара вечеров на сборку и один на первый заезд.
Ниже — разбор платформы по узлам: шасси, драйвер моторов, питание и код. Логику движения до покупки деталей проверяйте в симуляторе — скетч из этой страницы исполняется прямо в браузере, а схему включения моторов я разбираю в уроке про драйвер L298N. Тем, кто только подошёл к плате, советую сначала пройти раздел «Основы» — без уверенных digitalWrite и millis робот превращается в набор дорогих деталей.
Из чего собирают машинку: пять узлов платформы
- Шасси с моторами — база 2WD: два TT-мотора с колёсами и свободный ролик впереди; всё остальное (4WD, гусеницы) — вариации той же идеи
- Драйвер моторов — микросхема-мост, которая даёт моторам ток, когда пин Arduino подаёт слабый сигнал; пины платы напрямую моторы не потянут
- Arduino — голова: Uno-форм-фактор удобнее на макетке, Nano — когда переезжаете в корпус
- Питание — два аккумулятора 18650 (7,4 В) с держателем; от USB робот не ездит, а «Крона» сдувается за 20 минут
- Датчики — от кнопки-бампера до HC-SR04: на первый заезд можно вообще без них, программа едет по таймеру
Порядок сборки я держу такой: сначала шасси и моторы с драйвером, потом питание, потом плата и код, датчики — последними. Если собрать всё сразу, первым же заездом сшибаете датчики, потому что моторы повели себя не так, как вы ждали. На старте полезно вообще снять колёса и смотреть на крутящиеся оси — логика проверяется и так.
Драйвер моторов: L298N или TB6612FNG
Классика — модуль на L298N (150-250 ₽): два канала, каждая обмотка включается парой входов IN1/IN2, скорость задаётся ШИМ на пинах ENA/ENB. Минус у него один, но жирный: падение на выходе 1,4-2,5 В, поэтому от 7,4 В батарей TT-моторы крутят не в полную силу. Более свежий TB6612FNG (130-180 ₽) теряет меньше 0,5 В и мельче корпусом — но у него нет борды с клеммами, придётся паять или макетить. Для первой машинки я всё же советую L298N: клеммы и разъёмы экономят час возни.
Логика обоих драйверов одинаковая и собирается из четырёх пинов: IN1=HIGH и IN2=LOW — левый мотор вперёд, наоборот — назад, оба LOW — накат или тормоз. Скорость — это analogWrite на ENA/ENB от 0 до 255; тема ШИМ разобрана в уроке про analogWrite, а реверс со сменой направления — в уроке про L298N с ШИМ.
Таблица: варианты шасси под разные задачи
| Шасси | Моторы | Цена | Что ждать |
|---|---|---|---|
| 2WD: два колеса + ролик | 2 × TT 3-6 В | 350-600 ₽ | Дёшево, просто, идеально для первого робота; на ковре и порогах тянет слабо |
| 4WD: четыре колеса | 4 × TT 3-6 В | 600-900 ₽ | Тянет больше, но ток вдвое выше — L298N греется, берите TB6612 или два драйвера |
| Гусеничный танк-шасси | 2 × редукторные DC | 1500-2500 ₽ | Едет по проводам и коврам, тяжёлое и прожорливое; гудит как холодильник |
| Машинка с сервоповоротом | 1 × DC + серво руля | 800-1400 ₽ | Похоже на настоящую машину; поворот через серво — отдельная часть кода |
| Готовый kit (Elegoo и т.п.) | Всё в комплекте | 3500-6000 ₽ | Быстрый старт за один вечер; плата, драйвер и провода всё равно свои |
Мой выбор для первого робота — 2WD: минимум проводов, понятные манёвры, разворот на месте за счёт вращения колёс в разные стороны. Гусеницы красивые, но добавляют полкило веса, и батареек они съедают как два 2WD.
Питание: 18650, buck-преобразователь и почему «Крона» не едет
Два аккумулятора 18650 последовательно дают 7,4 В — это идеальное питание для схемы: на L298N подавайте всё напряжение, а на Arduino — через его Vin или через понижающий модуль MP1584 (100-150 ₽), выставленный на 5 В, в пин 5V. TT-мотор при старте кушает до 700 мА каждый, и просадка дешёвой батареи моментально перезагружает плату — симптом «робот едет и постоянно перезапускается» в 9 случаях из 10 лечится нормальными 18650 с токоотдачей от 5 А или добавлением конденсатора 470-1000 мкФ на питание драйвера.
Список деталей с ценами
- Клон Arduino Uno R3 — 700-1100 ₽
- Драйвер L298N — 150-250 ₽ (или TB6612FNG — 130-180 ₽)
- Шасси 2WD с двумя TT-моторами, колёсами и роликом — 350-600 ₽
- Держатель 2 × 18650 — 100-150 ₽; аккумуляторы 18650 — 2 × 300-400 ₽
- Понижающий модуль MP1584 или LM2596 — 100-150 ₽
- Jumper-провода и маленькая макетка — 300-450 ₽
- Серво SG90 под бампер (опция) — 150-250 ₽
- Кнопка или ультразвуковой HC-SR04 (опция) — 50-150 ₽
Итого 2100-3100 ₽ без опций. Серво в списке не зря: классическая апгрейд-версия — бампер на рычаге серво, который «нащупывает» препятствие перед собой; подключение и первые углы разобраны в уроке про SG90.
Скетч-заготовка: первый заезд по таймеру
Программа ниже — каркас любого робота: четыре пина драйвера, манёвры длительностью 2 секунды и цикл без delay(). Загрузите её в симулятор и следите за Serial: так вы отладите логику маршрута до того, как машинка сорвётся с места. На реальной плате IN1-IN4 подключаются к тем же номерам пинов L298N, ENA и ENB — с перемычками на полную скорость.
// Машинка на L298N: программа манёвров без delay().// В симуляторе пины IN1-IN4 видны как индикаторы стенда,// на железе это входы драйвера: IN1/IN2 — левый мотор, IN3/IN4 — правый.const int IN1 = 5, IN2 = 6, IN3 = 9, IN4 = 10; int step = 0;unsigned long t0 = 0; void forward() { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);} void coast() { // моторы отключены — катимся по инерции digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);} void spinRight() { // колёса крутятся в разные стороны — разворот на месте digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);} void backward() { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);} void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); Serial.begin(9600); forward(); // стартуем сразу t0 = millis(); Serial.println("манёвр 0: вперёд");} void loop() { if (millis() - t0 >= 2000) { // каждый манёвр длится 2 секунды t0 = millis(); step = (step + 1) % 4; // цикл из четырёх манёвров if (step == 0) { forward(); Serial.println("манёвр 0: вперёд"); } if (step == 1) { coast(); Serial.println("манёвр 1: накат"); } if (step == 2) { spinRight(); Serial.println("манёвр 2: разворот"); } if (step == 3) { backward(); Serial.println("манёвр 3: назад"); } }}Что улучшать дальше по нарастающей: убрать «слепые» интервалы и повесить кнопку-старт (урок про digitalRead), добавить ШИМ-скорость на ENA/ENB, затем бампер на серво и в конце — HC-SR04 с автоматическим объездом препятствий. Структурно скетч при этом не меняется: растёт только функция, которая решает, куда прямо сейчас направить четыре пина. Планирование без блокировки — в уроке про millis().
Грабли первого заезда
- Мотор крутит не в ту сторону: поменяйте местами два провода на клеммах драйвера или инвертируйте пару IN1/IN2 в коде — это не брак, а фаза подключения
- Робот едет по дуге: один TT-мотор всегда быстрее второго; лечится ШИМ-подстройкой ENA/ENB или подбором пары моторов
- Плата перезагружается на старте моторов: просадка питания — конденсатор 470-1000 мкФ на вход драйвера и свежие 18650
- Машинка молчит при полном заряде, но едет «на подсевших»: перепутаны земли — проверьте общую линию GND между батареей, драйвером и платой