OrangeRx OpenLRS - Arduino+радиомодуль в диапазоне 433МГц
Вообще-то, LRS расшифровывается как Long Range System - система дальнобойной радиосвязи, в вольном переводе. Приставка Open означает открытое железо и исходный код прошивки. Хоть само устройство продается не так давно, но в интернете информации по нему более чем достаточно. В сухом остатке все сходятся к тому, что никакая она не LRS. Меня же больше заинтересовала приставка Open и диапазон 433МГц. Все дело в том, что способность радиоволны огибать препятствия тем больше, чем больше ее длинна. А т.к. последняя обратно пропорциональна несущей частоте, получаем что, при равной выходной мощности радиомодуль данного диапазона вблизи поверхности земли в разы выгоднее по дальности нежели диапазона 2.4 ГГц. Само по себе устройство состоит из двух компонентов: трансивер HopeRF rfm22b и микроконтроллер Atmega 328. В последнюю уже залит Arduino-загрузчик. Устройство поставляется в двух вариантах.
В корпусе внешнего вч-модуля JR:
В бескорпусном виде (плату прикрывает наклейка и термоусадка):
Причем последний заметно дешевле. На момент подготовки данного материала его цена всего 730р. Все свои опыты и эксперименты я проводил на нем. Технические характеристики устройства определяются характеристиками его компонентов. Полное описание можно найти в соответствующих даташитах.
Микроконтроллер:
Тактовая частота: 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
Аналог rfm22b от Silicon Labs si4432 Datasheet
По материалам rc-master, автор Зайчиков Александр
Возможно вас заинтересует обзор по RC Helicopters и Drones от Clive
https://hobbyhelp.com/rc-helicopters