Когда я был молодым, мне всегда хотелось иметь наборы «техникс» от Lego, чтобы собирать из них всякие крутые штуки. Автономные танки с вращающимися турелями, стреляющими кирпичиками Lego. Но тогда такого набора у меня не было.
И даже обычных кирпичиков от Lego не было. У меня был только друг, у брата которого были все эти дорогие игрушки.
А теперь у меня самого сын такого возраста. И он строит танки, которые… тупо прут вперёд, пока не врежутся в стену :)
И вот, настало время для ESP32 и магии паяльника – соберём для них правильный пульт дистанционного управления!
Нет, я, конечно, знаю о существовании таких пультов. Но ни один из них мне не подходит полностью. Они либо инфракрасные, с технологией 80-х годов, либо слишком крупные. Или дорогие. А главное – ни об одном из них я не смогу сказать сыну: «Я сделал это специально для тебя!»
Так давайте же сделаем новый, улучшенный пульт, чтобы править всеми!
Ингредиенты:
- ESP32-WROOM-32D | WiFi, BLE и процессор с I/O – достаточно для управления двумя моторами и светодиодом.
- DRV8833 | двойной Н-мост с мощностью, достаточной для моторов.
- TPS62162 | понижение напряжения до 17 В, а также для развлечения при пайке корпуса WSON-8 2×2 мм
- CP2104 | для программирования ESP32
- Разъёмы для подсоединения моторов и диодов. Провода отрежем и припаяем их снизу, а коннектор Lego приклеим сверху.
Всё это разместится на довольно небольшой плате – вот её внешний вид в редакторе EasyEDA:
Провод, который видно на заглавном фото, нужен не для исправления каких-то ошибок, а для подачи питания с USB. Его, возможно, не хватит для мотора, но, к сожалению, контакты из Китая до сих пор мне не пришли. Поэтому я сначала проверяю работу светодиодов. Для красоты на фотографии я просто положил коннектор от мотора на плату.
На версии 1.1 моей платы (в отличие от версии 1.2, которая уже лежит на EasyEDA), не было светодиодов, поэтому я припаял два антипараллельных диода на выход, чтобы было видно происходящее. Если присмотреться, на видео видно попеременное включение пары диодов 0603, обозначающих движение вперёд/назад.
Что до пульта управления, то сначала я просто хотел собрать дополнительную плату с кнопочками и ещё одним ESP32 – классический ПДУ.
Однако потом я вспомнил, что у контроллеров Steam Controller есть режим работы Bluetooth с низким энергопотреблением (BLE). Я решил заняться этим вопросом, и через несколько часов научился принимать пакеты от контроллера.
Для этого нужно просто поискать HID-устройство, называющее себя SteamController, и подключиться к нему. А потом использовать недокументированный сервис от Valve и несколько недокументированных команд, позволяющих передачу пакетов.
А ещё мне попался недокументированный формат отчёта, который я разобрал вручную.
Где-то через часик смысл флажков и значений стал мне понятен, и я сумел помигать светодиодом при помощи контроллера Steam и ESP32. ¯\_(ツ)_/¯
Файлы
- Схема и плата на EasyEDA easyeda.com/EFS-GH/legoremote
- Исходники для Arduino: github.com/g3gg0/LegoRemote
v1.0: «пробный подход»
— первый вариант, для которого я выбрал неправильный регулятор напряжения. TPS62291 поднимает напряжение лишь до 6 В. Я разрабатывал несколько проектов параллельно, и забыл, что устройству нужно работать с 9 В.
v1.1: «достаточно хорошая»
— этот вариант виден в роликах, и всё работает
v1.2: «окончательная»
— добавил индикаторные светодиоды на выход и оптимизировал размер и раскладку плату
На следующем коротком видео показана фаза соединения (1-3 сек. после включения питания) и управление выходами мотора. Коннектор от Lego пока не подключен. Он пойдёт на пустое место рядом с остальными коннекторами, отмеченное белым прямоугольником.
Мой сын теперь регулярно пользуется этим контроллером для управления собранными им аппаратами.
Во время стресс-теста я столкнулся только с одной проблемой: я думал, что режим «быстрого затухания» [fast decay] драйвера мотора будет работать лучше всего, однако из-за него через несколько секунд работы очень сильно падала скорость мотора. Поэтому я поменял код так, чтобы он использовал «медленное затухание» [slow decay].
Пока я не уверен, как работает DRV и почему мотор сначала вращается быстро, а потом через секунд 10 начинает постепенно замедляться. Возможно, разогреваются MOSFET и их сопротивление поднимается слишком сильно.
Надеюсь, этот пример использования Arduino без особых усилий послужит вдохновением для других людей и позволит им приобщить их детей к электронике.