Самодельный бот с камерой и управлением по wifi

Прочитав опубликованную статью Однажды фанера, atmega, да малина, я решил поделиться своей поделкой, которая доступна (не сложна) для повторения.

При создании бота ставились следующие задачи:
  • Управление ботом по беспроводной сети
  • Наличие онлайн камеры
  • Удобство программирования


Бортовой компьютер


Для бортового компьютера был выбрал двухъядерный андроидный миникомпьютер UG-802, который имелся под рукой. В качестве операционной системы — полноценный линукс дистрибутив, сборка Ubuntu от Linaro.



Для начала нужно было чтото сделать с проблемным встроенным wifi адаптером, который упорно не желал запускаться под пересобранным ядром. Кардинальным решением было выпаять его и установить второй USB хост коннектор, в который можно будет воткнуть нормальный usb wifi (или даже 3G модем). Сказано — сделано, плата встроенного wifi была отпаяна и вместо нее напаян второй хост.

Первая проверка внутреннего USB host-а:


Окончательный вид установленного USB host-а:


Колесная платформа


Когда-то я заказывал платформу Ardubot и колеса с моторами к ней, но руки до нее не доходили. Не долго думая, было решено ей воспользоваться. На нее была смонтирована плата преобразователя с 12 в 5 вольт, выдранная из специально купленной в магазине автомобильной зарядки (используемая в ней микросхема имеет более широкий диапазон входного напряжения). Литий-полимерный аккумулятор на 11.1В/1250мА уже имелся от разбитой, в прошлом, модели самолета. Плату Ardubot-а пришлось подвергнуть легкой модификации из-за особенностей платы управления (дорожка отрезана от D9 и запаяна на D7). Так же был установлен усб разъем, на который выведено только 5 вольтовое питание:


Сзади видны провода идущие от энкодеров колес:


Управление двигателями, светом


Изначально платформа Ardubot была расчитана на совместное использование с Arduino, почему бы этим не воспользоваться. Вместо Ардуино я взял OLIMEX PIC32-PINGUINO-MX220, совместимый по разъемам. Выяснилась неприятная мелочь — один из пинов управления мотором был использован для светодиода на плате PINGUINO. Все бы ничего, но этот светодиод мигал в режиме загрузки фирмвари, заодно проворачивая колесо. Поэтому пришлось перепаять дорожку, о чем было написано выше.

Для простоты отладки и универсальности, плата управления подключается через USB. Прошивка PINGUINO эмулирует CDC-ACM устройство, видимое для пользователя как последовательный порт /dev/ttyACM0. Отправляемые команды управления выглядят так:
MOTOR X Y X — номер мотора, Y — состояние
LIGHT X Y X — номер лампы, Y — состояние
CLEAR сбросить все в состояние по умолчанию
COMMIT Применить


Нумерация моторов: 0 — левый, 1 — правый.
Состояния: 0 — остановлен, 1 — вперед, -1 — назад.

Например, чтобы включить задний светодиод на платформе, достаточно из консоли отправить команды:
echo "LIGHT 1 1" > /dev/ttyACM0
echo "COMMIT" > /dev/ttyACM0


Чтобы поехать вперед:
echo "MOTOR 0 1" > /dev/ttyACM0
echo "MOTOR 1 1" > /dev/ttyACM0
echo "COMMIT" > /dev/ttyACM0


Камера и хаб


Один USB порт бортового (ботового) компьютера используется wifi адаптером, в другой плата управления платформой. Куда подключить камеру? Выход есть — использовать хаб. В одном из компьютерных магазинов была куплена одна из самых дешевых веб камер и USB хаб подозрительного вида.

Размещение электроники


В процессе поиска из чего слепить бота, была удачно найдена пластиковая коробочка-упаковка из под IPOD TOUCH, в которую идеально влазил UG802 и разобранный USB хаб. Для трех коннекторов хаба в боку был сделан вырез. В четвертый (внутренний) коннектор воткнулась камера (с предварительно укороченным кабелем). В крышке также был сделан вырез под разъем USB на UG802, который не давал ей закрыться:


Все это дело прикрутилось сверху над PINGUINO-MX220 — платой управления платформой:


Окончательная сборка и тестирование


Наступило время собрать все в одно целое:


Все проводки были воткнуты куда им положено — PINGUINO в хаб, UG802 питание в USB коннектор на Ардуботе:


Бортовой компьютер настроен для доступа по ssh, весь нужный инструментарий для работы (компилятор, библиотеки, mc) установлены из репозитория Linaro. Заходи, пиши, компилируй и отлаживай прямо на нем. Красота!

Для тестирования разработана консоль управления, которая показывает онлайн изображение с камеры бота и отправляет ему команды куда ехать, какие лампы включить-выключить. Софт бота принимает команды и отправляет онлайн видео на консоль управления. Текущий статус — глубокая бета. Однако пользоваться системой уже можно!

Видео демонстрация




Рекомендации

