— Папа, а где пульт от машинки? — спросила дочь.

— Пульт потерялся, — ответил я.

— А ты можешь подключить другой?

— Давай попробуем.

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

Моторы оказались живыми, колёса закрутились, моя голова тоже. Быстро определили техническое задание с заказчиком: машина должна управляться беспроводным пультом.

Вспомнил об ESP32

Некоторое время назад я узнал про микроконтроллеры ESP32. Очень захотелось что‑нибудь закодить на них, поэтому сразу купил несколько. Поигрался — научился подключаться, разобрался с файловой системой, сохранением настроек, даже написал небольшую программу, считывающую состояние контактов на GPIO. На работе особого применения не нашлось для платы, поэтому так и осталась на столе, потом в шкафу. Но мысль использовать плату осталась.

Машинка, пульт, управление — это точно была задача, ради которой я достал плату ESP32 из шкафа.

Составил план:

  • проверить управление с платы ESP32 колёсами без пульта,

  • подключить какой‑нибудь пульт,

  • собрать и отдать заказчику.

Основной подход был прост: нужно управлять машинкой. Какие‑то дополнительные доработки ещё в голову не приходили. А какое там будет питание и как изменится первоначальное ТЗ — даже и не думал.

Мои игрушки
Мои игрушки

План простой: заставить машину ехать

Первый шаг — сделать тестовое управление машиной непосредственно от ESP32. На плате есть выводы 5В и 3,3В, но для меня оказалось неочевидно, что их нельзя было использовать. Но даже при нужном напряжении плата не рассчитана на ток, необходимый для моторов.

Изучил, как можно управлять моторами. Решением оказался H‑мост, который в моём случае управляется от ESP32, а сам коммутирует питание на моторы. А два канала обеспечивают подключение моторов движения и поворота к одной плате.

Мост называется длинно и скучно: двухканальный драйвер двигателей L298N. Купил пять штук: короткое замыкание и я — дело времени.

Для первого теста всё было готово: ESP32, мост, моторы.

Нарисовал в Figma схему ESP32 и L298N.
Нарисовал в Figma схему ESP32 и L298N.

Припаял провода от ESP32 к мосту, от моста к моторам. Далее немного возни с ESP32. Подключение к ПК по кабелю micro‑USB. Далее всё просто: открыть любимую IDE, выбрать точную модель и загрузить код одной кнопкой.

Написал мини‑программу для теста взаимодействия ESP32, моста и моторов, которая регулярно по очереди подавала управление на GPIO согласно схеме. Управление GPIO — это смена логического уровня с 0 на 1. Добавил мигание встроенного светодиода как признак того, что программа выполняется.

Ссылка на GitHub репу в конце статьи.

Прошил ESP32, подключил согласно схеме, подал питание на ESP32 от пауэрбанка, на мост и моторы от четырёх пальчиковых батареек, соединённых последовательно. Включил, и ничего не произошло. Лампочка светится, значит программа выполняется, но колёса не крутятся.

Погуглив, выяснил, что надо минус от питания моторов соединить с землёй на плате ESP32. Запуск… Ура, колёса закрутились.

Подключил второй канал моста, чтобы проверить одновременную работу обоих моторов. «D2, D4» — вперёд/назад, «D16, D17» — налево/направо.

Первый успех — машина управляется, хоть и на стенде и без пульта управления.

Геймпад и ESP32 делают вид, что незнакомы

Наступило время выбора пульта управления. Я посмотрел некоторые модели пультов, особенно специализированные для радио‑машинок. Но заказчик их забраковал. На самом деле они страшные и очень заточены под одну задачу.

Я подумал, а почему бы и нет, посмотрел геймпад DualSense для PS5. У него отличный вид (это самое важное), есть Bluetooth, и этого было достаточно. Купил и приступил к подключению. Загуглил библиотеки PlayStation для ESP32. Первым ложным путём стали библиотеки, которые делали не то, что я хотел. Например, библиотека «ESP32-BLE‑Keyboard» превращает плату ESP32 в устройство ввода.

Далее попробовал «ps5Controller.h». По инструкции нужно было зашить Bluetooth MAC‑адрес геймпада в код. Для этого подключил контроллер к телефону и через приложение Bluetooth Mac Address Finder узнал его мак. Вбил его в код, запустил плату. И ничего.

Перепробовал несколько вариантов библиотек, ничего не подошло. Проведя несколько дней в попытках подключить геймпад, решил обратиться к опытному гуру. Но прежде прочитал первые пять страниц мануала по ESP32, по его словам там скрывается почти вся нужная информация. Но чуда не произошло, начал гуглить и догадываться о несовместимости Bluetooth на плате и DualSense.

И действительно, гуру объяснил, что и как с Bluetooth. Моя плата с полным названием ESP32-C3-MINI-1 поддерживала Bluetooth Low Energy. А для подключения геймпада требовался Bluetooth Classic. Этот поворот событий чуть ли не приговорил весь проект.

Купил версию ESP32-WROOM-32 с поддержкой нужной версии Bluetooth. Тестирование продолжилось. Спустя несколько часов геймпад подключился к плате.

Добавил на схему DualSense
Добавил на схему DualSense

Переписал тестовое управление на сигналы от геймпада. И машина первый раз выехала со стола. Восторг, радость, заказчик сразу отправился на первое тестирование машинки, точнее шасси с платой и пауэрбанком.

Радиоуправляемое шасси
Радиоуправляемое шасси

Дочь взяла два телефона, включила видеочат. Один телефон находился в машине, второй принимал видеозвонок.

Так в первоначальное ТЗ были внесены правки: сделать как в фильме «Один дома».

Пора собирать корпус

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

Внес изменения в план:

  • реализовать скрытое питание ESP32;

  • закрыть корпус, вывести разъёмы для зарядки, кнопку включения/выключения;

  • видеосвязь.

Вернёмся к электрической цепи машины. Нужно было отказаться от внешнего пауэрбанка и встроить питание внутрь машинки. Первая мысль была запитать ESP32 от четырёх батареек, питающих моторы машинки. Небольшой расчёт на бумаге — батарейки дают 6В, плате надо 5В либо через USB, или 3,3В. Пробовал занизить питание до 5В через DC‑DC‑преобразователь, нарисовал схему:

Схема DC-DC преобразователя из 6В в 5В
Схема DC‑DC преобразователя из 6В в 5В

Решение с понижением напряжения проверил, но ESP32 постоянно перезагружалась и не работала. В итоге эксперименты закончились коротким замыканием преобразователя и перегревом конденсаторов.

Мысль расположить пауэрбанк внутрь отсека батареек больше всего понравилась. С зарядкой сразу вопрос снимается, но размеры готовых комплектов не влезали, а брать отдельно и городить не хотелось. И вот из предыдущего решения вытекло новое решение: взять плоский аккумулятор как на старых телефонах, плату зарядки и всё положить под капот машинки. Купил «Плата зарядки Модуль заряда Power Bank для Li‑ion» сразу несколько штук и два Li‑ion аккумулятора с запасом, разъём USB и кнопку включения.

В машинке установлены один модуль и один аккумулятор.

Модуль заряда Power Bank для Li-ion
Модуль заряда Power Bank для Li‑ion
На схеме снова появились новые участники.
На схеме снова появились новые участники.

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

На плату зарядки припаял плюс и минус от аккумулятора, ESP32 переключил на питание через пины GND, 5В и вывод для зарядки на разъём USB‑C.

Индикатор питания
Индикатор питания

На плате зарядки есть индикация, но она так и осталась невидимой под капотом машинки. Сделал кнопку для подачи питания в разрыв линии 5В питания ESP32. Проверил работу кнопки. Припаял разъём USB к плате, проверил подачу питания через внешний источник, но что‑то пошло не так, плата сгорела, скорее всего перепутал плюс с минусом, но кто уже вспомнит об этом. Запаял новую плату зарядки, к ней припаял внешний разъём USB‑C, установленный в корпусе, вместе с разрезанным кабелем micro‑USB, воткнутым в плату зарядки.

На этом этапе захотелось привести в порядок электропроводку и заодно сделать фары. Купил диоды белые на перед, красные назад.

Добавил на схему фары.
Добавил на схему фары.

Подключил их к мосту на канал мотора в положении движения вперёд. Пайка диодов напрямую без токоограничивающих резисторов грубовата. Повторять такое не стоит. Но я принял решение «если работает — не лезь». По каким‑то причинам задние фонари остались только на бумаге.

И наконец началась сборка. Проводку проложил под порогом машинки. Чтобы снизить дребезги, приклеил термопистолетом все платы и проводку к кузову машины, шумоизоляцию и антикор делать не стал.

