Управление машинкой через wifi. Делаем бюджетный чудо корабль с управлением по WiFi на базе ESP8266

10.09.2021

В данном проекте описано создание Wi-Fi машинки с управлением моделькой автомобиля через интернет или при помощи ноутбука с Wi-Fi на расстоянии до 500м. На машинке установлена камера, работающая в реальном времени, что позволяет управлять машинкой глядя в экран ноутбука.

Некоторое время назад я нашел маршрутизатор Linksys WRT54GL. Он очень удобен для хака и модификации, т.к. он работает под управлением Linux. Для данного маршрутизатора была написана куча альтернативных прошивок. В этом проекте используется настраиваемая прошивка Linux Open-WRT. Кроме больших возможностей модификации программного обеспечения этого маршрутизатора, есть куча возможных аппаратных модификаций и хаков. То есть в моем распоряжении был дешевый и взламываемый маршрутизатор со встроенным Linux - я знал, что делать что-то с ним хорошо и удобно. Таким образом родилась идея Wi-Fi машинки.

Целью данной статьи является предоставить общий обзор проекта и показать некоторые особенности реализации программной и электронной части. Эта статья не является руководством по сборке машинки шаг за шагом, но имеет достаточно информации для людей с хорошей мотивацией и базовыми знаниями в электронике и программировании. Все программы написаны на условиях Открытого лицензионного соглашения GNU v2, так что код можно свободно использовать и улучшать.

Аппаратная часть

Машинка

Добавление сетевой камеры, маршрутизатора, тяжелых батарей, дополнительных схем, и кучи проводов добавляют много лишнего веса, а большинство моделей для этого не предназначено. Поэтому из-за всех дополнений необходимо найти довольно большую радиоуправляемую машинку. В интернете можно найти б/у радиоуправляемые транспортные средства без пульта за 200-300 руб. Я купил несколько машинок для того, чтобы вытащить из них детали. Транспорт размера 1:10 или больше вполне подойдет, и вероятно вы не захотите меньше. Я купил эту машинку за 150 руб.

Я разобрал около 20 радиоуправляемых автомобилей. Почти в каждом из них используется чип Realtek RX2/TX2 или его полные аналоги с аналогичной цоколевкой. Документацию на них можно найти в интернете или по ссылкам. Это означает, что машинкой очень легко управлять при помощи штатной электроники без добавления собственных схем. Можно подключить микроконтроллер непосредственно к выводам (вперед, назад, влево, вправо) и управлять автомобилем. Возможность использования штатной электроники автомобиля экономит много сил и времени.

Я модифицировал свой WRT54GL так, что он имеет 2 последовательных порта и SD карту на 1Гб (работает как жесткий диск на 1 Гб). В этом проекте SD карта не используется, но используется один из последовательных портов. У моего маршрутизатора есть два последовательных порта: консольный порт и TTS/1, который мы и будем использовать. Для этого проекта я использую OpenWRT White Russian v0.9. Есть и более поздние версии, но для этого проекта нам они не нужны. В руководстве по компиляции программ (смотрите ниже), используется эта версия, поэтому я выбрал её.

Выбор микроконтроллера

Я оценил три различных микроконтроллера для этого проекта. Ниже показано краткое изложение оценки.

Микроконтроллер

PIC16F628A

Arduino (ATmega168)
Freeduino MaxSerial

AVR Butterfly (ATmega169)

Цена.
Уровень программного управления.

Очень прост в программировании (C со множеством встроенных библиотек).

Готовый комплект разработчика, практически нет необходимости в пайке.

Легче для программирования, чем PIC.
Интегрированный последовательный интерфейс.
Пайка необходима редко.

Против

Труден для программирования (ассемблер).
Необходимо соединять цепи вручную.
Необходимы дополнительные аппаратные средства(MAX232A).
Требуется программатор.

Ошибки загрузчика (см. ниже).
Интегрированные периферийные устройства имеют странные выходные напряжения.
Цена.

Я выбирал PIC16F628A по нескольким причинам:

  • У меня их было много.
  • Я имею небольшой опыт работы с ними.
  • Я хотел маленькую плату, и плата PIC оказалась самой маленькой из всех 3 вариантов.
  • Я хотел иметь полный контроль над действиями программы, и это вполне возможно при программировании на ассемблере.

Arduino (Freeduino MaxSerial) стал моим вторым выбором, который мне очень понравился простотой сборки и запуска. Также есть хорошая поддержка сообщества, и простота использования.

Первоначально я использовал отладочную плату AVR Butterfly. Она работала хорошо, пока один раз не разрядились батарейки. В загрузчике AVR Butterfly существует ошибка, которая подробно описана тут. Она портит код и не позволяет перепрограммировать его другим загрузчиком. Машинка работала в один день, а на другой нет. Потребовалось некоторое время, чтобы найти проблему и совсем немного времени, чтобы исправить её, поэтому я не стал дальше использовать эту плату в качестве системы управления. Я также обнаружил, что выходное напряжение на выводах может быть непредсказуемыми, так как кроме управления периферийными устройствами, они управляют ЖК-экраном.

Ниже приведён исходный код для PIC и Arduino. Оба были протестированы, так что используйте то, в чем вы лучше разбираетесь и чувствуете себя комфортнее. Arduino (Freeduino MaxSerial) является наиболее оптимальным вариантом для быстрого старта. Я купил его.

Управляющая схема

На самом деле в моей машинке используется две управляющие платы. Так сделано потому, что я сжег управляющие транзисторы на штатной плате машинки. К счастью, я смог отпаять их и RX2 чип (который также сгорел) и сохранить схему управления. Большинство игрушечных радиоуправляемых машинок используют около 6 проводов для управления двигателем. Это так, потому что в собранной машинке есть металлический скользящий контакт, который движется с двигателем и дополнительные провода используются для реле. Каждая радиоуправляемая машинка имеет различные параметры этого контакта, так что намного лучше использовать штатную схему.

Я сжег транзисторы, подав напряжение питания 16В, вместо штатных 9.6В. Транзисторы рассчитаны на ток 5А, но вероятно я нагрузил их слишком сильно и они живописно задымились. Я взял плату из другой радиоуправляемой машинки и использовал транзисторы оттуда. Я запустил эту схему от 12В, и это не вызвало никаких проблем, хотя транзисторы довольно сильно грелись. Использование штатных плат машинки вместо изготовления собственного Н-моста экономит много времени и денег.

Этот проект использует мощные аккумуляторы. Я купил их для радиоуправляемых машинок высокого класса за $ 50 + доставка с eBay. Они имеют 3800 мАч и зарядное устройство 1,8А в комплекте. Их можно найти в поиске eBay. Одна батарея заряжается примерно 1.5 часа (от полного разряда). Их напряжение 7.2В, однако, когда они только заряженные их напряжение около 8.3В, а когда они полностью разряжены (уже не в состоянии питать машину) они дают примерно 7.1В.

Я заменил все разъемы на аккумуляторах на стандартные Molex ATX разъемы. Это сделано для того, чтобы использовать дешевые разъёмы которых у меня было много, которые позволяют легко сделать разветвитель для замера тока. Батареи соединённые последовательно дают около 16В при полной зарядке.

Линия 9.6В получена путем установки 4 диодов последовательно с шиной 12В берущейся с 7812. Падение напряжения на диоде около 0.7В. Поставив 4 диода в ряд, мы теряем около 2.8В, и получаем 9В для устройств, которым необходимо меньше 12В. После того как я сжег транзисторы, я решил питать схему более низким напряжением. 7812 рассчитан на 1А, а двигатели потребляют значительно больше. Digikey продает регулятор 7.5A 12В примерно за 14$, и я купил его. Я прикрепил его к радиатору, потому что думал, что он может греться. После некоторого времени работы он даже не нагрелся, поэтому радиатор не требуется.
Я не хочу рисковать схемой управления, поэтому я питаю его напряжением максимально приближены к штатному. Камера требует 9В, сигнал работает довольно тихо при питании от 5В, поэтому все эти устройства работают от линии 9.2В.

Вся силовая электроника собрана на макетной плате и находится в корпусе.

Схемы

Arduino:

Подключение Arduino:
Вперед - Pin 8
Назад - Pin 9
Влево - Pin 10
Вправо - Pin 11
Зеленый LED - Pin 7
Красный LED - Pin 6
Сигнал - Pin 5

Последовательный порт Freeduino MaxSerial можно связать с последовательным портом маршрутизатора при помощи стандартного последовательного кабеля.

Freeduino MaxSerial использует последовательный вывод 4 - DTR (Data Terminal Ready) для сброса микроконтроллера и разрешения на загрузку нового кода. При нормальной работе с компьютером на этом выводе либо +10 В либо -10В в зависимости от того, подключен ли последовательный порт. Однако на последовательном порту маршрутизатора этот вывод заземлен и неактивен. Когда маршрутизатор начинает передачу данных через последовательный порт, MaxSerial сбрасывается. Это нам не подходит. Мы подтянем вывод DTR к +9В. Это простое изменение включает режим закрытой программы, то есть микроконтроллер не может быть перепрошит и сброшен по последовательному порту. Если необходимо перепрошить микроконтроллер, то достаточно просто щелкнуть выключателем.

Примечание: Если вы используете USB версию Arduino, вы можете просто подключить RX и TX контакты к MAX232A, а затем к последовательному порту маршрутизатора.

Камера

Одним из основных аспектов этого проекта является то, что машинкой можно управлять без прямой видимости при помощи сетевой камеры Panasonic BL-C1A. Это почти самая дешевая проводная сетевая камера с хорошими отзывами. Программное обеспечение есть только для Windows – это небольшой, но терпимый минус. Для просмотра изображения программное обеспечение не требуется. В более дорогих моделях есть панорамирование и возможность наклона, но они значительно дороже и их функциональность не нужна.

