CxemCAR – Android-управление машинкой по Bluetooth

CxemCAR - Android-управление машинкой по Bluetooth Машинки

Вводная информация про p2p режим

Так как для канала управления и для канала видео используется UDP — так и хотелось сделать полноценный P2P (Peer-to-peer) линк, чтоб не гонять видео от борта до сервера и обратно до клиента. Ну, раз хотелось — взял и сделал 🙂 Фактически, получился простой и лёгкий аналог адобовского RTMFP (не путать с RTMP). Только вот передачу звука добавить никак руки не дойдут, так что рцборда пока немая и глухая.

С UDP какая основная проблема — преодоление NAT. Так как на одном из концов линка (на передающей стороне или на приёмной) обязательно есть NAT — просто указать адрес и порт сервера (или клиента) не получится — NAT помешает. В виндовом Virt2real Player есть возможность с помощью UPnP сделать проброс порта, но это не совсем то чего я хотел.

А то что хотел — получилось только после вдумчивого курения технологии UDP Hole Punching. В итоге всё получилось как надо — неважно, какой роутер, неважно где клиент или сервер. Главное чтоб был выход в Интернет. Хотя вру, есть один единственный тип NAT, который пробить пока не удалось. Всё время забываю как он правильно называется, вроде бы симметричный NAT.

Смотрите про коптеры:  Постройка самолета своими руками: инструкция к применению

И да, обычные TURN и STUN серверы в рцборде не используются, только своя реализация. Как я обычно говорю: хочешь изучить технологию — сделай по своему, а потом сравни с общепринятыми решениями. Любители велосипедов меня поймут. Однако часто оказывается что велосипед не так уж плох и свои задачи выполняет лучше чем общепринятые решения.

Это так, лёгкий оффтоп был. Продолжаем про NAT. Поддержка P2P есть пока только в виндовом приложении Virt2real Player, в андроидное и айфонно-айпадное ещё не добавлял. Проверял работу с коннектом через свисток Yota, через свисток Beeline 4G, через точку доступа на смартфоне, который в инет выходил тоже через Beeline 4G.

Во всех этих случаях всё работает, но заметил что идеально только через Yota. Через билайн (в любом из опробованных видах) тоже работает, но коннект дольше времени занимает. Почему так происходит — пока не разбирался. Из печального — пока не удалось заставить работать линк (и команд, и видео) когда и клиент и сервер подключены через 4G свистки. Возможно, тут как раз симметричный NAT и подкрался.

Что понадобится для сборки

Но сначала, чтобы продемонстрировать некоторые варианты использования

Где это уже было использовано

Как я уже писал, рцборду мы уже много где использовали, но из задокументированных случаев нашёл только вот эти:

Дополнительные модули

Во вкладке «Дополнительные модули» находится список активных и неактивных модулей рцборды.

Модуль — это отдельное приложение (исполняемый бинарник), которое обычно выступает в качестве источника телеметрии. Активные модули — это те, которые запускаются автоматически при старте рцборды и завершаются при завершении её работы. В панели управления можно перемещать модули из одного столбца в другой, нажатием на оранжевую стрелочку.

Иллюстрации различных типов коннекта

К сожалению, дома у меня Yota еле-еле фурычит, так что полноценно не покатаешься. А вот Билайновский 4G отлично работает, поток 3 мегабита (и входящий, и исходящий) пролазит без проблем.

Во всех нижеприведённых экспериментах все настройки одинаковые, меняется лишь вид связи.

Инвайты

Чтобы было проще передать кому-то параметры для подключения к нашей машинке в режиме P2P, были созданы намётки механизма инвайтов. Что такое инвайты — знают все. Удобная штука. Так что сейчас попробую рассказать как этим пользоваться. В плеере это пока в тестовом, сыром, виде, но вроде как работает.

Итак, открываем виндовый Virt2real Player, щёлкаем правой кнопкой мыши по окну, выбираем «Инвайт» -> «Создать инвайт». Важный нюанс — плеер должен быть настроен на P2P режим, т.е. в настройках сети указаны все вышеописанные параметры для подключения к машинке.

Итак, подопытный кролик

Краулер для дистанционного управления хорош тем что он обладает очень высокой проходимостью.

У краулера полный привод, постоянная блокировка дифференциалов (все колёса крутятся одновременно) и постоянная «пониженная передача». Т.е. он ездит сравнительно медленно, но мощно и проходимо.

