Строим роботанк с управлением по Wifi, камерой, пушкой, блекджеком и т.д

    image

    Всем привет. У меня таки возникло непреодолимое желание поделиться с миром своим достижением. Достижением является танк, который рулится по WiFi с геймпада, транслирует на пульт видео в реальном времени, передает с пульта и на пульт звук, а также имеет пушку с лазерным прицелом, из которой можно в кого-нибудь пострелять.

    Этот пост будет первым тестовым, дабы понять, интересно ли такое кому-нибудь, кроме меня. В нем опишу общее строение, используемые технологии и устройства.

    UPD: добавлено видео.


    Для начала маленькое видео для привлечения внимания. Звук идет из колонки танка.


    С чего все начиналось


    Давным-давно была у меня мечта сделать робота на гусеничном шасси, которым можно было бы удаленно рулить. Основной проблемой было отсутствие непосредственно гусеничного шасси. В конце концов я уже решился купить радиоуправляемый танк на разборку, но мне повезло, в магазине среди хлама нашелся танк Snow Leopard (Pershing) — USA M26 с погоревшей электроникой, но полностью исправной механической частью. Это было ровно то, что нужно.

    image

    Вдогонку к шасси были докуплены два регулятора напряжения для коллекторных двигателей, штатив для камеры из двух сервоприводов, веб-камера с аппаратной поддержкой mjpeg и внешняя WiFi карточка TP-LINK TL-WN7200ND. Чуть позже к списку устройств добавились портативная колонка, USB звуковуха Creative SoundBlaster Play и простенький микрофон, а также пара USB хабов, чтоб все это подключить к модулю управления, которым стал Raspberry Pi. Башня с танка была демонтирована, рулить ею было очень неудобно, так как вся штатная механика была построена на обычных двигателях без обратной связи.

    Сразу оговорюсь, что фотки делались, когда танк был почти готов, а не в процессе изготовления.

    Питание и проводка


    image

    В батарейный отсек я запихал самую большую Li-Po батарею, которая туда влезла. Ей оказалась двухбаночная батарейка на 3300 mAh в твердом корпусе, которая обычно используется в модельках машин. Паять мне было лень, поэтому для всей коммутации была использована стандартная макетная плата с шагом 2.54. Позже появилась вторая на верхней крышке и шлейф, который их соединял. На каждый из двух двигателей у меня был свой регулятор напряжения, который в виде бонуса выдает стабилизированное питание около 5.6 вольт. С одного регулятора был запитан Raspberry и WiFi карта, питание со второго пошло на сервоприводы и USB хаб с периферией.

    Надо заставить это двигаться


    Надо было как-то это завести. Raspberry был выбран не случайно. Во-первых он позволяет поставить нормальный полноценный линух, а во-вторых имеет кучу GPIO ног, которые в том числе могут генерировать импульсный сигнал для сервоприводов и регуляторов хода. Генерировать такой сигнал можно с помощью утилиты ServoBlaster. После запуска она создает файл /dev/servoblaster, в который можно писать что-то типа 0=150, где 0 — номер канала, а 150 — длина импульса в десятках микросекунд, то есть 150 — это 1.5 миллисекунды (у большинства сервоприводов диапазон значений 700-2300 мс).
    Итак, подключаем регуляторы на 7 и 11 GPIO пины и запускаем servoblaster командой:

    # servod --min=70 --max=230 --p1pins=7,11
    

    Теперь, если записать в /dev/servoblaster строки 0=230 и 1=230, то танк рванет вперед.

    Подключаем камеру


    Кататься взад-вперед было классно, но хотелось делать это хотя бы в соседней комнате, а в идеале вообще через интернет, поэтому надо было наладить видео в реальном времени. На просторах интернета нашелся простенький проект tinycamd. проект представляет собой сервис, который управляется по http, может делать скриншоты и менять настройки камеры. Не густо, но ничего лучше я не нашел, поэтому пришлось вспоминать С и дописывать то, чего не реализовал автор, а именно, трансляцию потока MJPEG по HTTP(кстати, как поделиться доработанным исходником с миром?). Здесь критически важно, чтобы JPEG приходил с самой камеры, процессора Raspberry на такое не хватит. В итоге я подключился к танку по ssh, открыл видеопоток через браузер, покатался по дому и был счастлив до тех пор, пока не просел канал. Было очень забавно сначала смотреть на застывший кадр, а потом получить все, что застряло в ускоренном режиме. Стриминг realtime видео через TCP — это зло.

    Апгрейды, улучшения и т.п.


    Далее шел долгий процесс написания серверной и клиентской части на Python'е c использованием библиотеки pygame для получения событий от геймпада, допиливание tinycamd, чтоб он посылал видео поток по UDP и установка камеры на штатив из сервоприводов, чтобы была возможность оглядеться. После чего танк отправился в первое путешествие по офису за пределы прямой видимости. И в этот момент пришло понимание, что хочется не только смотреть видео, но и иметь двусторонний аудио канал, чтобы, например, попросить коллег открыть дверь или вызвать лифт.

    Звук


    Для воспроизведения звука была использована дешевая карманная USB колонка, купленная в супермаркете по акции. Она была подключена вместе с простеньким микрофоном через USB звуковуху. Для работы со звуком пригодилась библиотека pyalsaaudio. После допиливания сервера и клиента появилась возможность в процессе рассекания на танке говорить и слушать.

    Свет


    Следующей фичей оказалась фара. В какой-то момент стало понятно, что чувствительности камеры может легко не хватать и есть шанс заехать в темноту и не выехать. Первой идеей была инфракрасная подсветка. Была собрана линейка инфракрасных светодиодов, но, как показала практика, толку от них ноль. Светят очень плохо и мало. А готовые инфракрасные прожекторы требуют 12в питание (а у меня всего 2 банки, то есть 8в максимум), много жрут тока, громоздкие и стоят дорого. В итоге было решено перейти в видимый диапазон, были куплены два мощных белых SMD светодиода и линзы к ним. Для питания фары коллегами по работе был сотворен драйвер с регуляцией по току, который включался через полевой транзистор подачей единицы на GPIO ногу Raspberry. Отныне темные комнаты перестали быть препятствием.

    Батарея, точнее уровень ее заряда


    На всех этапах оставалось непонятным, сколько еще можно кататься, не убив батарейку (Li-Po нельза разряжать ниже чем 3.3в на банку). Я не нашел способа замерить напряжение с помощью GPIO ног Raspberry, поэтому в качестве измерителя поставил Arduino Nano, к которому на будущее сразу подключил LCD экран c I2C адаптером. Батарейка подключается через половинный делитель на аналоговую ногу Arduino, после чего остается только откалибровать показания. Arduino по традиции общается с основным модулем через COM порт, который у Raspberry также выведен на GPIO ноги.

    Какой же танк без пушки


    Одной из последних деталей танка стала пушка. Пушка была куплена там же, в магазине радиоуправляемых моделей в виде запчасти. Она, правда, предназначалась для другой модели танка, но суть ее от этого не изменилась. Пушка пневматическая, имеет двигатель, взводящий пружину поршня, и контакт, который замыкается при выстреле. От горизонтального поворота пушки я пока что отказался, чтоб не снести ей весь обвес, который прицеплен на верхнюю крышку, а для вертикального использовал мощный сервопривод. Чтоб было проще рулить, я сделал поворот пушки по синхронным с поворотом камеры. То есть куда смотрим (по вертикали), туда и стреляем. Для прицеливания на ствол пушки был примотан лазерный светодиод от указки. Чтоб лишний раз не тратить батарею и не светить лазером куда не надо, нужно было сделать пушку отключаемой. Процесс выстрела также не совсем прост. Надо включить питание двигателя и ждать замыкания контакта, после чего двигатель выключить. В итоге управление выстрелом и питанием сервы и лазера было повешено на ардуину, а сигнал для сервы генерирует Raspberry. Для двигателя пушки также пришлось проводить отдельный силовой провод и включать его постепенно, используя ШИМ, так как иначе прилетает помеха по питанию и Arduino уходит в ребут. Для подачи снарядов, то есть шариков, была использована коробочка от драже TicTac с дыркой в дне.

    Наверное, для первого раза хватит. Если статья понравится, буду потихоньку писать детали в следующих постах. И еще немного фоток напоследок, а также свежеснятое видео. Правда, качество получилось не очень, так что у эстетов заранее прошу прощения. ссылка на github

    imageimageimage





    Share post

    Comments 71

      +34
      Одно но: статье срочно необходим видеоряд с демонстрацией всех возможностей аппарата. Желательно в двух вариантах: вид с камеры танка и вид сбоку/сверху.
        0
        Это да, видео я попытаюсь снять в ближайшее время.
          +1
          Добавил видео
            0
            Шустрый какой аппарат :)
            Вообще впечатляет, классная штуковина получилась
        +7
        Какое КД и пробитие у этой пушки?
          +1
          Пушка на самом деле довольно хилая, так как это не страйкбольный привод, а все-таки запчасть от игрушки для маленьких детей. Она тут скорее для галочки и как proof of concept с целью при случае заменить на что-нить помощнее.
            +2
            А перезарядка сколько занимает?
              0
              Зависит от того, чем заряжать. У меня самая дешевая зарядка, которая шла в комплекте с р/у самолетом. Она дает не больше ампера, поэтому заряжаться это дело может несколько часов. Если взять хорошую зарядку, которая десятки ампер выдает, то процесс пойдет явно быстрее.
                +2
                Не, я про скорострельность пушки спрашивал :)
                  +1
                  А, сорри, не туда посмотрел. Выстрел занимает около полутора секунд. Если поставить вместо двух Li-Po банок три, то наверняка будет пошустрее. Перезарядки как таковой нету, шарик падает в ствол перед самым выстрелом.
                  +1
                  koreec, возможно, имел в виду время перезарядки пушки, в контексте вооружения танка…
            0
            Зачетно! А я себе недавно 3-д принтер купил, одна из целей покупки была как раз спроектировать танк, управляемый с джойстика, с видеосвязью и пушкой. Тоже ностальгия по детству замучала) Только вот руки все никак не доходят, да и времени свободного сейчас не так уж и много: так и стоит принтер пылится уже с полгода. Шасси, кстати, насколько я понимаю, тоже можно на принтере распечатать: вроде бы продатся специальная резина для печати, для гусениц должна подойти, если она достаточно пластична. Ну и принтер для этого иметь совсем не обязательно: можно разработать 3д модели всех деталей и отдать на печать в специализирующуюся на этом фирму.
              0
              Гусеницы, да и шасси, можно лазером порезать. Причем гусеницы могут получиться весьма красивыми, можно даже протектор, или как он на них называется, под условия подобрать. Вот, например, вариант — две разные детали, колесо и гусеницу можно набрать любой толщины.

              трак и колесо
              image

                0
                Лазером, видимо, получится гораздо лучше, потому что огрехи при 3д-печати не позволят сделать сегменты гусеницы миниатюрными: их будет клинить, или придется «дорабатывать напильником». Это что ж мне теперь, еще и лазерный резак покупать? )) Интересно, бывают сейчас такие для бытового использования, какой на них порядок цен, как они вообще правильно называются, и как обстоят дела с материалами?
                  0
                  Можно напечатать гусеницы сразу в сборе из полиамида, по технологии sls. Самое главное спроектировать их правильно и зазор сделать в 0,6 мм на осях и они как раз получатся достаточно подвижными. Но вообще, лучше резинки тут не получится сделать, а ее лучше всего отливать. Отлить можно легко с помощью вакуумного литья в силикон, скорее всего получится взять прототип из полиамида как мастер-модель.

                  Еще было бы круто спроектировать башню, что бы закрыть электронику, ее тоже можно легко распечатать.
                    0
                    Спасибо, узнал много новых терминов, буду гуглить )
                      0
                      Всегда пожалуйста. Если будут вопросы по этим темам, обращайтесь.
                0
                На тему печати танка на 3Д принтере — veterobot.org и статья на хабре на эту тему.
                0
                Arduino Nano действительно очень помогает в подобных пороектах.

                Танк на 5 баллов!
                  +4
                  Нужно сделать два таких танка, расчет пробития в зависимости от места попадания, урон… Если будет достаточно бюджетно — можно все это дело монетизировать. Уверен, что спрос точно будет.
                  PS Как заметили выше — обязательно добавьте видео.
                  PPS И начинайте уже писать детали, это и правда интересно!
                    +1
                    Я уже понял, что не хватает видео. Буду исправляться.
                    +6
                    Сколько у кота есть времени до того, как сядет батарея в танке и танка можно больше не бояться?
                      +3
                      Прочел статью, и мне тоже подумалось: «Бедная кошка!» :)
                        0
                        Кота у меня пока что нету, но минут 10-15 его точно можно было бы погонять.
                          +1
                          если танк оснастить контактами, которыми он может наехать на базу для зарядки… то у котов нет шансов!
                            +1
                            Это есть в планах на будущее. Пара подпружиненных контактов на передней части, чтоб камеру вниз повернуть и видеть, куда паркуешься.
                              0
                              Qi облегчит задачу.
                                0
                                А где его взять и может ли он передавать 12в?
                                  0
                                  купить антенну и передатчик можно в сети.
                                  сделать 12В<->5В несложно.
                                  но это что бы не заморачиваться с контактами.
                                    0
                                    а если разгонять 5 до 12-ти, оно ток-то удержит? Мне кажется, что 3-4 ампера на 5 вольтах пока нереально для такой системы. Ей все-таки телефоны заряжают, а там на больше ампера на 5 вольтах.
                            +1
                            А что делает дисплей спереди танка? Выводит заряд батарейки?
                              0
                              Дисплей пока что выводит заряд батарейки и состояние пушки. В дальнейшем планируется туда выводи состояние проброса звука.
                              0
                              Как пушка-то?
                                0
                                Убойная сила никакая, как писалось выше, но в целом прикольно.
                                0
                                Отличная работа!
                                Расскажите, пожалуйста, подробнее про проброс звука. Задержки есть?
                                  +1
                                  По звуку есть лаги, так как на танке и пульте стоит PulseAudio, а он очень не любит маленькие пакеты (грузит процессор). Получается около полсекунды лага на хорошем канале. В целом жить не мешает.
                                    +1
                                    В начале хотел сделать полноценный RTP, но потом понял, что лень, да и не особо нужно. В итоге с pyalsaaudio забирается звук в любом формате, который тот умеет, посылается по UDP на удаленную сторону, где запихивается в ту же библиотеку на воспроизведение.
                                      0
                                      Спасибо!
                                  –4
                                  Как минимум, Ваш прототип должен быть интересен министерствам обороны и оборонным компаниям ;)
                                    +5
                                    Сдается мне у них своего такого добра навалом.
                                    –8
                                    И это меня корили в сташненьком монтаже и ненужности разработки! Смотрю я на такие «изделия» и задаюсь вопросом — ЗАЧЕМ? Мечта детства актуальна в детстве, а путь этой игрушки — либо под разборку, либо пылится на антрессоли. А ведь в неё вложены не копейки а так думаю несколько килорублей. Да и время прилично потрачено.
                                    Автор накупил железяк, понатыкал их в макетку, замотал изолентой. Затем скачал несколько готовых пакетов, ну может написал пяток строк для согласования. В результате собрал абсолютно бесполезное устройство. Где профит? Кота понять? И сразу в коментах детский сад. Ах какая класная машинка, дай погонять. Куча восхищений. Смешно…
                                      +5
                                      А профит от процесса создания и воплощения детской мечты. Да, я в детстве не наигрался в конструктор и в детстве у меня было сильно меньше вариантов деталей.

                                      3D принтера и станка с ЧПУ, чтобы сделать все красиво, у меня нету. Макетная плата позволяет не переразводить дорожки каждый раз, когда появилась новая мысль. А насчет пары строк для согласования, их там сильно больше.

                                      А если все делать либо сразу в продакшене (что невозможно), либо никак, то жизнь станет серой и скучной.
                                        –1
                                        Ну так расскажите что ни будь интересное, какие решения Вы применяли, какие — то тонкости, которые помогут другим. А то такими темпами мы скоро будем как на ингстраме присылать фотографии обедов, которые мы сварили из рецептов поваренных книг. Я просто пытаюсь понять, почему этот пост вызвал такое восхищение. Автор собрал на коленке стандартную тележку, с помощью стандартных компонентов. Рассказов о всех частях уже было море. Ну наверное самое интересное — это пушка, да и то купленная как готовое изделие. Что то доводить до ума ему лень, о чем он сам и говорит. С моей точки зрения — это похвастаться о том как ты собрал из лего замок и исполнил свою детскую мечту. Ну не знаю… я вчера с дочерью собирал пазлы. Мне то же этому пост посвятить? Как прикрутить изолентой лазерную указку я знаю. Про передачу видео через расбери — море информации, управление сервоприводами — тоже. Ардуино + малина то же не новость. Хорошо оставляем вопрос «Зачем». Тогда другой вопрос — а что здесь нового, что хотели сообщить этим постом. В ингстраме — там понятно — похвастаться. Но здесь то не ингстрам. Здесь все таки рассказывают о своих находках, делятся полезной информацией. Не деградируем ли мы.
                                        +3
                                        Каждый получает удовольствие от разработки по-своему: кто-то за большие деньги пишет коммерческие продукты, а кто-то дома паяет на коленке. Профит? Удовольствие от решения сложностей (какими бы они ни были), радость от полученного результата (каким бы маленьким от не казался). Бесполезное устройство? Возможно, но в процессе его создания нарабатывается опыт, получаются позитивные эмоции и т.д. А на вопрос ЗАЧЕМ по-моему лучше всего отвечает
                                        эта картинка:

                                        UPD Автор быстрее написал, но похоже, что наши мысли сходятся :)
                                          +1
                                          Забавно то, что «защитник науки» подозрительно похож на Лоуренса Краусса, который говорит словами «учёного»: мол, не надо спрашивать, какую практическую пользу можно извлечь из исследования космоса — это нужно делать потому, что это само по себе невероятно круто и расширяет границы человеческого знания.

                                          В общем, присоединяюсь к вам, автору и комментатору ниже: если не делать что-то для себя в рамках хобби, то можно просто съехать с катушек и впасть в депрессию. Нельзя бесконечно жить на одной мотивации успеха ради неё самой, думать только о работе и «пользе». Если только одна ваша работа не делает вас счастливым, что бывает очень редко.
                                          +4
                                          Что за время такое наступило — люди стали думать лишь о том где профит. А для души? У человека есть свободное время, и он тратит его таким, не худшим образом.
                                            +1
                                            А комент такой интересно зачем писать? Интересно автору было такое попробовать сделать вот он и сделал.
                                              –1
                                              Ну вот и мне интересно, в чем секрет успеха — то. Ведь ничего интересного, а все пищат от восторга. Я наверное в другом мире живу, но у меня желания пищать почему — то не возникает
                                                +4
                                                Вот и живите в своем мире, а мы порадуемся за автора :)
                                            +2
                                            Обязательно, слышите, обязательно добавьте к голосу ринг-модулятор и легкий дисторшн!

                                            Уничтожить!
                                            image

                                              0
                                              Далеки стали популярны последнее время :) Только в восьмом сезоне им мало внимания уделено
                                              +1
                                              Вам за основу не танк, а робопылесос брать надо было. С ковриком для подзарядки. Все равно пушку отдельно навешивали.
                                                0
                                                Хотелось именно гусеничную основу, да и 10к на робопылесос тратить жаба давит
                                                  0
                                                  Те кто делают пылесосы еще много чего делают на гусенечной платформе. Я в свое время обмечтался достать такую.
                                                  Пример платформы на гусеницах

                                                  P.S. Они раньше еще предлагали платформу для разработчиков, но сейчас сходу не нашел
                                                    0
                                                    Эту штуку я видел. Она мелкая и законченная, а мне хотелось все самому построить.
                                                +4
                                                Мой прототип программируемого танка
                                                  0
                                                  Мы с сыном только-только начали строить свой. Правда, не танк. Все комплектующие были куплены на Ebay. Фотки в спойлере, т.к они большие.

                                                  Фото нашего робота
                                                  Платформа с двумя моторами:

                                                  image

                                                  Мотор с датчиком скорости:

                                                  image

                                                  Контроллер моторов:

                                                  image

                                                  ATMega 328 с очень удобной панелькой:

                                                  image

                                                  То, что ещё планируется установить. Слева направо: сервопривод ультразвукового датчика, сам ультразвуковой датчик, компас (возвращает отклонение от севера в градусах), модуль Bluetooth.

                                                  image

                                                  Да, ещё будет камера. Обязательно.
                                                    0
                                                    С датчиками все понятно, а вот что будет с камерой не ясно. Куда ее тут подключать?
                                                      0
                                                      А, забыл добавить. Там на нем еще будет TP-Link 703N — на нем WiFi + камера. OpenWRT + LAMP будет стоять. Ну и вся логика будет на каком-нибудь PHP. А Arduino для связи с низкоуровневыми устройствами. Он легко подключается к роутеру через последовательный порт. Я уже так делал, и даже изобрёл свой велосипед написал простой протокол обмена данными. У 703N там по-моему, 16 мб памяти, поэтому со скриптами будет где развернуться фантазии :)
                                                        0
                                                        Почему PHP??!
                                                          0
                                                          Потому что джава тяжеловата для OpenWRT
                                                            0
                                                            Настоятельно рекомендую для таких фокусов минимум Python. В PHP нету потоков — наплачетесь. Кстати, роутера может не хватить по быстродействию и оперативки у него нету почти. Может, стоит задуматься о Raspberry или его аналогах?
                                                              0
                                                              Зачем Raspberry, там уже Ардуина есть. В роутере будет только логика, её можно на автоматах построить и потоки не нужны.
                                                    0
                                                    Несмотря на время создания, хочется добавить для тех, кто собирается сделать что-то похожее.
                                                    JPEG приходил с самой камеры, процессора Raspberry на такое не хватит

                                                    Не совсем верно, на борту малинки есть очень производительный VPU с полной поддержкой в gstreamer (модули omx***), который успевает сжимать 30fps h264 с обычной UVC-камеры вообще не нагружая процессор. Разрешение при этом ограничено только возможностями usb-девайса и интернет-соединения:)
                                                      0
                                                      Имелось в виду, что не хватит проца на realtime сжатие MJPEG.
                                                      А как аппаратно жать поток не со специальной камеры, которая шлейфом подключается, а с обычной usb'шной камеры?
                                                        +1
                                                        Вот так примерно можно
                                                        gst-launch-1.0 v4l2src device=/dev/video1 ! queue ! video/x-raw,width=640,height=480,framerate=30/1 ! omxh264enc ! tcpclientsink host=<server> port=5000
                                                        

                                                        Пакет gstreamer-omx кажется — обертка для OpenMax.
                                                        Камеры, которые умеют отдавать 720p, обычно сами жмут картинку в MJPG, но для передачи через lte-модем я её все равно перекодирую в h264, иначе поток слишком жирный.
                                                        gst-launch-1.0 v4l2src  device=/dev/video0  ! image/jpeg,width=1280,height=720,framerate=30/1 ! queue !  decodebin ! omxh264enc ! tcpclientsink host=<server> port=5000  sync=false
                                                        

                                                          0
                                                          спасибо, буду знать
                                                      0
                                                      Можно сделать тоже самое, только управлять через удаленный рабочий стол ?
                                                        0
                                                        не понял вопроса, можно по-подробнее?
                                                          0
                                                          Уже разобрался и собрал свой) Имел ввиду управление по SSH.
                                                        0
                                                        Прям в кайф смотреть на законченную игрушку взрослого дядьки )) Даже позавидовал. Прям правильное использование дуинки. Статью лайкнуть не могу — отправил плюс в карму.
                                                        ps: зажимные клема это богоугодно

                                                        Only users with full accounts can post comments. Log in, please.