Камера имеет очень удобный веб-интерфейс, что делает её не только Windows устройством. Просмотреть изображение с камеры можно при помощи следующей команды:
http:///ImageViewer?Resolution=320x240?Quality=standard
Доступные разрешения 640x480, 320x120, 160x60. Доступное качество (сжатие) precision(качество), standard(стандартное), motion(движение).

Качество видео неплохое. Тем не менее, оно часто замирает на 1 секунду даже при хорошей связи. Я предполагаю, что электроника камеры недостаточно мощна, чтобы поддерживать постоянный прямой эфир с автофокусом. В целом я доволен ей.

Глядя на внутреннюю часть камеры, видно, что она работает на ARM процессоре 250 МГц. По информации с официального сайта она также имеет 64Мб оперативной памяти. Интересно, как трудно было бы заставить Linux работать на этом…

Сборка

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

Плата микроконтроллера PIC также надежно закреплена болтами на другой стороне. Все провода были умышленно взяты длиннее чем требуется, для их легкого перемещения во время сборки. После сборки лишние куски провода были собраны и связаны. Было очень много проводов, вероятно около 30, которые нужно было провести из/в переднюю и заднюю часть машинки, не считая Ethernet кабеля.

Все силовые цепи были размещены в корпусе в задней части машинки, за исключением LT1083 7.5A, который находится в нижней части автомобиля. Я не ставил его в корпус, потому что это было дополнение к проекту, и так его было проще всего добавить. Когда светодиод на задней стороне коробки светится красным, маршрутизатор загружается. Когда маршрутизатор загрузился, он посылает сигнал микроконтроллеру, загорается зеленый светодиод, и я знаю, что могу соединиться с машинкой. Этот индикатор был очень полезным при отладке.

Вся электроника была собрана на макетной плате пред пайкой и установкой машинку. Батареи прикреплены с помощью термоклея и кабельных стяжек. Маршрутизатор был слишком широкий, чтобы стать на машинку без дополнений. Я добавил два куска плексигласа, чтобы сделать машинку шире.

Программная часть

Для данного проекта необходимы 3 программы. Приложение-клиент VB6 Wifi_Robot на Windows, CarServer написанный на C и работающий на маршрутизаторе работающем под управлением OpenWRT WhiteRussian v0.9 (Linux), а также микропрограмма микроконтроллера. Я испытывал прошивки для микроконтроллера PIC16F628A и популярного Arduino (Freeduino MaxSerial). Все программное обеспечение распространяется на основе открытого лицензионного соглашения GNU v2.

Следующие инструкции предполагают, что у вас есть подключенный к интернету Linksys WRT54GL с установленный OpenWRT WhiteRussian v0.9. Руководстве по установке OpenWRT можно найти по ссылке .

Установка CarServer
Если вы хотите использовать программное обеспечение
Войдите по SSH в своем маршрутизатор, затем...
# cd /tmp
# wget http://www.jbprojects.net/projects/wifirobot/carserver_1_mipsel.ipk
# ipkg install ./carserver_1_mipsel.ipk

Компиляция и установка CarServer
Если вы хотите увидеть, как он работает или модифицировать его

Вам нужно будет скачать OpenWRT SDK (только для Linux) и следовать этому руководству по составлению программ: Написание и компиляция простой программы для OpenWRT от Eric Bishop (просто следуйте первой части)
Makefile находится в /OpenWrt-SDK-Linux-i686-1/package/carserver/
Makefile находится в /OpenWrt-SDK-Linux-i686-1/package/carserver/src
carserver.c находится в /OpenWrt-SDK-Linux-i686-1/package/carserver/src
Ваш скомпилированный ipkg будет отображаться в /OpenWrt-SDK-Linux-i686-1/bin/packages. Затем:
# scp carserver_1_mipsel.ipk root@:/tmp/.
для копирования в маршрутизатор. Войдите по SSH и установите

Есть бесплатная электронная книга посвящённая серии маршрутизаторов WRT54G которая называют Linksys WRT54G Максимальный взлом. Я считаю что она бесплатна. Её можно просмотреть в Google Books . Она также может быть загружена по ссылке. В этой книге рассказывается как добавить последовательный порт, настроить программное обеспечение, а также о многих других взломах и модификациях. Я связался с одним из авторов. Это не бесплатная электронная книга. Вы можете просмотреть её в Google Books, и поддержать авторов, купив её Amazon . Это отличная книга!

Получение рабочего последовательно порта
Мы используем TTS/1, так что если вы добавили один последовательный порт – убедитесь что это он. Если у вас установлен OpenWRT WhiteRussian v0.9 войдите в SSH. Инструкции в книге указанной выше немного устарела. Вот обновленная версия:
# ipkg update
# ipkg install setserial

# cd /usr/sbin
# wget http://www.jbprojects.net/projects/wifirobot/stty.tgz
# tar -zxvf stty.tgz
# chmod 755 stty

Добавьте следующие строки в /etc/init.d/custom-user-startup чтобы сделать последовательный порт рабочим при запуске и автоматического запуска CarServer.
/usr/sbin/setserial /dev/tts/1 irq 3
/usr/sbin/stty -F /dev/tts/1 raw speed 9600
/bin/carserver&

Запуск клиентского приложения Wifi_Robot

Этот файл содержит исходный код VB6 и скомпилированный EXE. Вы можете просто извлечь wifi_robot_client.exe и config.txt, если вы не хотите заниматься программированием. Вы можете открыть и компилировать VB6, если вы хотите изменить его. Эта программа - это просто слегка измененная программа проекта радиоуправляемая машинка, управляемая компьютером.

ПО микроконтроллера

PIC
Вам понадобится программатор для PIC. Я использую P16PRO40, купленный на eBay. Есть много программаторов, которые можно купить или собрать самому. Вы можете самостоятельно скомпилировать HEX с помощью Microchip MPLAB или просто скачать и прошить готовый HEX файл. PIC asm базируется на этом тесте PIC16F628 UART.

Arduino (Freeduino MaxSerial)
Программу можно загрузить в Freeduino MaxSerial без дополнительного программатора.
Если вы используете Freeduino MaxSerial, убедитесь, что вы сделали небольшую модификацию оборудования, которая предотвратит сброс Freeduino каждый раз при получении данных от маршрутизатора через последовательный порт. См. выше для получения более подробной информации.

Измерения и тесты

Максимальная скорость
Чтобы вычислить максимальную скорость я сделал две отметки на расстоянии 3м друг от друга и несколько раз снимал машинку. Камера записывает 30 кадров в секунду, так что возможная ошибка камеры +/- 3,3% и +/- 1% ошибка расстояния.

Автомобиль проезжает 3м за 0,7 секунды (21 из 30 кадров за 1 секунду).
Максимальная скорость: 4,3 м/с = 15.5 км/ч = 9.6 миль/ч

Расстояние
Я взял маршрутизатор в большое поле. Я смог подключится со своего ноутбука на расстоянии до 500 м (по 1Мбит). Дальше этого расстояния, я уже не смог подключиться. Альтернативные прошивки (OpenWRT) позволяют увеличить выходную мощность. Я пытался изменить это значение, но это не повлияло на расстояние. Возможно, мой ноутбук (Dell Inspiron 6000), который всегда имел хороший WiFi (лучше, чем 6400 моего друга), может быть ограничивающим фактором.

При создании бота ставились следующие задачи:

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

Для бортового компьютера был выбрал двухъядерный андроидный миникомпьютер 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. Отправляемые команды управления выглядят так:

Нумерация моторов: 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), но нужно смотреть, чтобы были доступны исходники ядра, работающие на конкретном девайсе-клоне. Иначе установка полноценного линукса будет проблематична либо вообще невозможна.

RC машинка может быть WiFi машинкой...?

RC машинка это хорошо, но дешевые RC машинки имеют ограниченный диапазон и управляются только определённым пультом поставляемым в комплекте.

Я купил RC джип 4х4 с гибкой подвеской и внедорожными шинами примерно за 30 долларов. Поигравшись с машинкой я решил, что её можно улучшить при помощи Wi-Fi и Android. Потратив немного времени, я полностью удалил плату из машинки. Я замерял напряжения на этой плате и разработал систему управления двигателем при помощи Arduino. Оригинальная система управления не использует ШИМ для контроля скорости. Машинка рассчитана на переезд через препятствия на очень низкой передаче, и как следствие очень медленно. В моей же схеме используется ШИМ.

Я использую Arduino уже несколько месяцев. Я также приобрел asynclabs WiFi Sheild для Duemilanoe Arduino, чтобы экспериментировать с WiFI. Он поставляется с библиотекой, устанавливаемой в Arduino IDE. Я смог сделать программу, которая позволяет управлять двигателями и направлением движения при помощи WiFi.

При помощи Visual Studio я разработал окно программы, которая подключается к серверу автомобиля и дает ему команды. Затем после нескольких попыток я написал приложение для Android, которое использует акселерометр для управления машинкой.

Инструменты и элементы

Это общий список инструментов и элементов, которые использовались в этом проекте. В документации Eagle указаны точные технические характеристики используемых компонентов.

Мультиметр
Паяльник
Припой
Отвертки
Раствор для травления плат
Фольгированый стеклотекстолит
Плоскогубцы
Arduino
AsyncLabs WiFi Sheild
Разъёмы RJ45
Драйвер двигателя с H-мостом
Конденсаторы

Драйвер двигателей

Используя Eagle, я разработал эту схему и сделал печатную плату для неё. Она функционирует как драйвер двигателей и регулятор их мощности для Arduino.
Это позволяет использовать стандартный 7.2В аккумулятор для питания основных и рулевых двигателей и Arduino.

В этой схеме используется двойной интегральный драйвер с Н-мостом SN754410 для управления двигателями. Выводы управления драйвера подсоединены к кабелю RJ45, который подключается к AsyncLabs WiFi Sheild.

Arduino Shield