Кузов был с гордостью прикручен к шасси, проверена работоспособность: зарядка и тестовые заезды. Машинка отправилась на обкатку требовательному заказчику.

Снова мне показали видеосвязь при помощи двух телефонов.

Камера против датчика расстояния — 1:0

Помимо видеосвязи, у меня тоже появилась идея сделать остановку машинки перед препятствием, и она стала первой в очереди.

Выбор пал на ультразвуковой датчик расстояния «HC‑SR04».

Ультразвуковой датчик расстояния “HC-SR04”
Ультразвуковой датчик расстояния «HC‑SR04»
Добавил на свою схему ультразвуковой датчик
Добавил на свою схему ультразвуковой датчик

Место выбрано на переднем бампере. Закрепил, подпаял, подключил. Планировалось, что датчик расстояния измеряет расстояние перед машиной, ESP32 периодически получает показания, и когда расстояние становилось меньше заданного порога, движение машинки прекращается.

Тесты на столе реально подтвердили работу датчика расстояния — включил движение вперёд, поднёс препятствие — колёса остановились.

Но на практике получились другие результаты. Я пробовал разные пороги остановки:

  • большой порог — датчик сразу срабатывал от стен и машинка не двигалась,

  • маленький порог — машинка не останавливалась вовремя и оставляла следы тестов на обоях и наличниках дверей испытательного полигона квартиры. А также боковые препятствия не попадали в узкий сектор измерения.

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

Следующая более серьёзная доработка — это видеосвязь. Требования простые:

  • питание от той же платы зарядки;

  • видео по Wi‑Fi с телефона или компьютера.

Выбор пал на ESP32-CAM. Купил, накатил готовый пример, который позволял ESP32-CAM создать собственную точку доступа Wi‑Fi и отдавать видеопоток через веб‑страницу.

ESP32-CAM
ESP32-CAM

Схема работы камеры:

  • ESP32-CAM поднимает собственную точку доступа Wi‑Fi без DHCP

  • камере и телефону назначаются статические IP из одной подсети

  • на 80-м порту камеры получаем HTML и видео.

ESP32-CAM продавалась без корпуса. Готовые боксы не понравились, так как для крепления такого корпуса на машинку надо было бы допиливать. Посмотрел в сторону 3D‑печати и нашёл в интернете модель подходящего корпуса с креплением. Скачал модель, напечатал корпус, но камера не влезла. Нашёл ещё одну модель. Распечатал. Встала как родная. Покрасил в чёрный цвет.

Напечатанный бокс для камеры
Напечатанный бокс для камеры
Бокс с камерой
Бокс с камерой

Для питания камеры использовал кабель micro‑USB, разрезал его и припаял параллельно основной ESP32. Просверлил в капоте отверстие, прикрутил бокс, вставил камеру и подключил к ней питание.

В надежде, что заказчик будет доволен, передал законченный вариант. Машинка ездила, дочке и мне очень понравилось управлять ею по видеосвязи.

Итоги

Немного нудятины про компоненты машинки:

  • ESP32-WROOM-32 принимает команды от DualSense и выдаёт управляющие сигналы;

  • DualSense для PS5 — беспроводной пульт;

  • двухканальный драйвер двигателей L298N — управляет моторами движения и поворота;

  • моторы питаются от четырёх батареек AA, соединённых последовательно;

  • плата зарядки — «Модуль заряда Power Bank для Li‑ion»;

  • основная ESP32 и камера ESP32-CAM запитаны от Li‑ion аккумулятора через модуль питания Power Bank;

  • передние фары загораются вместе с движением вперёд;

  • ESP32-CAM — камера с собственной точкой доступа Wi‑Fi;

  • датчик расстояния HC‑SR04 установлен, но выведен из эксплуатации.

Проект затянулся примерно на год. Занимался по несколько часов в выходные, и то не каждую неделю.

На компоненты и эксперименты с машинкой вышло около 13 585 рублей, из них 9 000 рублей — на DualSense. Ещё примерно 6 500 рублей ушло на паяльник, фен, держатель, отсос припоя, пасту и прочие мелочи.

Ссылка на GitHub — https://github.com/AntonVolkov71/radio_pult

Конечный вид машинки
Конечный вид машинки

Рабочий процесс

Законченной машинкой дочка играла около часа. Потом машинка отправилась на полку.

Комментарии (0)