Клёвый снегоуборщик под управлением рцборды


Кстати, сам снегоуборщик — разработка пермских ребят

Компоненты

1. Android устройство

Итак, первое что прежде всего потребуется – это любое Android устройство: смартфон, планшет, часы и т.п., желательно с датчиком наклона (акселерометром) и Bluetooth (или возможностью подключения внешнего модуля через USB OTG). Я использовал китайский Ainol Aurora с внешней USB Bluetooth флэшкой. Цена такого устройства на сегодняшний день составляет менее 100$.

2. Шасси для машинки

Настройка p2p режима, на борту стоит wi-fi


К Виртурилке на борту машинки подключён свисток Wi-Fi (т.е. как делали до сих пор по инструкции из этого топика). Только сначала мы управляли машинкой локально, а теперь сможем дать кому-нибудь порулить из Инета.

Для включения p2p режима идём веб-панель управления рцборды, раздел «Локальные настройки». Там устанавливаем параметр

role=p2p

Настройка p2p режима, на борту стоит yota

К micro-USB порту Виртурилки на борту машинки подключаем свисток Yota (через переходник USB-OTG, само собой). Те свистки, которые сейчас в продаже у Yota

В остальном всё аналогично предыдущему пункту. Разве что в настройках рцборды в разделе «Дополнительные модули» хорошо бы убрать из активных скриптов модуль statuswifi и наоборот, поместить в активные скрипты модуль statusyota, для того чтоб в плеере видеть параметры сигнала Yota.

Настройка виртурилки

Перед тем как собирать машинку, надо настроить Виртурилку. Сначала рассмотрим вариант с подключением по Wi-Fi.

Итак, по пунктам:

Настройка сервера рцборды

Все настройки рцборды можно редактировать в специальной панели управления рцбордой (не путать с админкой Виртурилки). Вот так сейчас выглядит панель управления рцборды (первая версия)

Во вкладке «Общие настройки» можно задать имя устройства (отображается при обнаружении девайса в приложениях), указать надо ли запускать сервер рцборды автоматически при загрузке Виртурилки, задать тип конфигурации.

Настройки приложения

Скриншот настроек Android приложения CxemCar версии 1.0:

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

Точка разворота для мотора (ось X)

При наклоне Android-устройства влево или вправо программа притормаживает тот двигатель, в сторону которого наклонено устройство, т.о. осуществляется поворот. Однако, когда значение наклона доходит до заданной в настройках точки разворота, то двигатель начинает вращаться в другую сторону.

MAC адрес

Для установления связи с Bluetooth модулем машинки, в настройках приложения необходимо задать MAC-адрес. Предварительно необходимо настроить сопряжение устройств в настройках вашего Android-устройства. Для этого переходим в Настройки -> Bluetooth и нажимаем “Поиск устройств”, телефон находит наш Bluetooh-модуль, нажимаем по нему и вводим пароль (как правило 1234).

Узнать Bluetooth адрес модуля можно из какого-нибудь приложения, к примеру Bluetooth Terminal. Для этого внизу нажимаем “Connect a device – Secure” и в появившемся окошке нажимаем кнопку “Scan for devices”. ПО сканирует Bluetooth устройства и отобразит их MAC-адреса:

Этот MAC-адрес и необходимо прописать в настройках приложения CxemCAR.

Само ПО под Android я не буду расписывать, т.к. оно довольно таки громоздкое и поэтому если у вас возникнут какие-либо вопросы по нему, то обращайтесь тему поддержки данного проекта на форуме.

Некоторые нюансы при связи по 4g

После диких дропов при полёте на самолёте разобрались в чём проблема. Если коннект через 4G — надо параметр mtu устанавливать равным 1322 или меньше. Меньше не надо, ставим mtu=1322 и не паримся. В локальной сети я обычно вообще 16000 ставлю (максимальный размер Jumbo Frames), в локалке это нормально работает, а вот через Интернет уже проблемы будут с прохождением пакетов.

Немного про задержку

Главное требование к дистанционному управлению одно — как можно меньшая задержка от нажатия кнопки или перемещения джойстика до соответствующего изменения отображаемой с борта устройства картинки в видеопотоке. Когда публикуешь что-нибудь на тему удалённого управления обычно первый вопрос — «какая задержка?».

