Этот материал тут несколько не к месту. Но я его тут размещаю, т.к. HobbyKing в последнее время существенно расширил ассортимент по платформе Arduino.
Можете закидать меня помидорами...
OrangeRx OpenLRS вышел на рынок сравнительно недавно. По началу на форумах бушевали серьезные страсти на тему "насколько он хорош". Потом все сошлись во мнении, что никакой он не LRS и модуль благополучно подзабыли... Однако, мне кажется, напрасно. Мне кажется этот модуль может иметь широкое применение в Arduino-проектах, где требуется радиосвязь на расстояниях средней дальности (100-1000м). Для более коротких расстояний вполне годится nRF24L01+, так же представленный у ХК и на Паркфлаере. Для больших расстояний применяют что-то типа GSM. А вот средняя ниша была раньше проблемой: одна только rfm22b в Москве стоит около 600р. А тут за 700 и уже с контроллером.
Итак, что я "нарыл"...
Само по себе устройство состоит из двух компонентов: трансивер HopeRF rfm22b и микроконтроллер Atmega 328. В последнюю уже залит Arduino-загрузчик. Устройство поставляется в двух вариантах.
В корпусе внешнего вч-модуля JR:
В бескорпусном виде (плату прикрывает наклейка и термоусадка):
Причем последний заметно дешевле. На момент подготовки данного материала его цена всего 730р. Все свои опыты и эксперименты я проводил на нем.
Технические характеристики устройства определяются характеристиками его компонентов. Полное описание можно найти в соответствующих даташитах(atmega328, rfm22b). Здесь приведу лишь наиболее интересные.
Микроконтроллер:
Тактовая частота: 16МГц
Память программ: 32К
Интерфейс программирования: SPI, UART(благодаря Arduino-загрузчику)
Радиомодуль:
Выходная мощность: до 100мВт. Имеется 8 программно настраиваемых градаций (100mW,50mW, 25mW, 13mW, 6mW, 3mW, 1.6mW, 1.3mW)
Размер буфера приемопередачи: 2х64байт (Rx/Tx)
Возможность скачкообразного изменения канала передачи данных.
Аппаратный контроль адреса передачи данных.
Длинна адреса: 4 байта.
Адресом это называть не совсем правильно. Дело в том что передача данных осуществляется между двумя модулями, имеющими одинаковый заголовок(адрес).
Устройство уже содержит все необходимые цепи согласования уровней и стабилизатор на 3.3В. Питание осуществляется от источника 5В, которые подаются на соответствующие выводы колодки "Сh".
Для прошивки микроконтроллера в колодки SPI или UART подается питание 3.3В. 5В, поданные туда, спалят радиомодуль, т.к. его питание имеет потолок 3.6В.
Распиновка OrangeRx OpenLRS
Прошивка микроконтроллера
Собственно, от идеи разрабатывать код прошивки "с нуля" я отказался сразу. За основу была взята прошивка Kha (https://github.com/openLRSng/openLRSng). Но о коде чуть позже. Сначала сама процедура заливки программы в микроконтроллер. Она не сильно отличается от прошивки Arduino Pro Mini.
Для этого нам понадобится USB-to-TTL переходник с выходом "Reset". У меня в свое время такого под рукой не оказалось - не беда. Я нашел CraftDuino (аналог Arduino Uno).
1. Скачиваем (или пишем) прошивку.
2. Скачиваем среду Arduino с сайта Arduino.ru
3. Из платы извлекаем микроконтроллер и делаем следующее подключение:
4. Далее подключаем USB разъем Arduino к компьютеру.
5. При необходимости (если Windows не справится сама) устанавливаем драйверы TTL-моста. Их можно найти в папке среды Arduino. В итоге в диспетчере устройств появится новый COM-порт.
6. Запускаем среду Arduino и загружаем в нее прошивку.
7. Выбираем COM-порт.
8. Выбираем плату Arduino Pro or Pro Mini 5v/16MHz
9.Нажимаем кнопку "Загрузить". Прошивка компилируется и загружается в микроконтроллер. Готово!
Надо сказать, что это были еще даже не цветочки, а так... тест на работоспособность.
Как вч-модуль для радиоуправляемых моделей (и тем более дальнобойных) данный продукт меня не заинтересовал. Чтоб заставить его работать на многие километры, надо долго "курить" даташит и хорошо знать физику радиоволн. На первое у меня нет времени, а в радиоволнах я разбираюсь достаточно посредственно. Тот же Kha потратил на это куда больше времени и я тут ему полностью доверяю. Поэтому я взял за основу его прошивку и стал разбираться, что из этого агрегата можно выжать.
1. Устанавливаем распиновку меги на выходы устройства и радиомодуль
Arduino pin | Device pin |
A0 | rfm22b SDO |
A1 | rfm22b SDI |
A2 | rfm22b SCLK |
A3 | светодиод 1 |
A4 | I2C SDA |
A5 | I2C SCL |
A6 | не распаян |
A7 | не распаян |
D0 | UART Rx |
D1 | UART Tx |
D2 | rfm22b IRQ |
D3 | RSSI Channel |
D4 | rfm22b nSel |
D5 | Channel 1 |
D6 | Channel 2 |
D7 | Channel 3 |
D8 | Channel 4 |
D9 | Channel 5 |
D10 | Channel 6 |
D11 | Channel 7 |
D12 | Channel 8 |
D13 | светодиод 2 |
Как видно из приведенной таблицы, rfm-ка подключена к меге через программный SPI. Почему так, боюсь известно только производителю. Влезать в схему не будем.
2. Устанавливаем возможности HopeRF RFM22b
Для этого все же обратимся к даташиту. Из последнего следует, что радиомодуль представляет собой трансивер, обеспечивающий двустороннюю связь. Выходная мощность 100 мВт - вполне достаточно, чтоб при не самых прямых руках пробить расстояние метров в 500-800. Радиомодуль имеет 3 программируемых входа/выхода GPIO. Так же у него есть интересная особенность: антенна подключается к внутреннему приемнику или передатчику по установке в 1 соответствующего внешнего входа радиомодуля - Tx, Rx.
Передергивать их можно с микроконтроллера, но в схеме рассматриваемого устройства применено лучшее решение. Входы Tx и Rx радиомодуля соединены с выходами GPIO 0 и 1. Таким образом подключением антенны к приемнику или передатчику можно управлять при помощи внутренних регистров радиомодуля.
Надо сказать, что все общение с радиомодулем происходит посредством программирования внутренних регистров. Большая часть даташита как раз и посвящена описанию их назначения. Так же производителем радиомодуля предлагается еще несколько полезных документов. Среди них AN440 - описание регистров и калькулятор, с помощью которого можно легко рассчитать необходимые значения регистров для инициализации радиомодуля. Я не буду останавливаться на этом подробно.
Радиомодуль имеет два буфера по 64 байта для приема и передачи данных. Стоит заметить, что радиомодуль умеет передавать и принимать пакеты длиной до 255 байт. Но при этом разработчику придется следить за этими буферами. А это уже лишний геморрой. Так что я бы не стал использовать длину пакета более 64 байт.
GPIO 2 в рассматриваемом устройстве подключен к выводу D2 меги. Это позволит нам использовать внешнее прерывание меги для оповещения о приеме пакета. Так же стоит учитывать, что пакеты передаются адресно. Чтоб пакеты данных ходили между двумя радтомодулями, они должны иметь одинаковый 4-х байтовый заголовок.
Радиомодуль умеет разбивать весь диапазон несущей частоты на каналы заданной ширины и впоследствии переключать эти каналы. Для передачи данных между двумя модулями, последние должны в каждый момент времени трансляции иметь одинаковые каналы одинаковой ширины - несущие частоты обоих модулей должны совпадать.
Так же радиомодуль может выдавать цифровое значение RSSI в диапазоне от 0 до 255. Это значение характеризует уровень принимаемого сигнала. Чем оно больше, тем связь стабильнее. В сочетании с возможностью менять канал произвольным образом, разработчик получает возможность разработать и реализовать алгоритм выбора наиболее подходящей несущей частоты для передачи данных. Таким образом можно повысить стабильность передачи и радиус действия связи.
Код, реализующий эти функции, я извлек из прошивки Kha(еще раз спасибо ему за труды) и сгруппировал их в 3 файла. Каждый желающий может проделать подобную работу.
3. Назначение функций
На базе полученных ранее функций, я сделал пример в лучших традициях Hello World. Для теста нам понадобится два устройства. В первую заливаем прошивку Master, а во вторую - Slave. Master читает из UART символ и передает его на второе устройство. При получении с последовательного порта символа "1" оба устройства зажигают светодиод, а при получении символа "0" - гасят.
Скачать пример можно по ссылке.
void rfm22_init() - инициализация и настройка радиомодуля;
void rfm22_SetChannel(uint8_t ch) - установка канала по номеру;
void rfm22_rx_reset() - установка режима приема для радиомодуля;
void rfm22_need_reboot() - перезагружает радиомодуль, если это необходимо;
void rfm22_sendPacket(uint8_t* pkt, uint8_t size) - передает пакет из массива байт pkt длиной size;
void rfm22_readBuffer() - получение принятого пакета данных в массив tx_buf
uint8_t rfmGetRSSI() - получение значения RSSI
Собственно, это уже "цветочки"...
4. Область применения
Помимо прямого назначения, данное устройство может быть применено как обычное Arduino Pro Mini в робототехнических проектах, где необходимо организовать радиосвязь на больших расстояниях. В распоряжении разработчика остается шина I2C, два аналоговых входа, UART и еще 9 цифровых портов ввода/вывода. Описанные выше функции не задействуют таймеры. Так что последние в полном составе остаются в распоряжении разработчика.
Итого: это небольшое и недорогое устройство является достаточно интересным решением для создания распределенных проектов.
Напоследок ветка обсуждения на русскоязычном форуме: http://forum.rcdesign.ru/f90/thread302333.html
ветка обсуждения на англоязычном форуме: http://www.rcgroups.com/forums/showthread.php?t=1778553
Короткая, но очень полезная ветка на форуме "Радиокот": http://radiokot.ru/forum/viewtopic.php?f=20&t=38421
Страница продукта HopeRF rfm22b: http://www.hoperf.com/rf/module/fsk/RFM22B.htm
Постоянное размещение материала на моем сайте: http://rc-master.ucoz.ru/publ/10-1-0-82
На паркфлаере была статья - «Самодельный пульт для симулятора», после опубликования этой статьи было много откликов - на старой ли элементной базе делать PPM кодер или на контролере. Я решил, изучать контроллеры, и попытаться сделать что то наподобие вашей аппаратуры для машинки на “оранжах”.
Если PPM in и PPM out могут работать одновременно, то не вижу проблемы собрать некоторый модуль, который подмешает в PPM что угодно и куда угодно.
Собирать свою аппу - это надо быть энтузиастом. В принципе ничего сложного там нет, но вся разница в деталях. Но купить все равно проще и быстрее. И аппаратура - это далеко не формирование импульсов. В первую очередь - это микшеры.
В конце концов можно заставить симулятор (подключенный через тренерский разъем) управлять нужными каналами.
Я просто никак не могу понять общей блок-схемы того, что Вы хотите воспроизвести. От Футабы для управления моделью отказываться бессмыслено. Держать второй пульт к ней для управления камерой имеет смысл только в случае, когда Вы именно стремитесь брать с собой "пассажира" на камеру. Если пассажир выполняет роль статиста и не должен быть допущен к управлению ничем, то альтернативы хедтрекеру я не вижу. Что до последнего, то можно его как купить готовый, так и сваять самому. Что до "самопала" - все зависит от Вашего опыта программирования и знания мат. анализа, тау, дискретки, мат. моделирования и т.д.
P.S. может дибаты в личку? mactep8@yandex.ru
Как управлять видеокамерой, без head tracker(а)? Летать мы с сыночком собираемся по монитору. У аппаратуры радиоуправления есть свободные каналы, но на джойстики выведены 4 канала. У нас Futaba T7C. Доступ к остальным каналам можно получить через тренерский разъем, но очередность каналов поменять нельзя. То есть в пачке надо будет формировать все 8 канальных импульсов (понятно, что для аппаратуры с большим числом каналов, чем у нас). Коль скоро надо формировать полноценный 8 канальный PPM сигнал, делать шифратор, то остается добавить передающий модуль и аппаратура готова. Но не все так просто. Я разобрался с кодом в статье «Пульт управления своими руками ...», но реальный самолет нужно тремировать, как-то настраивать расходы, запоминать настройки. Вот и изучаю данную тему. Совсем не представлю, не умею, не знаю, как получить данные о координатах самолета и сделать антенный трекер на Arduino.
2. Модель Вашей аппы мне ни о чем не говорит. Я пользую турнигу 9XR "в хвост и в гриву" и доволен как слон.
3. Я правильно понял, что Вы хотите снять с тренерского разъема PPM и засунуть его в оранж, чтоб передать на самолет? Предложение "как вариант": возьмите второй пульт (хоть симулятор с ХК). С него Вы тоже получите PPM. В оранже отдельно оцифруйте оба PPM и смешайте как нравится. С одного пульта "первый пилот" управляет самолетом, в это же время "второй пилот" управляет камерой со второго пульта.
Кстати, я отказался от закупки оранжей ввиду их нынешней высокой цены. На BangGood'е есть Arduino ProMini что-то около 650р за 5 штук и si4432 радиомодуль (700р за 5штук). Запаиваим их по распиновке оранжа, прошиваем и... имеем 5 оранжей за менее чем 1500р (за 5 штук!)
при заливке загрузчика вылетает ошибка:
avrdude: error: could not find USB device "USBasp" with vid=0x16c0 pid=0x5dc
шить пытаюсь USBasp-бом
подскажите в каком направлении искать?
2. Эта ошибка говорит, что у Вас какая-то проблема с подключением платы программатора. Среда ее не видит. Возможно драйвер не стоит или криво стоит, порт не выбран/неправильно выбран...
в итоге вот скетч http://yadi.sk/d/3_uN8CdnNig4e мощи убавил, радиус конечно маленький, портативка на 1ватт намного эффективнее )
Статья к месту, многие не знают или забыли, что на этом сайте и на хобях есть раздел робототехники правда маловато там всяких штучек и вкусняшек, но все равно полезно. Передача сигнала на большое расстояние бывает необходима ведь это в поле 1000 метров а в городе метров 100 - 200 будет гарантировано а может и больше. Огромное спасибо за труд а то руки не доходили воткнуть на своего ROBONOVA-1 радиоуправление.