Необязательно использовать спаркфановский ардубот, есть более дешевые и лучшие варианты.
UG802 можно также заменить дешевыми аналогами (MK802, CX-01), но нужно смотреть, чтобы были доступны исходники ядра, работающие на конкретном девайсе-клоне. Иначе установка полноценного линукса будет проблематична либо вообще невозможна.

Ссылки

Проект на гугол коде (исходники)
Linaro
PIC32-PINGUINO-MX220 на сайте OLIMEX
Ardubot на Sparkfun

Комментарии 23

    +2
    Обожаю подобные статьи из разряда «сделай сам»)
    Большое спасибо.
      +1
      вот еще была статья «машинка под управлением сотового телефона» — там использовалась мощь телефона и его wifi и камера.
      http://habrahabr.ru/post/146020/
        0
        Со временем (после энного количества построенных тележек) включается хотелка какого-то осмысленного катания. Не пространного «могу съездить на кухню, посмотреть что там творится», а конкретного — соревнования, войнушка или ещё что-то, но не просто катание без дела.
          +13
          У меня вот танчики щас катаются. ИК бой (усовершенствованая Тамия)



          Если кому-то будет интересно — рожу пост, может быть.
            +5
            Очень интересно. Напишите, пожалуйста.
              0
              <шёпотом>Тут всё на базе нашей виртурилки, так что пост смогу написать только после тиража, иначе меня народ живьём сожрёт </шёпотом> :-)
                0
                Ну, хотя бы так.
              +1
              эх… красота еще бы стрелял и все работе конец…
                0
                Так ведь стреляет. Правда, ИК-сигналами, а не пульками.
                0
                Танки ездят по APшкам, или мне показалось?)
                  0
                  Не показалось :-)
                  –1
                  Just beat it!
                +1
                Расскажи что ты применял для трансляции видео с камеры.
                Я тоже сравнительно недавно собирал простого бота, правда под малиной и использовал gstreamer для видео, но мой фреймрейт все равно оставляет желать лучшего.

                  0
                  У вас gstreamer MJPEG напрямую с камеры отдаёт?
                    0
                    gstreamer напрямую отдает, но я не использую mjpeg сжатие
                    как мне грамотно сформировать цепочку для сжатия и передачи видео?
                      0
                      Ну раз напрямую с камеры — то это уже MJPEG скорее всего. Какая модель камеры?
                      У меня вот такая цепочка, но она только для конкретной моей железки (с аппаратным энкодом в h24, для малины не подойдёт)

                      gst-launch v4l2src always-copy=FALSE chain-ipipe=true ! video/x-raw-yuv,format='(fourcc)'NV12, width=640, height=480, framerate='(fraction)'30/1 ! queue ! dmaiaccel ! dmaienc_h264 encodingpreset=2 ratecontrol=1 intraframeinterval=23 idrinterval=46 targetbitrate=600000 ! rtph264pay !udpsink port=3000 host=192.168.1.37 sync=false enable-last-buffer=false

                      Для сжатия в MJPEG силами DSP у меня вот такая, но, опять же, для малины не подойдёт, надо заменить dmaienc_mjpeg на обработчик который у вас в гстримере есть (должен быть).

                      /usr/bin/gst-launch -e v4l2src always-copy=false chain-ipipe=true ! dmaiaccel ! video/x-raw-yuv,width=640,height=480,framerate=\(fraction\)30/1 ! ffmpegcolorspace ! dmaienc_mjpeg copyOutput=true outputBufferSize=0 qValue=60 ! tcpserversink port=8080 sync=false

                      Попробуйте скомандовать gst-inspect | grep mjpeg и посмотрите какие подходящие обработчики у вас есть.
                        0
                        модель камеры Logitech c300.
                        Спасибо за советы, буду экспериментировать
                    0
                    Кадры напрямую читаются с камеры, сжимаются в jpeg libjpeg-ом и отправляются по TCP. Сама камера кроме как YUYV картинки выдавать ничего больше не умеет. Вообще собираюсь использовать нормальное видеокодирование с помощью libavcodec и передаче на консоль по UDP.
                      0
                      Я когда игрался тоже лагало сильно, а тут вообще все отлично. Буду тогда переделывать!
                      www.youtube.com/watch?v=hixjlr1w5XY
                      0
                      Еще есть вопрос по поводу программной оболочки через которую идет взаимодействие с двигателями.
                      Я писал на питоне и столкнулся с проблемой опроса кнопок на клавиатуре (нажата или нет)
                      в итоге не найдя решения, я использовал библиотеку curses.
                      Как у вас это реализовано?
                        0
                        Консоль для управления написана на C с использованием бибиотеки SDL — console.c функция checkInput(). Все исходники проекта открыты и находятся в svn репо.
                        0
                        В качестве операционной системы — Linaro, полноценный линукс дистрибутив, основанный на Ubuntu.

                        Нет такой операционной системы Linaro. Linaro — это прежде всего toolchain, ядро Linux для ARM и дополнительные бинарники поддержки аппаратного обеспечения конкретных девайсов.
                        Не Linaro на основе Ubuntu, а сборка Ubuntu для ARM на основе Linaro тогда уж.
                          0
                          будь по-вашему

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое