Кадавры профессора Новикова
416 subscribers
111 photos
11 videos
5 files
68 links
Процесс и результат конструирования всякого мусора
Гениальные идеи писать сюда: @nda2911
Download Telegram
Пару недель назад посмотрел это видео: https://youtu.be/LjJCkGUTHlA и захотел оживить свой старый проект управления роботом через интернет.
В моём случае всё будет несколько проще, с общим для всех игроков видом сверху и стилизацией под игру Batlle City с Денди.
Порылся в закромах, нашёл необходимое (слева-направо):
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В.
wifi_tank.ino
5.6 KB
Я набросал в Arduino IDE примитивный скетч, который крутит двигателями, выдаёт напряжение аккумулятора, управляется по UDP и поддерживает обновление по воздуху.
Для уменьшения акустического шума, частота ШИМ для управления двигателями установлена в 16 кГц, которые слышно только если приложить двигатель непосредственно к уху (ну или если у вас слух летучей мыши).
Для изготовления самих танков у меня было два варианта: начертить всё самому и напечатать на 3D принтере или купить готовый набор РУ танков и поставить в них свою электронику. Я выбрал второй вариант из-за лени. Если что, набор называется "AirZoft Battle Tank 1:48".
Честно говоря я ожидал, что они будут крупнее, но и в такой корпус можно всё засунуть.
После трёх или четырёх итераций впихивания с заменой 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
​​Разбавлю эту техническую галиматью эффектным случаем из работы:

- Ой, что это так бумкнуло?
- Это IGBT-модуль за $200.
​​Китайское производство сообщает, что платы готовы к отправке и через пару недель будут у меня. Пока я немного упрощу управление ботом.
Сейчас танк крутит гусеницами с задаваемой с геймпада скоростью, и не имеет «органов чувств» для получения информации об окружающем мире. Из-за этого он не может узнать, что упёрся в какое-то препятствие и при проскальзывании или брокировке гусеницы немного сбивается с курса во время движения.
Одним из датчиков танка будет интегральный гироскоп, который при регулярном опросе выдаёт значение углов поворота относительно трёх пространственных осей с предыдущего измерения. Если короче - скорость поворота. Интегрируя эту скорость, мы получим угол поворота танка относительно начального положения. Идеально для корректировки ориентации на коротком отрезке времени.
На гифке гироскопически стабилизированный подвес для видеосъёмки смартфоном.
​​Донором гироскопа станут останки модели аппарата на воздушной подушке, где гироскоп использовался с той же целью - для стабилизации курса.
​​В аппарате на предыдущей фотографии для поворота вокруг вертикальной оси используется тот же принцип, что и в популярных сейчас коптерах. Считаю, что вам интересно будет узнать, как это работает без использования рулей направления.
Если объяснять просто, то винт толкает воздух, а воздух этому сопротивляется. Это сопротивление передаётся на раму коптера, которая в воздухе ни за что не закреплена, и потому начинается вращаться в обратном пропеллеру направлении для компенсации сопротивления воздуха. Это называется реактивным моментом винта.
Возьмём для примера коптер с четыремя пропеллерами. Два его пропеллера вращаются по часовой стрелке, и ещё два против часовой. Такая схема позволяет пропеллерам разного направления компенсировать реактивные моменты друг друга. Теперь, чтобы повернуть коптер против часовой стрелки, нам нужно увеличить обороты винтов, вращающихся по часовой стрелке, увеличивая их реактивный момент.
​​И наглядная демонстрация (пропеллер крутится по часовой стрелке):
​​Для компенсации нудятины вот вам короткая история провала: у меня всего на пару секунд пропало изображение с камеры коптера, а сильный ветер скорректировал его курс до встречи со стеной ближайшего здания. В итоге сломаны два луча рамы и оборвана фаза одного из двигателей.