[Перевод] Беспроводное управление моторчиками из Lego при помощи Steam Controller

to-qfh-f6as72siykacsf0u_8du.jpeg

Когда я был молодым, мне всегда хотелось иметь наборы «техникс» от Lego, чтобы собирать из них всякие крутые штуки. Автономные танки с вращающимися турелями, стреляющими кирпичиками Lego. Но тогда такого набора у меня не было.

И даже обычных кирпичиков от Lego не было. У меня был только друг, у брата которого были все эти дорогие игрушки.

А теперь у меня самого сын такого возраста. И он строит танки, которые… тупо прут вперёд, пока не врежутся в стену :)

И вот, настало время для ESP32 и магии паяльника — соберём для них правильный пульт дистанционного управления!

Нет, я, конечно, знаю о существовании таких пультов. Но ни один из них мне не подходит полностью. Они либо инфракрасные, с технологией 80-х годов, либо слишком крупные. Или дорогие. А главное — ни об одном из них я не смогу сказать сыну: «Я сделал это специально для тебя!»

Так давайте же сделаем новый, улучшенный пульт, чтобы править всеми!
ffac727fd7f9547d36657745fe7ea3a1.png

Ингредиенты:

  • ESP32-WROOM-32D | WiFi, BLE и процессор с I/O — достаточно для управления двумя моторами и светодиодом.
  • DRV8833 | двойной Н-мост с мощностью, достаточной для моторов.
  • TPS62162 | понижение напряжения до 17 В, а также для развлечения при пайке корпуса WSON-8 2×2 мм
  • CP2104 | для программирования ESP32
  • Разъёмы для подсоединения моторов и диодов. Провода отрежем и припаяем их снизу, а коннектор Lego приклеим сверху.


Всё это разместится на довольно небольшой плате — вот её внешний вид в редакторе EasyEDA:

3c84afb81433206ebf31adbfde2b8700.jpg

Провод, который видно на заглавном фото, нужен не для исправления каких-то ошибок, а для подачи питания с USB. Его, возможно, не хватит для мотора, но, к сожалению, контакты из Китая до сих пор мне не пришли. Поэтому я сначала проверяю работу светодиодов. Для красоты на фотографии я просто положил коннектор от мотора на плату.

На версии 1.1 моей платы (в отличие от версии 1.2, которая уже лежит на EasyEDA), не было светодиодов, поэтому я припаял два антипараллельных диода на выход, чтобы было видно происходящее. Если присмотреться, на видео видно попеременное включение пары диодов 0603, обозначающих движение вперёд/назад.

Что до пульта управления, то сначала я просто хотел собрать дополнительную плату с кнопочками и ещё одним ESP32 — классический ПДУ.

Однако потом я вспомнил, что у контроллеров Steam Controller есть режим работы Bluetooth с низким энергопотреблением (BLE). Я решил заняться этим вопросом, и через несколько часов научился принимать пакеты от контроллера.

Для этого нужно просто поискать HID-устройство, называющее себя SteamController, и подключиться к нему. А потом использовать недокументированный сервис от Valve и несколько недокументированных команд, позволяющих передачу пакетов.

2f7fb5877ff2dae71c57c405b3e4c5d4.png

А ещё мне попался недокументированный формат отчёта, который я разобрал вручную.

22c8ab3db50e5ac2a0fb6c0c48a2701e.png

Где-то через часик смысл флажков и значений стал мне понятен, и я сумел помигать светодиодом при помощи контроллера Steam и ESP32. ¯\_(ツ)_/¯

Файлы


v1.0: «пробный подход»
— первый вариант, для которого я выбрал неправильный регулятор напряжения. TPS62291 поднимает напряжение лишь до 6 В. Я разрабатывал несколько проектов параллельно, и забыл, что устройству нужно работать с 9 В.

v1.1: «достаточно хорошая»
— этот вариант виден в роликах, и всё работает

v1.2: «окончательная»
— добавил индикаторные светодиоды на выход и оптимизировал размер и раскладку плату

На следующем коротком видео показана фаза соединения (1–3 сек. после включения питания) и управление выходами мотора. Коннектор от Lego пока не подключен. Он пойдёт на пустое место рядом с остальными коннекторами, отмеченное белым прямоугольником.

Мой сын теперь регулярно пользуется этим контроллером для управления собранными им аппаратами.

Во время стресс-теста я столкнулся только с одной проблемой: я думал, что режим «быстрого затухания» [fast decay] драйвера мотора будет работать лучше всего, однако из-за него через несколько секунд работы очень сильно падала скорость мотора. Поэтому я поменял код так, чтобы он использовал «медленное затухание» [slow decay].

c1ee09921222a6c99fa4dce4395ca4a7.png

Пока я не уверен, как работает DRV и почему мотор сначала вращается быстро, а потом через секунд 10 начинает постепенно замедляться. Возможно, разогреваются MOSFET и их сопротивление поднимается слишком сильно.

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

© Habrahabr.ru