Пару недель назад посмотрел это видео: https://youtu.be/LjJCkGUTHlA и захотел оживить свой старый проект управления роботом через интернет.
В моём случае всё будет несколько проще, с общим для всех игроков видом сверху и стилизацией под игру Batlle City с Денди.
В моём случае всё будет несколько проще, с общим для всех игроков видом сверху и стилизацией под игру Batlle City с Денди.
YouTube
Mech Warfare Puts You In The Robot Cockpit
You've seen First-Person-View (FPV) cameras used to fly drones. But putting them into four-legged robots armed with AirSoft guns is a whole new thing. We ran across this robot league at Maker Faire this year.
Robots battle it out in a miniature city, firing…
Robots battle it out in a miniature city, firing…
Порылся в закромах, нашёл необходимое (слева-направо):
1. Беспроводной WiFi модуль на ESP8266 с аналоговым входом (будем измерять напряжение аккумулятора)
2. Плату управления двумя двигателями постоянного тока на MX1508, силовая часть которой может коммутировать от 2 до 9 вольт
3. Два низковольтных мотор-редуктора
4. Ошибочная ревизия одной из моих плат, от которой я отпилил схему беспроводного зарядника LiPo аккумулятора на BQ51050B
5. Беспроводную зарядку за 300 рублей
6. Сам LiPo аккумулятор из одной банки 3.7В 200 мАч
1. Беспроводной WiFi модуль на ESP8266 с аналоговым входом (будем измерять напряжение аккумулятора)
2. Плату управления двумя двигателями постоянного тока на MX1508, силовая часть которой может коммутировать от 2 до 9 вольт
3. Два низковольтных мотор-редуктора
4. Ошибочная ревизия одной из моих плат, от которой я отпилил схему беспроводного зарядника LiPo аккумулятора на BQ51050B
5. Беспроводную зарядку за 300 рублей
6. Сам LiPo аккумулятор из одной банки 3.7В 200 мАч
На имевшемся у меня модуле Wemos D1 mini (китайская копия китайского модуля) аналоговый вход имел перед собой делитель напряжения, так как аналоговый вход самого ESP8266 принимает максимум 1 вольт. Этот делитель позволяет подавать на аналоговый вход платы A0 до 3.3В, но напряжение нашего аккумулятора может быть и 4.2В, поэтому нужно немного поменять коэфициент делителя.
Находим по маркировке или омметром резистор R2 (он рядом со входом A0) с сопротивлением 100 кОм и меняем его на что-то в диапазоне 30-50 кОм.
Вуаля, теперь можем подавать на A0 до 5В.
Находим по маркировке или омметром резистор R2 (он рядом со входом A0) с сопротивлением 100 кОм и меняем его на что-то в диапазоне 30-50 кОм.
Вуаля, теперь можем подавать на A0 до 5В.
wifi_tank.ino
5.6 KB
Я набросал в Arduino IDE примитивный скетч, который крутит двигателями, выдаёт напряжение аккумулятора, управляется по UDP и поддерживает обновление по воздуху.
Для уменьшения акустического шума, частота ШИМ для управления двигателями установлена в 16 кГц, которые слышно только если приложить двигатель непосредственно к уху (ну или если у вас слух летучей мыши).
Для уменьшения акустического шума, частота ШИМ для управления двигателями установлена в 16 кГц, которые слышно только если приложить двигатель непосредственно к уху (ну или если у вас слух летучей мыши).
После трёх или четырёх итераций впихивания с заменой WiFi модуля на вариант ESP-WROOM-02 родился этот красавец (уродец).
Media is too big
VIEW IN TELEGRAM
Набросал приложение на electron, которое опрашивает геймпад и отправляет сигналы управления роботу. Каждый стик управляет своей гусеницей.
Proof-of-concept показал свою жизнеспособность, поэтому был разведён бутерброд из двух плат, но уже с добавлением микросхемы гироскопа+акселерометра MPU6050 для выравнивания курса танка при движении и питание сделано от buck-boost конвертера TPS63021 с выходом 3.3В для максимального использования ёмкости аккумулятора.
Пока ко мне идут новые платы и комплектация, расскажу как сделано управление с компьютера.
Сам Electron представляет собой связку из браузера Chromium и node.js
Большую часть функционала я реализовал подключением готовых модулей, как в конструкторе:
Танк вещает по mdns свой локальный домен tank1.local, доступный из моей домашней сети. Для его обнаружения компьютером используется модуль mdns-js
Отправка UDP пакетов реализована через модуль самой ноды dgram. UDP логично выбран за низкие задержки передачи, относительно TCP.
Опрос геймпада делается модулем gamepad, который легко ставится на чистую ноду, но для электрона его нужно пересобрать по инструкции.
В будущем передачей команд управления танкам и отправкой изображения игрокам будет заниматься один сервер на той же node.js
Сам Electron представляет собой связку из браузера Chromium и node.js
Большую часть функционала я реализовал подключением готовых модулей, как в конструкторе:
Танк вещает по mdns свой локальный домен tank1.local, доступный из моей домашней сети. Для его обнаружения компьютером используется модуль mdns-js
Отправка UDP пакетов реализована через модуль самой ноды dgram. UDP логично выбран за низкие задержки передачи, относительно TCP.
Опрос геймпада делается модулем gamepad, который легко ставится на чистую ноду, но для электрона его нужно пересобрать по инструкции.
В будущем передачей команд управления танкам и отправкой изображения игрокам будет заниматься один сервер на той же node.js
Китайское производство сообщает, что платы готовы к отправке и через пару недель будут у меня. Пока я немного упрощу управление ботом.
Сейчас танк крутит гусеницами с задаваемой с геймпада скоростью, и не имеет «органов чувств» для получения информации об окружающем мире. Из-за этого он не может узнать, что упёрся в какое-то препятствие и при проскальзывании или брокировке гусеницы немного сбивается с курса во время движения.
Одним из датчиков танка будет интегральный гироскоп, который при регулярном опросе выдаёт значение углов поворота относительно трёх пространственных осей с предыдущего измерения. Если короче - скорость поворота. Интегрируя эту скорость, мы получим угол поворота танка относительно начального положения. Идеально для корректировки ориентации на коротком отрезке времени.
На гифке гироскопически стабилизированный подвес для видеосъёмки смартфоном.
Сейчас танк крутит гусеницами с задаваемой с геймпада скоростью, и не имеет «органов чувств» для получения информации об окружающем мире. Из-за этого он не может узнать, что упёрся в какое-то препятствие и при проскальзывании или брокировке гусеницы немного сбивается с курса во время движения.
Одним из датчиков танка будет интегральный гироскоп, который при регулярном опросе выдаёт значение углов поворота относительно трёх пространственных осей с предыдущего измерения. Если короче - скорость поворота. Интегрируя эту скорость, мы получим угол поворота танка относительно начального положения. Идеально для корректировки ориентации на коротком отрезке времени.
На гифке гироскопически стабилизированный подвес для видеосъёмки смартфоном.
Донором гироскопа станут останки модели аппарата на воздушной подушке, где гироскоп использовался с той же целью - для стабилизации курса.
В аппарате на предыдущей фотографии для поворота вокруг вертикальной оси используется тот же принцип, что и в популярных сейчас коптерах. Считаю, что вам интересно будет узнать, как это работает без использования рулей направления.
Если объяснять просто, то винт толкает воздух, а воздух этому сопротивляется. Это сопротивление передаётся на раму коптера, которая в воздухе ни за что не закреплена, и потому начинается вращаться в обратном пропеллеру направлении для компенсации сопротивления воздуха. Это называется реактивным моментом винта.
Возьмём для примера коптер с четыремя пропеллерами. Два его пропеллера вращаются по часовой стрелке, и ещё два против часовой. Такая схема позволяет пропеллерам разного направления компенсировать реактивные моменты друг друга. Теперь, чтобы повернуть коптер против часовой стрелки, нам нужно увеличить обороты винтов, вращающихся по часовой стрелке, увеличивая их реактивный момент.
Если объяснять просто, то винт толкает воздух, а воздух этому сопротивляется. Это сопротивление передаётся на раму коптера, которая в воздухе ни за что не закреплена, и потому начинается вращаться в обратном пропеллеру направлении для компенсации сопротивления воздуха. Это называется реактивным моментом винта.
Возьмём для примера коптер с четыремя пропеллерами. Два его пропеллера вращаются по часовой стрелке, и ещё два против часовой. Такая схема позволяет пропеллерам разного направления компенсировать реактивные моменты друг друга. Теперь, чтобы повернуть коптер против часовой стрелки, нам нужно увеличить обороты винтов, вращающихся по часовой стрелке, увеличивая их реактивный момент.
И наглядная демонстрация (пропеллер крутится по часовой стрелке):