После многочисленных испытаний оказалось что задержки — штука субьективная и на комфортность управления влияет по разному. Само собой, всё зависит от максимальной скорости ездящего девайса. Для летающих девайсов (самолёты/коптеры) минимальность задержки очень важна, а вот при управлении ездящими устройствами — не всегда.

Когда я на очередной выставке Хобби-экспо рассекал по залу на переделанной радиоуправляемой багги, через десять минут руления поймал себя на мысли что задержка (какая бы она ни была) перестаёт ощущаться, начинаешь управлять «на упреждение». На почти половине скорости (а багги моя до 80 км/ч может разгоняться) спокойно гонял по залу, лавируя между павильонами, стульями, людьми.

Так что тут, скорее, важна стабильность задержки, а не её абсолютное значение в миллисекундах. Минимальная достигнутая задержка при коннекте к обычному роутеру через обычный Wi-Fi свисток была где-то в районе 200 мс, а при коннекте через общепризнанный эталон — мощные роутеры фирмы Ubiquity минимальная задержка при уверенном коннекте — около 100 мс.

Когда я управлял довольно скоростной багги в Шеньчжене, сидя дома в Москве, довольно комфортно было рулить, хотя только сетевой пинг от меня до сервера китайского 4G оператора был около 300 мс. Плюс ещё 100 мс наши — итого под полсекунды набегает. Однако отлично покатался 🙂

Общий принцип подключения моторов машинки

Обычно у RC машинки два мотора. Один обычный, коллекторный — крутит колёса. Второй — сервомотор, поворачивает передние колёса в нужную сторону. Т.е. получается что требуется всего два канала управления — газ и руль. Изначально (если машинка куплена в собранном виде) все каналы подключены к штатному радиоприёмнику трёхпиновыми разъёмами типа JR (стандартный серворазъём). Чёрный (или коричневый) провод — земля, красный — питание (5-6В), жёлтый (или белый, или оранжевый) — сигнальный провод.

Именно по сигнальному проводу мы и будем управлять моторами, но сначала надо подать питание на серву, которая рулит колёсами. Тут общий принцип такой — с бортового аккумулятора силовое питание с напряжением, равным напряжению аккумулятора, идёт по толстым проводам на мощный регулятор коллекторного (или бесколлекторного) мотора.

Внутри этого регулятора есть так называемый BEC — преобразователь напряжения, делающий из различного аккумуляторного напряжения стабильные 5 Вольт (иногда 6В, можно выбирать перемычкой на регуляторе), требуемые для питания бортовых сервомашинок, приёмника и различной другой электроники. Это стабилизированное питание обычно рассчитано на нагрузку не более чем 2-3А, хотя это тоже зависит от модели регулятора.

Выходное напряжение BEC по чёрному и красному проводам тонкого трёхжильного шлейфа от регулятора подаётся на приёмник. Здесь таится главный нюанс, который не все сразу осмысливают. Повторюсь — от регулятора идёт кабель с тремя жилами. Из них две жилы это питание, которое выдаётся с регулятора, т.е. это выход.