Используя библиотеку SparkFun в Eagle я разработал Arduino Shield, через который будут проходить контакты с WiFi Shield и подключаться к драйверу двигателя через разъем RJ45 и 2 винтовые клеммы.

Цоколевка контактов RJ45 очень важна. Ошибка в подключении может привести к непредсказуемым результатам и придётся переделывать плату.

Травление печатных плат

Эта тема была раскрыта много раз, и я не буду подробно описывать её.
Я использую , и он меня устраивает, а с опытом дает прекрасные результаты.

Для крепления платы к корпусу использовались липучки. Мне повезло, т.к. в моей машинке было много места для электроники под трубчатым каркасом.
Я забыл сфотографировать соединение платы драйвера двигателя с остальными платами, однако он хорошо стал и не занял много места в корпусе.

Программа

Мой код может быть не достаточно эффективен, но он работает.

Машинка

Мне удалось собрать CarServer на основе примера SocketServer, который я получил вместе с Wifi Sheild AsynLabs.
Вам необходимо будет ввести информацию о своей беспроводной сети в код Arduino. Когда машина включилась, дайте ей 15-45 секунд, чтобы установить соединение с маршрутизатором. Красный светодиод на WiFi Shield означает, что соединение установлено.

Я сделал эту программу при помощи C # и MS Visual Studio 2008. Я сделал хорошее окно, и автомобилем можно управлять стрелочками.

Почему бы не управлять машинкой с телефона?

Такая мысль появилась у меня примерно через неделю после покупки DroidX. Я начал экспериментировать и в конечном итоге использовал Android SDK. Я нашел аналогичные приложения, где для управления используется акселерометр. Смотря на эти приложения написал свое.

Вставить IP и порт, указанные в коде Arduino. Держите телефон горизонтально. Затем наклоните его от себя, чтобы ехать вперед и на себя, чтобы ехать назад. Используйте телефон как руль.
Это мое первое крупное приложение для Android. В нем до сих пор есть некоторые ошибки, но в основном оно работает нормально.

Рулите во дворе машинкой 4x4 с WiFi!

Я отлично провел время, создавая этот проект. Я получил много знаний и новых навыков, и теперь у меня есть машинка 4х4, которой можно управлять с телефона.

Мне нужна камера для установки за лобовым стеклом, чтобы смотреть куда ехать. Она должна быть с низким энергопотреблением, а также передавать видео сама по себе. (Я думаю, что Arduino справится с этим).

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Драйвер двигателей
IC1 Микросхема SN754410 1 В блокнот
Линейный регулятор 5 В 1 В блокнот
Биполярный транзистор

2N3904

1 В блокнот
C1, C2 Электролитический конденсатор 2 В блокнот
Разьем 2 вывода 7 В блокнот
Разьем 8 выводов 1 В блокнот
Arduino Shield
U1 Плата Arduino 1 В блокнот
Т1 Биполярный транзистор

2N3904

1 В блокнот
R1 Резистор 1 В блокнот
U$3 Подстроечный резистор 1 В блокнот
Разьем 2 вывода 2

Канал Science Vetal показал, как сделать машинку на управлении практически от любого андроид смартфона. При этом не будем использовать «Arduino», возьмем микроконтроллер от китайского производителя «Espressive» «esp 8266», штуковина представляет из себя «Arduino» плюс wi-fi модуль.
Все радиодетали и модули в этом китайском магазине .

Вы помните «Arduino uno», оно большое, а здесь маленькая такая штучка, в которой есть wi-fi, возможности «Arduino». К этому микроконтроллеру китайцы разработали такой shield. Он удобный: можно подключить 2 двигателя, или даже 4, при этом можно использовать 11 выводов. Так же возьмем 2 двигателя, 2 стандартных «Arduino» колеса.

Когда на «aliexpress» вводишь «Arduino» в поиск, открываются не только платы, но, сопутствующие товары. Интересные элементы, обязательно что-то интересное найдете, попробуйте.

Возьмём для питания 2 аккумулятора 18650, к ним бокс для 2-х акб, также возьмем 2 уголка, размеры около 5 дюймов, это не столь важно там плюс-минус полдюйма, дюйм. Дело в том, что конструкция может быть ваша, но представленная в ролике авторская удачна, проста.

Берем 2 уголка, при помощи винтов их необходимо соединить, чтобы сюда спокойно помещался shield. Сверлом, диаметр которого 3 мм, делаем 4 отверстия. Берем малюсенькие винты, зажимаем, соединяем эту конструкцию. Такая штуковина получается, прочности данного соединения для такой машинки, как делаем, предостаточно.

Сбоку для вала видео сверлим отверстие диаметром 8 мм, получается конструкция, но необходимо еще сделать 3 отверстия диаметром 3 мм: одно для этого выступа, для этих отверстий крепежных еще 2.

Берем, подставляем таким способом, закручиваем с помощью винтов. Один из идеальных случаев, машинка нравится, сюда нечего добавить, ее незачем переделывать. Делаем отверстия для крепления платы.

Ничего не меняем, кроме как тут, где стоит галочка, выбираем адрес к файлу, который будем заливать, затем выбираем нужный com port, нажимаем кнопочку start. Также под видео есть ссылка на программу, которую нужно установить на ваш любимый android.

Закрепил эту плату, вставляем микроконтроллер. Подключаем провода от двигателей, смотрим, если нижний будет «A-», то с этой стороны «B-» будет верхний. Настало время прикрепить колеса. Делается это легко, так как колёса двигателей – это комплект. В этом месте сверлим отверстие диаметром 4 мм, вставляем винт. Делаем такую нехитрую операцию, регулируем высоту, даже еще ниже можно, что-то получился винт, который сильно торчит. Это лишнее. Это получается, устройство дороже на копеечки, что нам, в общем-то, не нужно, как-то оно выглядит коряво.

Так посмотрим, как получается устройство, которое будет управляться андроидом на расстоянии через wifi. Конечно, получше штука. Отсек для аккумуляторов прикрепим термоклеем, машинка получается.

Вставляем аккумуляторы, необходимо быть внимательным, так как бывает часто так, что все вроде бы правильно собрал, вставил аккумуляторы, а устройство не работает. Оказывается, что эти черные пластиковые боксы. Они не дают акб встать на место.


Программа и скетч http://bbs.smartarduino.com/showthread.php?tid=2013
Приложение для управления https://play.google.com/store/apps/details?id=com.doit.carset

Летом появилась мысль сделать радиоуправляемую машинку, но не просто нечто похожее на творение китайской инженерной мысли, которое продается на каждом шагу, а машинку, управлять которой можно было бы с компьютера или телефона. Понято, что машинка, которой можно управлять через Wi-Fi в чистом виде, совершенно не интересна. А вот если бы у нее была бы камера? А если еще и управление через 3G/EDGE/GPRS? Вот это – другое дело! Значит, управляющее устройство должно иметь USB и Wi-Fi (ну или только USB, можно купить USB Wi-Fi адаптер). Теперь нужно придумать, как управлять двигателями. Изначально я хотел сделать это с помощью COM-порта и регистра сдвига (74HC595), но спалив 5 таких микросхем, от такого способа отказался. Позже мой взгляд пал на Arduino, а именно на Arduino Duemilanove. Эта плата имеет 14 цифровых I/O портов, из них шесть – ШИМ (можно будет управлять напряжением на двигателе и повесить сервы для камеры), два можно использовать как Tx и Rx последовательного порта.

Роутер

Обнаружив в своем городе роутер D-Link DIR-320, у которого есть USB порт, сразу же его купил. Придя домой, узнал, что у этого роутера есть невыведенный UART-порт. Таким образом, у нас появляется канал связи между роутером и ардуиной.
Для роутера я выбрал прошивку OpenWrt. Можно скачать готовую прошивку с OpenWrt для DIR-320 это . Уже не помню почему, но я решил собрать прошивку сам (подробно описано ). Для этого понадобится Linux (я собирал на Ubuntu 11.10). Для начала, скачаем исходники прошивки и соберем все, что нужно:
svn co svn://svn.openwrt.org/openwrt/branches/backfire dir320 cd dir320 ./scripts/feeds update -a && ./scripts/feeds install –a make prereq && make tools/install && make toolchain/install
Конфигурирование прошивки
make menuconfig
Выбираем следующие пакеты:
  • Target System ---> <*> Broadcom BCM947xx/953xx – ядро 2.6
  • Image configuration ---> <*> LAN IP Address ---> – [не обязательно] Можно выбрать IP-адрес, который будет у роутера после загрузки ядра и всех модулей
  • Kernel modules ---> <*> Filesystems ---> <*> kmod-fs-ext3 - Об этом позже
  • Utilities ---> Filesystem ---> <*> e2fsprogs – И об этом
  • Utilities ---> disc ---> <*> block-extroot – И об этом тоже
  • Kernel modules ---> <*> USB Support ---> <*> kmod-usb-core – поддержка USB
  • Kernel modules ---> <*> USB Support ---> <*> kmod-usb-ohci – для USB-хаба. Зачем он? Об этом тоже позже
  • Kernel modules ---> <*> USB Support ---> <*> kmod-usb-storage – поддержка USB-флешек
  • Kernel modules ---> <*> USB Support ---> <*> kmod-usb2 – USB 2.0
  • Administration --> webif ---> <*> webif-applications – админка
  • Kernel modules ---> <*> Video Support ---> <*> kmod-usb-video-core – поддержка USB-video
  • Kernel modules ---> <*> Video Support ---> <*> kmod-usb-video-uvc – поддержка UVC-веб камер
Последний пункт выбирайте сами, у меня была UVC веб камера.
Так зачем же мы выбрали те пакеты, назначение которых я не объяснил? Проблема в том, что объём флэш-памяти установленной в роутере - 4МБ, что может помешать дальнейшей нашей работе. Мы же перенесем rootfs на флешку, и роутер будет грузиться с нее.
Кстати, про флэш-память: нужно не забыть следующее:
make kernel_menuconfig
  • Device Drivers ---> <*> Memory Technology Device (MTD) support ---> RAM/ROM/Flash chip drivers ---> [*] Flash chip driver advanced configuration options --> [*] Specific CFI Flash geometry selection --> [*] Support 8-bit buswidth
  • Device Drivers ---> <*> Memory Technology Device (MTD) support ---> RAM/ROM/Flash chip drivers ---> [*] Flash chip driver advanced configuration options --> [*] Specific CFI Flash geometry selection --> [*] Support 16-bit buswidth
И еще в Kernel Hacking’е нужно исправить console=/dev/ttyS0 на console=/dev/null , чтоб роутер не использовал этот порт как отладочный.
Компилируем и прошиваем
Компиляция прошивки:
make V=99 -j2
Теперь нужно ее прошить:
Для bash’а:
#!/bin/bash echo "==================================================================" echo "This script will upload dd-wrt firmware (firmware.bin)" echo "in the current directory to 192.168.0.1 " echo "during the router"s bootup. " echo "" echo "* Set your ethernet card"s settings to: " echo " IP: 192.168.0.10 " echo " Mask: 255.255.255.0 " echo " Gateway: 192.168.0.1 " echo "* Unplug the router"s power cable. " echo "" echo "Press Ctrl+C to abort or any other key to continue... " read echo "" echo "* Re-plug the router"s power cable. " echo "" echo "==================================================================" echo "Waiting for the router... Press Ctrl+C to abort. " echo "" try(){ ping -c 1 -w 1 192.168.0.1 } try while [ "$?" != "0" ] ; do try done echo "*** Start Flashing **** " atftp --no-source-port-checking -p -l firmware.bin 192.168.0.1 echo "Firmware successfully loaded!"
Для винды:
@echo off echo ================================================================== echo This batch file will upload dd-wrt firmware in the current directory to echo 192.168.0.1 during the router"s bootup. echo. echo * Set your ethernet card"s settings to: echo IP: 192.168.0.2 echo Mask: 255.255.255.0 echo Gateway: 192.168.0.1 echo * Unplug the router"s power cable. echo. echo Press Ctrl+C to abort or any other key to continue... pause > nul echo. echo * Re-plug the router"s power cable. echo. echo ================================================================== echo Waiting for the router... Press Ctrl+C to abort. echo. set FIND=%WINDIR%\command\find.exe if exist %FIND% goto LPING set FIND=%WINDIR%\system32\find.exe if exist %FIND% goto LPING set FIND=find:LPING ping -n 1 -w 50 192.168.0.1 | %FIND% "TTL=" if errorlevel 1 goto LPING echo *** Start Flashing **** tftp -i 192.168.0.1 put firmware.bin if errorlevel 1 goto LPING set FIND= echo. echo ================================================================== echo * WAIT for about 2 minutes while the firmware is being flashed. echo * Reset your ethernet card"s settings back to DHCP. echo * The default router address will be at 192.168.1.1 echo. Pause
Настройка загрузки с флешки
После первого включения заходим на веб-интерфейс роутера и изменяем пароль. Теперь подключаемся к нему через SSH. Нужно настроить загрузку с флешки, для этого сначала нужно ее разметить. У меня было два раздела: первый – ext3-раздел для rootfs, второй – swap. Открываем /etc/config/fstab в vim’е и пишем то, что соответствует нашей фелшке. У меня так:
config global automount option from_fstab 1 option anon_mount 1 config global autoswap option from_fstab 1 option anon_swap 0 config mount option target / option device /dev/sda1 option fstype ext3 option options rw,sync option enabled 1 option enabled_fsck 1 option is_rootfs 1 config swap option device /dev/sda2 option enabled 1
Сохраняем, перезагружаемся (reboot).
Демон
Управлять двигателями будет ардуина, поэтому напишем демон, который будет перенаправлять всё, что пришло на TCP порт 5554 в /dev/ttyS0.
Мой скомпилированный вариант демона искать в архиве (card)
Компилируем с помощью gcc, который был собран в процессе подготовки к сборке прошивки:
<…>/dir320/staging_dir/toolchain-mipsel_gcc-4.3.3+cs_uClibc-0.9.30.1/usr/bin/mipsel-openwrt-linux-uclibc-gcc-4.3.3 <имя файла с исходниками> -o <имя выходного файла>
Небольшое отступление об удобстве организации работы с роутером
  • После каждого включения мне приходилось писать opkg update , поэтому я его добавил в /etc/rc.local
  • Довольно удобно использовать FTP-сервер. Я поставил pure-ftpd. Для этого пишем:
    opkg install pure-ftpd
    Добавим его в /etc/rc.local:
    pure-ftpd -4 –B –M –l unix –U 000:000
  • Удобно будет сменить веб-интерфейс на luci, для этого пишем:
    opkg remove webif* opkg install luci
