Если нужна беспроводная передача данных и в то же время не хочется самостоятельно городить радиоканал, то проще всего воспользоваться готовыми радиомодулями коих сейчас выпускается великое множество. Частоты, мощности и цены у радиомодулей самые разные. Для моей задачи дальность была не сильно критична, и я взял на пробу парочку бюджетных радиомодулей TR24a. О них в интернете пишут самые противоречивые мнения. У кого-то дальность связи 6 метров, у кого то под 60 метров. Короче я решил провести независимое расследование :-)

Выпускает такие девайсы компания Spirit-ON. Основой служит чип  EM198810A. Первое впечатление после того как взял радиомодуль в руки — типичный Китай. Флюс не смыт, пайка хреновая. Ну понятное дело, чего же еще хотеть за 4 бакса то! Характеристики вполне соответствуют цене:

  • диапазон частот: 2400 МГц — 2482 МГц
  • 81 канал
  • Выходная мощность: +2дБм
  • Чувствительность: −85дБм
  • Напряжение питания 2.5В — 3.7в
  • Ток потребления при передаче — 26 мА
  • Ток потребления при приёме — 25 мА
  • Ток потребления в режиме сна — 3.5 мка
  • SPI интерфейс

Так же есть еще одна приятна особенность — антенна сделана в виде проводника на плате и подключать внешнюю не требуется.

Софт

Для работы с данным трансивером была написана небольшая библиотека на микропаскале. Она состоит из следующих функций и процедур:

RESET() — выполняет сброс трансивера. Перед сбросом происходит настройка пинов порта на котором висит трансивер. Для того чтоб программа знала что к чему подключено используются конструкции такого вида:

//вывод RESET трансивера подключен к нулевому биту порта B
RF_RESET : sbit at PORTB0_bit; //Непосредственно сам бит 0 порта B
RF_RESET_DIR :sbit at DDB0_bit; //А это бит 0 регистра DDRB

Выводы MISO, MOSI, SCK трансивера всегда подключаются к одноименным выводам микроконтроллера

InitTR24A() — инициализирует трансивер. В случае успешной инициализации функция возвращает единицу, а в случае если инициализация не удалась — ноль.

WriteReg(Adr:byte ; dat:word) — записывает в регистр Adr данные из dat

ReadReg(Adr:byte) — функция возвращает значение регистра по адресу Adr

GetMode() — Функция возвращает текущий режим работы трансивера:

0 — Режим простоя
1 — Режим передачи
2 — Режим приёма

SetMode(mode:byte) — задает режим работы трансивера. Коды режимов работы см. выше.

SetChanel(ch:byte) — процедура задает канал на котором работает трансивер. Номер канала может принимать значения от 0 до 80.

SendData(var DataBuf:array[1..64] of byte ) — Процедура запускает передачу данных. Данные нужно поместить в массив из 64 байт и передать в процедуру

ReceiveData(var DataBuf:array[1..64] of byte) — Процедура считывает то что принял трансивер. В процедуру нужно передать массив из 64 байт. в него запишутся данные

Как работать с трансивером

1) Копируем все функции и процедуры в свой проект.

2) Определяем к каким выводам подключен трансивер.

3) Инициализируем SPI

4) Сбрасываем трансивер

5) Инициализируем трансивер

6) Задаем номер канала

Если мы хотим передать данные то:

7) Задаем режим передачи

8) Вызываем процедуру передачи

Если мы ожидаем получения данных то:

7) Задаем режим прёма

8) Периодически проверяем режим работы трансивера. Если он изменился с режима приёма на режим простоя то значит мы что-то получили и можно вызывать  ReceiveData для считывания данных

Тест на дальность

Результаты надо сказать хреновые. В пределах комнаты ловит везде. За кирпичной стеной почти сразу затыкается.  Данные приходят без ошибок или не приходят вообще.  Возможно вам удастся добиться лучших результатов.

Выводы

Использовать такие модули для передачи данных на малые расстояния вполне возможно. Если нужно посылать данные подальше, то лучше купить радиомодули на пару баксов подороже.

Скачать библиотеку + документацию