В приёмнике есть несколько групп трёхпиновых контактов. Их количество зависит от количества каналов, на которое приёмник рассчитан. У машинок обычно 2 или 3 канала, так что групп, соответственно, 3 или 4 (одна группа для установки перемычки Pair (сигнал на спаривание приёмника и передатчика).

У этих групп контактов все пины питания замкнуты между собой, т.е. земля и питание приходят с регулятора и подаётся сразу на все группы контактов. А вот сигнальные пины все независимые, на них выдаётся сигнал, принятый приёмником с радиоаппаратуры управления.

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

А оставшиеся белые (жёлтые или оранжевые) два проводка надо подключить к Виртурилке, а именно к пинам CON44 и CON43, см. схему . Какой именно провод к какому пину особо значения не имеет, так как каналы можно настроить потом в конфиге рцборды.

Должно получиться примерно такое подключение

Если под рукой есть сервоудлинители — удобно сделать подключение с их помощью. У меня с ними вечный напряг, так что я просто обрезаю проводки и кручиваю-спаиваю.

И да, самое главное — питание на Виртурилку подаём прямо с контактов аккумулятора. Ей нестрашно напряжение вплоть до 20В, так что чем выше напряжение — тем лучше, ток меньший будет потреблять. КПД преобразователя питания (SEPIC, установлен на самой Виртурилке) падает только после 15В, так что идеальное питание — от 12 до 15 В, при этом в полной нагрузке (с вифи)

Принцип работы

В Android устройстве формируются команды перемещения машинки в зависимости от наклона смартфона/планшета, либо от нажатой кнопки. Все расчеты производятся в Android-приложении, и сразу же вычисляются значения ШИМ для левого и правого двигателей. Приложение обладает гибкими настройками, такими как диапазон ШИМ, чувствительность наклона, минимальный порог ШИМ и др.

По Bluetooth передаются команды вида:L-255rR-120rL – команда для левого двигателя, R – для правогоминус обозначает вращение двигателя для движения назад255 – число ШИМ, для Arduino это максимальная скорость вращенияr – конец команды.

L255rR-255rПо данной команде левый двигатель будет вращаться вперед, а правый назад, что заставит машинку вращаться вокруг своей оси против часовой стрелки.

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

Символы команд L, R и H можно задавать в настройках Android-приложения.

В программе контроллера предусмотрен таймер, который отключает двигатели, если последняя команда была получена более, чем n-секунд назад. Настройка количества секунд хранится в EEPROM памяти контроллера и может быть изменена с Android устройства. Диапазон данной настройки составляет от 0.1 сек до 99.9 секунд.

Также, настройку можно совсем отключить. Но тогда, при потере связи машинка будет ехать, пока не будет выключено питание.Для работы с памятью микроконтроллера предусмотрены команды Fr – чтение значений и Fw – запись значений.

Проверка подключения виртурилки к сети

  • В процессе загрузки Виртурилки на ней будут загораться светодиоды. При включении питания, если загрузочная флешка успешно прочиталась, загорится зелёный светодиод. Затем, в процессе загрузке ядра загорится синий светодиод. После полной загрузки если подключение к Wi-Fi сети прошло удачно — загорится красный светодиод. А когда запустится рцборда (она прописана в автозапуске) все светодиоды погаснут красный светодиод начнёт моргать).
  • Устанавливаем приложение для управления. Оно называется Virt2real Player и есть для Windows (дистрибутив или zip-архив), для Android, для IOS. Приложение для IOS в аппсторе ещё старой версии, новая проходит аппрув, так что пока ставить его бестолку — управление работать будет коряво.
  • Открываем Проводник (если на компе винда), если Виртурилка успешно подключилась к локальной сети по вайфаю — в разделе «Сеть» должно появиться устройство «RCboard (Virt2real)». В админку можно попасть, нажав правой кнопкой мыши на этом устройстве и выбрав пункт меню «Просмотр веб-страницы устройства»
  • Запускаем Virt2real Player для Windows или для Android, должен обнаружиться сервер RCboard. Обнаружение сервера в приложении под IOS пока не реализовано.

Самый тяжёлый девайс под управлением рцборды

Совместный проект с

Сборка машинки

Я попробовал заснять видео процесса сборки моего краулера. Не знаю, насколько там всё понятно, но лишним, думаю, не будет. Вот видеоролик про сборку:

Ссылки


Так как текста получилось овер-чем-дофига, основные ссылки повторю.

Прошивка rcboard-0.01.002.zip для Виртурилки

Дистрибутив Virt2real Player для Windows. То же самое, но не установщик а просто архивПод Win8 некорректно проверяет наличие DirectX, так что можно просто архив распаковать. Требуется .Net 4.5 и DirectX.

Описание прошлой версии РЦборды и Virt2real PlayerЕщё описание рцборды, старый протокол

Приложение для Android. Только локальное управление.Приложение для IOS, только локальное управление, нет обнаружения девайсов. Сейчас там старая версия, новая проходит аппрув.

P.S. Эхх, жаль Тачка Бонда не дожила до появления рцборды 🙁

Электронная начинка

Структурная схема CxemCAR представлена ниже:

https://www.youtube.com/watch?v=GTmchmHAM1c

Как видим, к контроллеру (Arduino, STM32 и др. неважно какой) подключается Bluetooth модуль и драйвер двигателей, к которому в свою очередь подключается 2 или 4 моторчика Bluetooth-управляемой модели. На схеме изображен один выход дополнительного канала (включение звукового сигнала, фар и т.п.), но путем небольшой правки программы число дополнительных каналов может быть легко увеличено.

Оцените статью
Радиокоптер.ру
Добавить комментарий