Демон [продолжение]
Заливаем на роутер наш демон, добавляем его в автозагрузку.
Теперь ставим mjpg-streamer:
opkg install mjpg-streamer
Пишем в /etc/config/mjpg-stramer следующие:
config mjpg-streamer option device “/dev/video0” option resolution “640x480” option fps “24” option port “8080” option enabled “true”
Пробуем подключить камеру. Если все нормально, то можно будет увидеть изображение тут:
http:///?action=stream .

Arduino и соединение

Для начала определимся со схемой подключения двигателей. Так как я брал корпус от уже готовой машинки, то мне с двигателями повезло – они уже там были. Передний отвечал за повороты (влево, вправо, прямо), а задний за движение (мне пришлось его поменять на двигатель кнопки блокировки дверей какого-то ВАЗа). Управлять нагрузками можно ардуиной с помощью полевых транзисторов (95N2LH5, но я использовал IRF 630, потому что и эти ели нашел в своём городе). Подключение такое: земля транзистора – к управляющему пину ардуины, source – к земле ардуины и минусу питания нагрузки, drain – к минусу нагрузки, плюс питания к плюсу нагрузки. Но таким образом мы сможем ездить только вперед и поворачивать только в одну сторону. Для того чтобы справиться с проблемой, к нам на помощь спешит реле с двумя группами контактов. У меня один двигатель (передний) питался 6 вольтами, а другой 12. При этом использовалось два 6 вольтовых аккумулятора (один из них - свинцово-кислотный от бесперебойника), учитывая, что минус роутера позже придется соединить с землей ардуины, то получить 6 вольт для роутера не получается (проверяйте сколько вольт подаёте на роутер - мне пришлось покупать еще один после того, как я подал на него 12 вольт). Поэтому пришлось использовать еще одну релюшку для подачи/неподачи питания на передний двигатель.

Схему рисовал давно. Теперь там все транзисторы полевые и нет резисторов.
Теперь о самом коде. У меня все довольно просто – есть 4 команды, у которых есть свой параметр размером 1 байт:

  • m – Отвечает за напряжение, а, следовательно, и за скорость, на двигателе значение от 0 до 255
  • r – Отвечает за повороты. “1” – поворачивать, “0” – не поворачивать
  • n – “1” – ехать назад, “0” – ехать вперед
  • e – “1” – поворачивать в другую сторону
Вот мой код программы для ардуины:
int inByte, val; void setup() { Serial.begin(9600); pinMode(2, OUTPUT); pinMode(4, OUTPUT); pinMode(7, OUTPUT); } void loop() { if (Serial.available() > 0) { inByte = Serial.read(); if ((inByte=="n")||(inByte=="e")){ while (Serial.available()==0) {} val=Serial.read(); if (inByte=="n"){ if (val=="1"){ digitalWrite(2, HIGH); Serial.print("Writing to 2 pin\n\r"); } if (val=="0"){ digitalWrite(2, 0); Serial.print("Writing to 2 pin\n\r"); } } if (inByte=="e"){ if (val=="1"){ digitalWrite(4, HIGH); Serial.print("Writing to 4 pin\n\r"); } if (val=="0"){ digitalWrite(4, LOW); Serial.print("Writing to 4 pin\n\r"); } } } if ((inByte=="m")||(inByte=="r")){ while (Serial.available()==0) {} val=Serial.read(); if (inByte=="m"){ if (val!="0") analogWrite(3, val); else analogWrite(3, 0); Serial.print("Writing to 3 pin\n\r"); } if (inByte=="r"){ if (val=="1"){ digitalWrite(7, HIGH); Serial.print("Writing to 7 pin\n\r"); } if (val=="0"){ digitalWrite(7, LOW); Serial.print("Writing to 7 pin\n\r"); } } } } }
Как видно, задний двигатель у меня подключен к 3 пину, передний – к 7, реле заднего – к 2 пину, переднего – к 4. Так как 3 – это ШИМ-пин, то используя analogWrite(3, val);, где val от 0 до 255, мы можем управлять напряжением на двигателе.
Разбираем наш маршрутизатор. Видим UART порт. Соединяем его с ардуиной.

Теперь смотрим, как это все работает. Подключаемся телнетом к нашему порту и проверяем:
  • n1 – щелкает реле
  • m<пробел> - колёса начинают немного вращаться
  • n0 – колеса вращаются в другую сторону
  • m0 – колеса перестают вращаться
  • r1 – поворачивают передние колеса
  • e1 – колеса поворачивают в другую сторону
  • r0 – колеса становятся прямо
  • e0 – щелкает реле
Для отладки работы с ком портом на роутере можно использовать minicom (opkg install minicom).

Программная часть

В архиве моя программка для управления машинкой (rotate и power из архива нужно скопировать в /bin/ на роутере, card – мой демон). Работает только с джойстиком. На вкладке планирование вы можете написать bash скрипт (не забудьте opkg install bash на роутере) для его выполнения с помощью демона cron. Так как этот демон нужно после изменения его настроек перезапускать, моя программа запускает скрипт по адресу