Суббота, 23.09.2017, 19:34
RC - Мастерская
Главная | Каталог статей | Регистрация | Вход
Меню
Статистика
Главная » Статьи » Инструкции » Микроконтроллеры

OrangeRx OpenLRS - Arduino+радиомодуль в диапазоне 433МГц
OrangeRx OpenLRS - Arduino+радиомодуль в диапазоне 433МГц
 
Купить на Паркфлаере
Купить на Паркфлаере (формфактор JR)
 
  Вообще-то, LRS расшифровывается как Long Range System - система дальнобойной радиосвязи, в вольном переводе. Приставка Open означает открытое железо и исходный код прошивки. Хоть само устройство продается не так давно, но в интернете информации по нему более чем достаточно. В сухом остатке все сходятся к тому, что никакая она не LRS. Меня же больше заинтересовала приставка Open и диапазон 433МГц. Все дело в том, что способность радиоволны огибать препятствия тем больше, чем больше ее длинна. А т.к. последняя обратно пропорциональна несущей частоте, получаем что, при равной выходной мощности радиомодуль данного диапазона вблизи поверхности земли в разы выгоднее по дальности нежели диапазона 2.4 ГГц.
  Само по себе устройство состоит из двух компонентов: трансивер 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

Аналог rfm22b от Silicon Labs si4432 Datasheet

Категория: Микроконтроллеры | Добавил: Mactep (20.09.2013)
Просмотров: 5995 | Теги: OrangeRx, Adruino, rfm22b | Рейтинг: 4.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск