Радиомодули rfm12b

При разработке навигационной системы мобильного робота нам были необходимы беспроводные радио модули. Сначала мы попробовали радио модули tr24. Но оказалось, что они передают на слишком малое расстояние. Следующими радио модулями, которые мы попробовали стали rfm12. Для работы с ними существует бесплатная библиотека для AVR. В этой статье я опишу как использовать эти радио модули и опишу наш опыт их использования.

Аппаратная часть:

  1. Напряжение питания этой модели 2.2-3.6 вольта. Хотя в документации указано, что модуль может работать при напряжении 5 вольт, следует использовать порядка 3.3. Поэтому в случае, если контроллер запитан от 5 вольт необходимо приведение уровней.
  2. Доступны 2 варианта распиновки и исполнения:Хочу обратить внимание на следующее. Не знаю почему, но партия с уменьшенным кварцем SMD имела бракованные модули. Из 10 таких модулей не работала половина. С обычным кварцем проблем не было.
  3. Доступны варианты на частоты 433, 868, 915 МГЦ.  Внешняя антенна. Не стоит утруждаться, хватит провода в четверть длины волны, скрученного в катушку. Покупка SMD антенны не привела к увеличению дальности.
  4. SPI интерфейс.
  5. Распиновка:
  6. Фильтрующие конденсаторы на питание.
  7. Есть опция избегания колизий. Это означает, что анализируется уровень сигнала в эфире и при превышении определенного порога принимается решение о наличии в эфире передачи.
  8. Одно из лучших соотношений цена/качество.

Теперь о печальном, эти модули перестали возить в РФ. Их пока еще можно заказать на Украине на космодроме, но в той же Терре они не появляются больше года. Скорее всего, их сняли с производства.

Программная часть:

Чтобы проинициализировать радио модуль, необходимо вызвать:

rfm12_init( );

Также данная функция может быть полезна, если модуль завис и перестал принимать информацию. Через некоторое время после вызова этой функции модуль опять начинает работать корректно. У нас данная проблема возникала на одном из маяков навигационной системы мобильного робота при одновременной передаче данных по rfm12 и протоколу modbus через последовательный порт.
Чтобы передать данные по радио каналу, необходимо сначала их поместить во внутренний буфер библиотеки. И потом постепенно предавать на радио модуль rfm12. Для этого сначала вызовите:

rfm12_tx( ackPacket.getPacketLength( ), VAirPacket::RFM12_TYPE,  ackPacket );

Первый параметр – длина передаваемого пакета в байтах. Второй – тип пакета, параметр, используемый для внутреннего протокола передачи данных этой библиотеки. Третий параметр – сам передаваемый пакет.
Вызов rfm12_tx не передаст данные по радиоканалу. Он лишь поместит их во внутренний буфер. Чтобы пакет всё-таки передался, нужно в основном цикле программы или в прерывании постоянно вызывать:

rfm12_tick( );

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

if( rfm12_rx_status(  ) == STATUS_COMPLETE ) {

Если запись окончена, то узнаем длину принятого пакета:

     int read = rfm12_rx_len( );

Скопируем пакет из внутреннего буфера библиотеки:

     uint8_t buffer[ RFM12_RX_BUFFER_SIZE ];
     memcpy(buffer, rfm12_rx_buffer(), read);

Очистим внутренний буфер для приёма следующего пакета.

     rfm12_rx_clear( );
 
}

При передаче данных не устанавливается никаких соединений, поэтому данные передаются с одного радио модуля на все, которые ждут входящих данных.
В библиотеки предусмотрена возможность настройки режима работы перед компиляцией. Например, можно отключить разрешение коллизий. Для этого в файле rfm12_config.h найдите строчку:

#define RFM12_NOCOLLISIONDETECTION 0

И замените в ней 0 на 1.
Можно изменять размеры внутренних буферов для приёма и передачи. Эти параметры задаются в строчках:

//TX BUFFER SIZE
#define RFM12_TX_BUFFER_SIZE 30
//RX BUFFER SIZE (there are going to be 2 Buffers of this size for double_buffering)
#define RFM12_RX_BUFFER_SIZE 30

Также есть возможность изменения скорости передачи данных с контроллера на радио модуль (не по радиоканалу):

//use this for datarates >= 2700 Baud
#define DATARATE_VALUE RFM12_DATARATE_CALC_HIGH(57600.0)

В моём проекте радио модуль стабильно работал на скорости передачи максимум 57600 бод.
Это не все параметры доступные для настройки. За подробностями смотрите официальную документацию.
Rfm12 неплохие радио модули. Недорогое и надёжное решение. Но они оказались слишком медленными для навигационной системы мобильного робота. Во время их использования под них был адаптирован протокол с гарантией доставки, реализованный для радио модулей tr24.
При компиляции библиотеки для rfm12 у меня было достаточно много ошибок компилятора и линковщика, поэтому здесь выложена слегка подправленная версия. Возможно, она не самая свежая, но зато точно работает.

Скачать исправленную версию библиотеки.
Скачать протокол с гарантией доставки для радио модулей rfm12.

Leave a Reply

You must be logged in to post a comment.