можно ли управлять радиоуправляемой машинкой с телефона
После приобретения недорогого 7″ китайского планшета и экспериментами с взаимодействием с Arduino по USB и Bluetooth захотелось сделать что-то более серьезное и полезное для своих детей. Так родилась идея сделать машинку с управлением от акселерометра Android-устройства и связи по Bluetooth каналу. До этого я никогда не увлекался робототехникой или РУ управлением, но желание было. Были поставлены три цели:
Данные обрабатываются и передаются по Bluetooth каналу на контроллер машинки, который в свою очередь через драйвер двигателей управляет моторчиками машинки.
Компоненты
1. Android устройство
2. Шасси для машинки
Также понадобится любое шасси с 2-мя или 4-мя моторчиками. Это может быть как шасси для DIY проектов, так и шасси от старой б/у радиоуправляемой машинки.
Я купил готовое шасси на eBay. Кто еще не знаком с интернет-аукционом eBay, рекомендую для прочтения эту статью: покупка радиодеталей на eBay. Гарантирую, что сэкономите немало денег покупая там, а не здесь у перекупов. Также, можно воспользоваться и другими китайскими магазинами: www.aliexpress.com, dx.com и др. Найти шасси довольно легко, достаточно в поисковую строку вбить одно из словосочетаний: Robot chassis, Robot platform, DIY Car chassis и др. Стоимость варьируется от 20$ до 60$.
При выборе шасси обращайте внимание на питание и мощность двигателей, а также на обороты моторчиков и наличие редуктора. Хотя большинство платформ содержат стандартный 6В моторчик с редуктором.
Для принципа управления описанного в данном проекте, больше всего подходит гусеничная платформа, но т.к. у меня пока что ее нет, я реализовал проект на основе 4WD платформы.
3. Контроллер машинки
Как я уже говорил, проект планируется сделать мультиплатформенным. На текущий момент проект CxemCAR реализован для следующих аппаратных платформ:
«Мозги» робота не требовательны к быстродействию МК и количеству периферии, необходимый минимум, который должен поддерживать микроконтроллер: 2 ШИМ и UART.
4. Bluetooth модуль
В качестве Bluetooth модуля использован дешевый китайский UART модуль HC-06. Подойдут модули вида HC-03, HC-04, HC-05, HC-06, да и вообще любые Serial Bluetooth. Лучше брать с готовыми штыревыми выводами, чтобы не пришлось паять, т.к. расстояние между выводами очень маленькое (см. 1-ой на фото внизу). Стоимость такого модуля на eBay составляет в среднем 5-10$.
Bluetooth модули и работа с ними применительно к Arduino, неплохо описаны в этой статье. Для других контроллеров все практически тоже самое, вот к примеру статья с описанием связи по Bluetooth между STM32 и Android.
5. Драйвер двигателя
В качестве драйвера я использовал специализированную микросхему L298N, которая представляет собой сдвоенный мостовой драйвер двигателей и предназначена для управления DC и шаговыми двигателями. На eBay продаются готовые платы со всей необходимой обвязкой, цена платы составляет 4-5$ и выглядит она приблизительно так:
Подключение к Arduino достаточно подробно описано в этой статье. В нашем проекте для плавного изменения скорости вращения двигателей, мы будем использовать ШИМ (широтно-импульсную модуляцию).
6. Остальные комплектующие
Помимо вышеперечисленных компонентов понадобятся:
— батарейный отсек (4-5 батареек АА) или аккумуляторы, можно использовать к примеру готовые блоки Li-Po аккумуляторов на 7.4В
— соединительные провода
— выключатель питания
— термоусадочная трубка, хомуты и др.
Все это конечно опционально и можно заменить тем, что есть под рукой, к примеру вместо термоусадки использовать изоленту и т.д.
Как видите, себестоимость машинки не так уж и велика, если использовать свое шасси с моторчиками, то выходит около 20-25$ на все, если покупать и шасси, то выйдет уже 45-60$ в зависимости от типа шасси (т.к. диапазон цен на них очень широк).
Вот, что получилось у меня:
Принцип работы
L255\rR-255\r
По данной команде левый двигатель будет вращаться вперед, а правый назад, что заставит машинку вращаться вокруг своей оси против часовой стрелки.
H1\r
Команда включения дополнительного канала, к которому например можно подключить фары, звуковой сигнал и т.п. В качестве примера, приведен только один дополнитльный канал, однако ПО легко модифицировать, чтобы задействовать большее количество дополнительных каналов.
Символы команд L, R и H можно задавать в настройках Android-приложения.
Электронная начинка
Структурная схема CxemCAR представлена ниже:
Как видим, к контроллеру (Arduino, STM32 и др. неважно какой) подключается Bluetooth модуль и драйвер двигателей, к которому в свою очередь подключается 2 или 4 моторчика Bluetooth-управляемой модели. На схеме изображен один выход дополнительного канала (включение звукового сигнала, фар и т.п.), но путем небольшой правки программы число дополнительных каналов может быть легко увеличено.
Работа с Android приложением
Приложение под Android писалось в среде Eclipse. Все исходники проекта и проект для Eclipse вы можете скачать ниже. Я не специалист в Java программировании и это мое первое приложение под Android поэтому кое-где код не совсем удачен. Именно на разработку Android приложения ушло основное время при разработке данного проекта. Версия Android должна быть не ниже 3.0, я все писал и тестировал под планшет с версией 4.0.3.
Приложение содержит несколько активити. Главное активити представляет собой начальный экран с кнопками запуска различных режимов управления и настройками:
Предусмотрено 3 режима управления Bluetooth-моделью:
Настройки приложения
Скриншот настроек Android приложения CxemCar версии 1.0:
К каждой настройке внизу есть небольшое пояснение, поэтому с их предназначением думаю не должно возникнуть вопросов. Однако на некоторых из них хотелось бы остановиться более подробно.
Точка разворота для мотора (ось X)
При наклоне Android-устройства влево или вправо программа притормаживает тот двигатель, в сторону которого наклонено устройство, т.о. осуществляется поворот. Однако, когда значение наклона доходит до заданной в настройках точки разворота, то двигатель начинает вращаться в другую сторону. Если наклонить устройство максимально вбок, то один двигатель будет вращаться с максимальной скоростью в одну сторону, а другой в другую и соответственно машинка будет крутиться вокруг своей оси на месте.
MAC адрес
Этот MAC-адрес и необходимо прописать в настройках приложения CxemCAR.
Само ПО под Android я не буду расписывать, т.к. оно довольно таки громоздкое и поэтому если у вас возникнут какие-либо вопросы по нему, то обращайтесь тему поддержки данного проекта на форуме.
Сборка платформы
Как я уже говорил выше, в качестве платформы я выбрал шасси Pirate-4WD от производителя DFRobot (SKU:ROB0003). Это одно из самых популярных шасси, вот его описание и видео по сборке. Хотя там все интуитивно понятно и сборка очень проста.
После того, как была собрана основа шасси с моторами, припаиваем провода и на всякий случай маркируем моторчики:
На верхнем фото хорошо видно, что левые и правые двигатели относительно друг-друга расположены несоосно из-за непродуманности китайской конструкции, и из-за этого колеса немного проскальзывали при движении. Поэтому потребовалось небольшая доработка, для этого я вырезал распорки из пластика и вставил их между двигателями.
Стало немного лучше, но все равно остался небольшой градус у колес. Однако, как показали дальнейшие испытания, это не сильно влияло на ходовые качества платформы. Поэтому не стал углубляться в доработку шасси и оставил как есть с распорками.
Следующим этапом является установка колес. На вал они налезают очень туго, кое-где даже пришлось подпилить каттэром.
Провода от 4-х моторов подключаем к плате драйвера двигателей L298N, левые 2 мотора просто запаралеленны, тоже самое и правые.
Для того, чтобы можно было видеть состояние Bluetooth соединения, у модуля HC-06 (да и у других тоже) присутствует возможность подключения светодиода состояния. Я решил его также подключить и вывести на видное место. Для этого, я использовал токоограничительный резистор номиналом 470 Ом и термоусадочную трубку.
К модулю Bluetooth подключаем или подпаиваем все необходимые провода, помимо светодиода это питание, GND, TX и RX. Смотрите документацию на ваш Bluetooth модуль. Чтобы не мучаться с пайкой, я вам советую сразу взять модуль с подпаянными штыревыми выводами (см. фото выше). И лучше брать модули HC-03/HC-05.
Я же использовал модуль HC-06, который у меня был до этого. Схема распайки следующая:
В распаянном виде модуль выглядит так:
Его я также разместил в термоусадочной трубке большого диаметра.
Для питания двигателей я использовал батарейный отсек на 5 элементов типа АА, т.е. напряжение питания двигателей составило 7.5 Вольт. Можно использовать LiPo и другие аккумуляторы. Для крепления батарейного отсека в крышке шасси просверлил два отверстия и закрепил при помощи двух болтов.
Смартфон управляет игрушечным автомобилем
За прошедшее десятилетие у многих появилось один два смартфона лежащих без дела, так и у меня. Решил применить смартфон для управления чем-нибудь, ну например, автомобилем.
Для начала выбрал игрушечный автомобиль из Лего. Он может двигаться вперед и назад, поворачивать вправо и влево и имеет пульт ДУ c ИК лучами. В качестве драйвера двигателей машинки используется микросхема LB1836, которая имеет четыре информационных входа. In1, In2 — управляют ходовым двигателем, In3, In4 — управляют приводом руля, по схеме 0, 0 или 1, 1 — нерабочее состояние. 0, 1 или 1, 0 — вращение двигателя в одну или другую сторону.
Логические 0 и 1 на входах формирует приемник ИК лучей игрушки при получении сигналов от ДУ.
Я для передачи сигналов от смартфона к машинке решил использовать экран смартфона, поскольку другие каналы передачи технически сложные и дорогие в реализации. К входам микросхемы LB1836 я решил подсоединить свое устройство, которое будет получать сигналы от смартфона.
Схема передачи сигналов такая. Программа в смартфоне создает световые пятна заданной продолжительности на экране, устройство их регистрирует и формирует логические 0 и 1 той же продолжительности на входах LB1836 без какой либо логической обработки, что очень упрощает конструкцию устройства. То есть, я просто подменил приемник ИК лучей своим устройством.
Устройство приема световых сигналов состоит из 4 ячеек. Каждая ячейка представляет собой фототранзистор L-3DP3C KGB подсоединенный к усилителю на npn транзисторе KT315. Питание берется с управляемой машинки. Выход, как я уже говорил, подсоединяется к соответствующему входу драйвера двигателя. Маломощные двигатели могут питаться прямо от выхода, но вращаться будут только в одну сторону. Но зато их будет четыре!
О выборе элементов устройства могу сказать следующее. Транзисторы я взял те, какие у меня были с давних времен. Фототранзисторы купил те, что были в магазине. Так что, желающие повторить схему, не тратьте время на поиски, воспользуйтесь теми элементами, что вам доступны. Кстати, вначале я усилитель собрал на микросхеме LM 324N с четырьмя операционными усилителями. Тоже хорошо работает, но мне показались его габариты слишком большими.
Устройство собрал на картонке, используя полоски медной фольги и элементы конструктора Лего.
Фототранзисторы помещены на дно световых колодцев диаметром 5мм и глубиной 9 мм, что бы исключить боковое засвечивание. В световые колодцы вставлены металлизированные плёнки, свёрнутые в трубочку, что значительно повышает чувствительность фототранзисторов, за счет увеличения светового потока.
Вот такой получился автомобиль.
Для разработки программы я взял, приложение BASIC! из Googl Play Маркет. Это приложение позволяет писать программы для Android, создавать файлы apk и работать со всеми сенсорами и устройствами смартфона.
В программе используется управление голосом как наиболее целесообразное в моем случае. Объект TTS преобразует текст в речь. Объект STT преобразует речь в текст. При работе STT обязательно должен быть включен Wi Fi, потому что записанная фонограмма отправляется на сервер в интернете, откуда приходит результат распознавания, это несколько слов, или фраз. Программа проверяет, есть ли команда в списке, выводит команду на экран и выполняет её. Если текст не распознан программа выводит сообщение об этом. Все это повторяется в бесконечном цикле. Завершение работы программы производится командой «стоп» или нажатием клавиши возврат. Геометрические размеры взяты относительными, чтобы автоматизировать привязку на разных экранах с разными размерами и разрешением, что не всегда получается. Круги, которые рисуются на экране, являются объектами и номеруются автоматически по мере их создания.
Команда GR.SHOW 2 — означает показать круг, который был создан вторым. Его номер содержится в n4. Можно было написать GR.SHOW n4. В строке IF (theText$=«вперед») THEN kom$=«вперёд» вы заметите различие в значениях величины в команде присваивания — «вперед» и «вперёд». Дело в том, что STT упорно возвращает «вперед», хотя бывают случаи «вперёд», тогда программа не распознает команду. От этого можно было избавиться, но я не стал усложнять программу, а просто поправил написание при выводе на экран. Еще бывают сбои при распознавании команды «влево». Впрочем, возможно это особенности моего произношения.
К сожалению, я не могу вставить сюда клип показывающий работу программы.
Посмотрите здесь.
Контролируем со смартфона радиоуправляемую машину с использованием Arduino
Этот урок показывает как сделать радиоуправляемую модель машины, которую можно контролировать через смартфон. В этом руководстве мы будем использовать плату Arduino Uno.
Шаг 1. Комплектующие
Для того, чтобы сделать модель машины на радиоуправлении (RC-машина) с использованием Ардуино и с возможностью контроля через смартфон, нам понадобятся следующие детали:
Шаг 2. Шасси
Вы можете купить готовый комплект для сборки 4WD шасси или сделать его с помощью ПВХ или любого вида жесткой доски. Наш вариант на фото выше был куплен в онлайн-магазине. Вполне возможно сделать аналог этого шасси своими руками. Не имеет особого значения вид шасси, можно выбрать на свой вкус.
Шаг 3. Моторы (приводы)
В этом проекте используются 6В моторы постоянного тока. Вы можете использовать любой вид приводов на 6В постоянного тока. После того как вы купили моторы, нужно их подготовить перед размещением на шасси.
Вы можете проверить полярность двигателя, подключив его к батарейному блоку. Если он вращается в прямом направлении (красный провод с положительного и черный провод с отрицательного вывода батареи), то соединение правильное.
Шаг 4. Установка двигателей
Следуйте фотографиям выше для того, чтобы понять как установить все двигатели на шасси нашей будущей модели радиоуправляемой машины, которую мы будем контролировать со смартфона.
Шаг 5. Ардуино контроллер
Плата оснащена наборами цифровых и аналоговых пинов ввода/вывода (I/O), которые могут быть подключены к различным платам расширения (экранам) и другим цепям. Плата имеет 14 цифровых контактов, 6 аналоговых контактов и программируется с помощью Arduino IDE (интегрированная среда разработки) через USB-кабель типа B. Плата может питаться от USB-кабеля или от внешней 9-вольтовой батареи, хотя он принимает напряжение от 7 до 20 вольт, по аналогии с Arduino Nano и Leonardo.
Эталонный дизайн оборудования распространяется под лицензией Creative Commons Attribution Share-Alike 2.5 и доступен на веб-сайте Arduino. Макет и производственные файлы для некоторых версий оборудования также доступны. «Uno» означает один на итальянском языке и был выбран в честь выпуска Arduino Software (IDE) 1.0. Плата Uno и версия 1.0 программного обеспечения Arduino (IDE) были эталонными версиями Arduino, теперь разработанными для более новых выпусков.
Плата Uno является первой в серии плат Arduino c USB и эталонной моделью для последующих платформ. ATmega328 на Arduino Uno поставляется с предварительно запрограммированным загрузчиком, который позволяет загружать новый код без использования внешнего аппаратного программера с использованием оригинального протокола STK500. Uno также отличается от всех предыдущих плат тем, что не использует микросхему драйвера FTDI USB-to-serial. Вместо этого он использует Atmega16U2 (Atmega8U2 до версии R2), запрограммированный как преобразователь USB-to-serial.
Микроконтроллеры обычно программируются с использованием диалекта функций из языков программирования C и C++. В дополнение к использованию традиционных наборов инструментов компилятора проект Arduino предоставляет интегрированную среду разработки (IDE).
Шаг 6. H-мост (модуль LM 298)
Термин H-мост (англ. H-bridge) выведен из типичного графического представления такой схемы. Это схема, которая может приводить двигатель постоянного тока в прямом и обратном направлении, см. рисунок выше для понимания работы H-моста.
Он состоит из 4 электронных переключателей S1, S2, S3 и S4 (транзисторы / МОП-транзисторы (MOSFET) / IGBTS). Когда переключатели S1 и S4 замкнуты (а S2 и S3 разомкнуты), на двигатель идет положительное напряжение. Поэтому он вращается в прямом направлении. Аналогично, когда S2 и S3 замкнуты, а S1 и S4 открыты, обратное напряжение идет через двигатель, поэтому он вращается в обратном направлении.
H-мосты доступны в виде интегральных микросхем, или вы можете создать свой собственный, используя 4 обычных транзистора или полевых транзистора (MOSFET). В нашем случае мы используем микросхему H-моста LM298, которая позволяет контролировать скорость и направление вращения двигателей. Ниже перейдем к описанию пинов:
Выход 1: двигатель постоянного тока 1 «+» или шаговый двигатель A+
Выход 2: двигатель постоянного тока 1 «-» или шаговый двигатель A-
Выход 3: двигатель постоянного тока 2 «+» или шаговый двигатель B+
Выход 4: двигатель B выведен
12В контакт: 12В вход, но вы можете использовать от 7 до 35 В
GND: земля
Вывод 5В: выход 5 В, если перемычка 12 В на месте, идеально подходит для питания вашего Arduino
EnA: включает сигнал ШИМ для двигателя А
IN1: включить двигатель A
IN2: включить двигатель A
IN3: включить двигатель B
IN4: включить двигатель B
EnB: включает сигнал ШИМ для двигателя B
Шаг 7. Источник питания
Для нашей радиоуправляемой модели машины на основе Ардуино и с контролем через смартфон могут быть использованы следующие батареи:
Шаг 8. Электрические соединения
Для реализации соединений нужны перемычки. Соедините красные провода двух двигателей (с каждой стороны) вместе и черные провода вместе. Таким образом у нас теперь есть два терминала с каждой стороны. MOTORA отвечает за два правых двигателя, соответственно два левых двигателя подключены к MOTORB. Следуйте инструкциям ниже, чтобы соединить все.
Соединения двигателей
Питание
Шаг 9. Логика управления
Логика управления описывается в таблице ниже.
Шаг 10. Приложение для смартфона
Скачать приложение и установить в смартфон вы можете через Google Play (ссылка).
Для управления RC-автомобилем мы используем смартфон. Смартфон подключается к контроллеру через модуль Bluetooth (HC-06/05). После установки приложения необходимо настроить связь с модулем Bluetooth. Пароль для связи: «1234».
Шаг 11. Код Ардуино
Программная часть довольно простая и не нужна никакая библиотека. Если вы понимаете логическую таблицу на предыдущих шагах, вы сможете написать собственный код. Скачать или скопировать код вы можете ниже:
Рцборда, или Как Сделать Управляемую через Интернет Машинку
За последние несколько лет мне довелось сделать немало дистанционно управляемых устройств. Некоторые управлялись локально, с обычного ПК или со смартфона. Некоторые — через Интернет. Все устройства объединяет общий принцип — управляет ими человек, ориентируясь по картинке с видеокамеры на борту устройства. А само управление, в итоге, сводится к выдаче управляющих сигналов на сервомоторы или регуляторы (драйверы) моторов.
Так что, набравшись опыта в данном деле, решил попробовать более-менее систематизировать различные типы управления устройствами, чтоб при создании нового девайса не приходилось кучу всего переписывать, а достаточно было лишь изменить некоторые параметры конфигурации. В результате родился программный комплекс RCboard, или РЦборда. Т.к. все управляемые штуки я делаю с контролером Virt2real (Виртурилка) в качестве главного бортового мозга, то и рцборда изначально писалась именно под неё. Так что всю связку можно пафосно называть «Программно-аппаратный комплекс РЦборда».
В общем, в продолжении топика попробую написать рецепт про то как с помощью Виртурилки и РЦборды из обычной радиоуправляемой машинки сделать машинку, управляемую через Интернет (ну и локально она тоже будет управляться). Каналом связи будет обычный Wi-Fi (выход в инет через домашний роутер) или 4G связь через свисток Yota.
Краулер BSD Racing 4WD RTR 2.4Ghz 1:10
Сразу уточню — под термином «радиоуправляемая машинка» я подразумеваю не дешёвые китайские машинки, в которых вся электроника реализована на одной плате, а более-менее приличные машинки, построенные по модульной схеме — которые имеют регулятор оборотов двигателя (коллекторного, бесколлекторного — неважно) и сервомашинку для управления поворотом передних колёс.
Такую машинку я приведу в качестве подопытного кролика лишь в этом рецепте, так как проще всего для повторения. С небольшими изменениями в настройках рцборды и добавлением платки-регулятора оборотов движка всё то же самое можно сделать и с любой машинкой, главное чтобы у машинки были колёса (да хоть гусеницы) и был моторчик.
Что понадобится для сборки
Но сначала, чтобы продемонстрировать некоторые варианты использования
Где это уже было использовано
Как я уже писал, рцборду мы уже много где использовали, но из задокументированных случаев нашёл только вот эти:
Испытания рцборды на багги в Шеньчжене, управление из Москвы
Испытания рцборды на краулере в Питере, управление из Москвы
Испытания рцборды на самолёте над Питером, управление из Москвы
Клёвый снегоуборщик под управлением рцборды
Кстати, сам снегоуборщик — разработка пермских ребят http://omiplow.ru
Самый тяжёлый девайс под управлением рцборды
Итак, подопытный кролик
Краулер для дистанционного управления хорош тем что он обладает очень высокой проходимостью.
У краулера полный привод, постоянная блокировка дифференциалов (все колёса крутятся одновременно) и постоянная «пониженная передача». Т.е. он ездит сравнительно медленно, но мощно и проходимо.
Настройка Виртурилки
Перед тем как собирать машинку, надо настроить Виртурилку. Сначала рассмотрим вариант с подключением по Wi-Fi.
Проверка подключения Виртурилки к сети
Общий принцип подключения моторов машинки
Обычно у RC машинки два мотора. Один обычный, коллекторный — крутит колёса. Второй — сервомотор, поворачивает передние колёса в нужную сторону. Т.е. получается что требуется всего два канала управления — газ и руль. Изначально (если машинка куплена в собранном виде) все каналы подключены к штатному радиоприёмнику трёхпиновыми разъёмами типа JR (стандартный серворазъём). Чёрный (или коричневый) провод — земля, красный — питание (5-6В), жёлтый (или белый, или оранжевый) — сигнальный провод.
Именно по сигнальному проводу мы и будем управлять моторами, но сначала надо подать питание на серву, которая рулит колёсами. Тут общий принцип такой — с бортового аккумулятора силовое питание с напряжением, равным напряжению аккумулятора, идёт по толстым проводам на мощный регулятор коллекторного (или бесколлекторного) мотора. Внутри этого регулятора есть так называемый BEC — преобразователь напряжения, делающий из различного аккумуляторного напряжения стабильные 5 Вольт (иногда 6В, можно выбирать перемычкой на регуляторе), требуемые для питания бортовых сервомашинок, приёмника и различной другой электроники. Это стабилизированное питание обычно рассчитано на нагрузку не более чем 2-3А, хотя это тоже зависит от модели регулятора.
Выходное напряжение BEC по чёрному и красному проводам тонкого трёхжильного шлейфа от регулятора подаётся на приёмник. Здесь таится главный нюанс, который не все сразу осмысливают. Повторюсь — от регулятора идёт кабель с тремя жилами. Из них две жилы это питание, которое выдаётся с регулятора, т.е. это выход. А третий провод (белый, жёлтый или оранжевый) — это провод управления, т.е. вход. Вроде мелочь, а почему-то многие путаются.
В приёмнике есть несколько групп трёхпиновых контактов. Их количество зависит от количества каналов, на которое приёмник рассчитан. У машинок обычно 2 или 3 канала, так что групп, соответственно, 3 или 4 (одна группа для установки перемычки Pair (сигнал на спаривание приёмника и передатчика). У этих групп контактов все пины питания замкнуты между собой, т.е. земля и питание приходят с регулятора и подаётся сразу на все группы контактов. А вот сигнальные пины все независимые, на них выдаётся сигнал, принятый приёмником с радиоаппаратуры управления.
Должно получиться примерно такое подключение
Если под рукой есть сервоудлинители — удобно сделать подключение с их помощью. У меня с ними вечный напряг, так что я просто обрезаю проводки и кручиваю-спаиваю.
И да, самое главное — питание на Виртурилку подаём прямо с контактов аккумулятора. Ей нестрашно напряжение вплоть до 20В, так что чем выше напряжение — тем лучше, ток меньший будет потреблять. КПД преобразователя питания (SEPIC, установлен на самой Виртурилке) падает только после 15В, так что идеальное питание — от 12 до 15 В, при этом в полной нагрузке (с вифи) Виртурилка будет потреблять около 150-300 мА. Хотя это тоже зависит от свистка (свисток Yota шибко прожорливый, с ним будет поболее).
Сборка машинки
Я попробовал заснять видео процесса сборки моего краулера. Не знаю, насколько там всё понятно, но лишним, думаю, не будет. Вот видеоролик про сборку:
Настройка сервера рцборды
Все настройки рцборды можно редактировать в специальной панели управления рцбордой (не путать с админкой Виртурилки). Вот так сейчас выглядит панель управления рцборды (первая версия)
Во вкладке «Общие настройки» можно задать имя устройства (отображается при обнаружении девайса в приложениях), указать надо ли запускать сервер рцборды автоматически при загрузке Виртурилки, задать тип конфигурации.
Конфигурация может быть локальная (т.е. файл конфигурации постоянно находится в каталоге рцборды и доступен для редактирования в панели управления), а может быть удалённая, когда файл конфигурации скачивается при каждом запуске рцборды с веб-сервера.
Сервер удалённых конфигов, по дефолту, http://rc.virt2real.ru/getconfig, создавать и редактировать конфигурации там разрешено только зарегистрированным пользователям форума forum.virt2real.ru
В топике я расскажу лишь про локальную конфигурацию, удалённую сами можете попробовать, если кому интересно. К слову, когда я катался на машинке по Шеньчженю (видео в конце топика), то как раз удалённый конфиг использовал, чтобы можно было менять настройки. Изменение настроек из приложения есть пока в виде набросков, толком ещё не работает, но даже когда и доделаю — удалённый конфиг всё равно пригодится.
Итак, больше всего нас сейчас интересует вкладка «Локальная конфигурация». Вообще, дефолтный конфиг уже настраивает рцборду в режим сервера, можно подключать машинку и управлять локально (в локальной сети, с виндового приложения, с андроидного или с айфонно-айпадного). Разве что может потребоваться каналы поменять местами. А вот для режима P2P (peer-to-peer), для управления через Интернет, настройки придётся менять.
По умолчанию за всё управление отвечает библиотека universal.so, параметры для которой находятся в конце конфига, в разделе «[universal]».
Соответствие каналов управления и каналов PWM/PPM задаётся параметром axis.
По дефолту настроено 4 канала PPM, которые находятся на пинах CON43, CON44, CON19, CON42. За это отвечают вот эти строчки конфига
ch0=43,ppm,500,1500,2500,127,0
ch1=44,ppm,500,1500,2500,127,0
ch2=19,ppm,500,1500,2500,127,1
ch3=42,ppm,500,1500,2500,127,1
Формат настройки канала такой:
chX=CON,TYPE,MIN,CENTER,MAX,NEUTRAL,NOAUTOCENTER
Где
X — номер канала PWM/PPM, от 0 до 3
CON — номер пина (не GPIO, а именно пина, см. схему)
TYPE — тип сигнала, ppm или pwm. Для машинки нужно ppm, для типа pwm другой формат строки конфига.
MIN — минимальное положение PPM сигнала, в миллисекундах.
MAX — максимальное положение PPM сигнала, в миллисекундах.
CENTER — центральное положение PPM сигнала, в миллисекундах.
NEUTRAL — относительное значение нейтрали, т.е. нейтральное значение команд управления. Обычно = 127
NOAUTOCENTER — если = 0 — автоматически возвращать сигнал в центральное положение, = 1 — не возвращать. Для каналов газа и руля машинки нужно указать 0, для каналов сервоприводов, которые используются для вращения камеры обзора — нужно указать 1 (если такие есть, конечно)
Если на машинке стоят фары, можно сделать их включение-выключение, потребуется собрать простейший усилитель транзисторный (один полевой транзистор, по сути). Для получения управляющего сигнала используется параметр «pins». Он задаёт пины, которые будут устанавливаться в 0 или 1 при нажатии кнопки в Virt2real Player (на экранных кнопках, на клавиатуре, мышкой или на геймпаде).
Формат такой:
pins=CHANNEL,CON,DEFVALUE,SAVESTATE|.
где
CHANNEL — канал кнопки (от 1 до 32)
CON — номер пина, который требуется установить в 0 или 1 по приходу команды управления с кнопок
DEFVALUE — значение, в которое данный пин будет установлен при запуске рцборды
SAVESTATE — если = 0 — при нажатии кнопки пин установить в 1, при отпускании — установить в 0. Если = 1 — при нажатии кнопки пин установить в 1, при отпускании кнопки ничего не делать. При следующем нажатии кнопки пин установить в 0, при отпускании — снова ничего не делать. И так в цикле.
Каналы кнопок можно указывать подряд, через разделитель «|».
Краткий вывод из этой смутной информации — если у вас перепутаны каналы газа и руля — можно их поменять местами, изменив параметр axis на axis=1,0,2,3 🙂
Если нужно ограничить крайнее положение сервы руля — меняем значения MIN и MAX для нужного канала. Если машинка при нейтральном положении едет вперёд или назад — изменить значение CENTER для нужного канала.
Дополнительные модули
Во вкладке «Дополнительные модули» находится список активных и неактивных модулей рцборды.
Модуль — это отдельное приложение (исполняемый бинарник), которое обычно выступает в качестве источника телеметрии. Активные модули — это те, которые запускаются автоматически при старте рцборды и завершаются при завершении её работы. В панели управления можно перемещать модули из одного столбца в другой, нажатием на оранжевую стрелочку. При перемещении в колонку активных — модуль сразу запускается, неважно, запущена рцборда или нет. При перемещении в неактивные — модуль автоматически прекращает работу.
Модули работают просто — читают требуемые параметры и по UDP отправляют на локальный порт (ext_telemetry), указанный в конфиге. А там уже рцборда принимает инфу и передаёт по каналу телеметрии в приложение Virt2real Player. Одновременно с этим та же информация передаётся в пользовательскую библиотеку девайса (в нашем случае это universal.so), чтоб приложение могло анализировать информацию и использовать по своему назначению. Например, у меня была библиотека девайса под названием autobot.so — управляемая тележка, которая помимо управления пользователем могла ещё и автономно ездить, ориентируясь по сигналу с ультразвукового дальномера.
Из основных модулей — statuswifi поставляет в рцборду информацию о статусе вайфай линка. Airosstatus.php (да, модуль можно и на похапе писать) — читает статус линка с оборудования Ubiquity, gps — читает GPS приёмник. Модуль imu обрабатывает инфу с инерциальных датчиков (углы Эйлера формирует, азимут и компас), правда он пока работает только с одним типом датчиков, так что для универсального использования ещё не годится. Nfc — читает NFC метки, но тоже работает только с одним типом ридеров. rc.in — читает PPM сигналы с RC приёмника, т.е. машинкой можно ещё и с обычной аппы управлять, у неё приоритет перед командами управления через вайфай. rfid — читает метки RFID. statusyota — читает статус линка 4G модема Yota. usrange — читает показания ультразвуковых дальномеров. voltage — определяет напряжение питания борта, требуется простенький делитель напряжения (2 резистора) подключить к ADC0. В общем, интересных модулей куча, по каждому предстоит подробное описание делать, так что пока считаем что я упомянул их для затравки 🙂
Для нашего рецепта управляемой машинки актуален модуль statuswifi — если настраиваем подключение через Wi-Fi или statusyota — если подключаем Виртурилку через свисток Yota.
Настройка приложений
В Андроидном и айпадно-айфонном приложениях настройки несложные, заключаются лишь в выборе каналов управления. В Андроидном есть ещё выбор канала кнопок (по умолчанию канал не задан, кнопки не отображаются). А вот в виндовом приложении я столько фич накрутил, что сам прихожу в состояние лёгкой паники при осознании того что всё это задокументировать надо. Пока могу только дать ссылочку на описание прошлой версии приложения
http://wiki.virt2real.ru/wiki/Как_сделать_управляемую_тележку_2
http://wiki.virt2real.ru/wiki/RCboard
Протокол управления с тех пор заметно видоизменился, но вот настройка виндового приложения поменялась несильно, так что может помочь при ковырянии. А подробное описание текущей версии постараюсь написать в следующем году 🙂
Кстати, в самой ранней версии для передачи телеметрии я использовал протокол MAVLINK, но по мере обрастания фичами его стало не хватать, так что перешёл на свой протокол. А MAVLINK подумываю добавить в качестве параллельного канала телеметрии, но это уже в следующей версии приложения.
Скажу лишь одно — лучше всего машинкой управлять с USB руля и педалей, подключённых к компу. Ну или хотя бы с RC аппы, подключённой тренерским разъёмом к компу. А пальцами по экрану смартфона может быть и круто, но нифига не удобно без тактильных ощущений.
А теперь самое главное — управление через Интернет
Вводная информация про 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 и подкрался.
Настройка P2P режима, на борту стоит Wi-Fi
К Виртурилке на борту машинки подключён свисток Wi-Fi (т.е. как делали до сих пор по инструкции из этого топика). Только сначала мы управляли машинкой локально, а теперь сможем дать кому-нибудь порулить из Инета.
Для включения p2p режима идём веб-панель управления рцборды, раздел «Локальные настройки». Там устанавливаем параметр
Теперь необходимо задать параметры p2p_uid и p2p_hash. Это эдакий аналог логина-пароля, но полноценной авторизации пока нет (но будет обязательно), так что используем именно такую связку. p2p_uid лучше брать из своей учётки на rc.virt2real.ru/remoteconfig там он называется «ID пользователя», тогда будет механизм инвайтов работать (об этом чуть ниже). А p2p_hash надо придумать самостоятельно. Любой набор символов, максимальная длина 40 символов.
Всё, на этом настройка p2p режима рцборды закончена. Необходимо убедиться что Виртурилка имеет выход в инет и можно запускать Virt2real Player виндовый. Если его запустить в локальной сети, там же где и рцборда — плеер обнаружит локальную рцборду (неважно что она в p2p режиме) и можно будет подключиться напрямую. А вот если плеер запускается в другой сети, надо настроить его на p2p режим.
Иногда бывает что сообщения не появляются, тогда лучше просто перезапустить плеер (мой косяк, не отловил его ещё), при запуске он сам сразу начнём коннектиться с теми параметрами, которые мы ему задали, т.е. в режиме P2P.
Из замеченных нюансов — если плеер запускаем на компе, который выходит в инет через Yota — коннект быстро устанавливается. Само собой, если у Йоты сигнал нормальный. А вот если через роутер Yota или 4G свисток от Билайна — первое подключение может длиться до минуты. Но зато все последующие почти мгновенно будут. Я примерно знаю, где я накосячил, но исправить пока руки не дошли.
Настройка P2P режима, на борту стоит Yota
К micro-USB порту Виртурилки на борту машинки подключаем свисток Yota (через переходник USB-OTG, само собой). Те свистки, которые сейчас в продаже у Yota
В остальном всё аналогично предыдущему пункту. Разве что в настройках рцборды в разделе «Дополнительные модули» хорошо бы убрать из активных скриптов модуль statuswifi и наоборот, поместить в активные скрипты модуль statusyota, для того чтоб в плеере видеть параметры сигнала Yota.
Иллюстрации различных типов коннекта
К сожалению, дома у меня Yota еле-еле фурычит, так что полноценно не покатаешься. А вот Билайновский 4G отлично работает, поток 3 мегабита (и входящий, и исходящий) пролазит без проблем.
Во всех нижеприведённых экспериментах все настройки одинаковые, меняется лишь вид связи.