→ Использование RF-модулей. Использование RF-модулей Технические параметры S2-LP

Использование RF-модулей. Использование RF-модулей Технические параметры S2-LP

На этом уроке мы решим задачу по передаче радиосигнала между двумя контроллерами Ардуино с помощью популярного приемопередатчика с частотой 433МГц. На самом деле, устройство по передаче данных состоит из двух модулей: приемника и передатчика. Данные можно передавать только в одном направлении. Это важно понимать при использовании этих модулей. Например, можно сделать дистанционное управление любым электронным устройством, будь то мобильный робот или, например, телевизор. В этом случае данные будут передаваться от пульта управления к устройству. Другой вариант — передача сигналов с беспроводных датчиков на систему сбора данных. Здесь уже маршрут меняется, теперь передатчик стоит на стороне датчика, а приемник на стороне системы сбора. Модули могут иметь разные названия: MX-05V, XD-RF-5V, XY-FST, XY-MK-5V, и т.п., но все они имеют примерно одинаковый внешний вид и нумерацию контактов. Также, распространены две частоты радиомодулей: 433 МГц и 315 МГц.

1. Подключение

Передатчик имеет всего три вывода: Gnd, Vcc и Data.
Подключаем их к первой плате Ардуино по схеме: Собираем оба устройства на макетной плате и приступаем к написанию программ.

2. Программа для передатчика

Для работы с радиомодулями воспользуемся библиотекой RCSwitch . Напишем программу, которая будет каждую секунду по-очереди отправлять два разных сообщения. #include RCSwitch mySwitch = RCSwitch(); void setup() { mySwitch.enableTransmit(2); } void loop() { mySwitch.send(B0100, 4); delay(1000); mySwitch.send(B1000, 4); delay(1000); } Разберем программу. Первое что мы сделали — объявили объект для работы с передатчиком и назвали его mySwitch. RCSwitch mySwitch = RCSwitch(); Затем, внутри стандартной функции setup включили передатчик и указали вывод, к которому он подключен: mySwitch.enableTransmit(2); Наконец, в основном цикле программы loop отправляем сначала одно сообщение, а затем и второе с помощью функции send : mySwitch.send(B1000, 4); Функция send имеет два аргумента. Первый — это отправляемое сообщение, которое будет отправляться в эфир в виде пачки импульсов. Второй аргумент — это размер отправляемой пачки. В нашей программе мы указали сообщения в формате двоичного числа. На это указывает английская буква «B» в начале кода B1000. В десятеричном представлении это число превратится в восьмерку. Так что мы могли вызвать функцию send так: mySwitch.send(8, 4); Также send умеет принимать двоичные строки: mySwitch.send("1000", 4);

3. Программа для приемника

Теперь напишем программу для приемника. Для демонстрации факта передачи мы будем зажигать светодиод, подключенный к выводу №3 на плате Ардуино. Если приемник поймал код B1000 — включим светодиод, а если B0100 — выключим. #include RCSwitch mySwitch = RCSwitch(); void setup() { pinMode(3, OUTPUT); mySwitch.enableReceive(0); } void loop() { if(mySwitch.available()){ int value = mySwitch.getReceivedValue(); if(value == B1000) digitalWrite(3, HIGH); else if(value == B0100) digitalWrite(3, LOW); mySwitch.resetAvailable(); } } Функция available возвращает истину, если передатчик принял хоть какие-то данные: mySwitch.available() Функция getReceivedValue извлекает из потока данных одну пачку и декодирует её в число. В программе мы присваиваем полученное число переменной value : int value = mySwitch.getReceivedValue();

Задания

Теперь можно попробовать потренироваться и сделать разные полезные устройства. Вот несколько идей.
  1. Пульт для светильника. На стороне приемника , включенный в цепь питания светильника (осторожно, 220 Вольт!). На стороне передатчика: . Написать программы для приемника и передатчика, которые по нажатию кнопки будут включать удаленное реле. При повторном нажатии кнопки реле будет выключаться.
  2. Уличный термометр с радиоканалом. На стороне передатчика разместить . Предусмотреть автономное питание от батареек. На стороне приемника: . Написать программы для приемника и передатчика, которые позволят выводить показания температуры с удаленного датчика на дисплее.

Заключение

Итак, теперь мы знаем простой и недорогой способ передавать данные на расстоянии. К сожалению, скорость передачи и дистанция в таких радиомодулях весьма ограничены, так что мы не сможем полноценно управлять, например квадрокоптером. Однако, сделать радиопульт для управления простым бытовым прибором: светильником, вентилятором или телевизором, нам под силу. На основе приемопередатчиков с частотой 433 МГц и 315 МГц работает большинство радиоканальных пультов управления. Имея Ардуино и приемник, мы можем декодировать сигналы управления и повторить их. Подробнее о том, как это сделать мы напишем в одном из следующих уроков!

Рано или поздно, в создаваемых проектах появится необходимость дистанционного управления. Одним из самых бюджетных решений является использование радиоприемника и радиопередатчика. Простейший пример их использования вы найдете в данной статье, а дальше все зависит только от ваших нужд и фантазии.

В первую очередь берем 2 платы Arduino и подключаем к ним приемник и передатчик, как показано на рисунке:

Компоненты для повторения (купить в Китае):

Перед тем как преступить к работе, нужно указать, что для полноценной работы, к модулям необходимо припаять антенну. Рекомендуемая длина антенны для передатчиков с частотой 433 МГц равна 17 см.

Библиотека необходимая для работы с модулем VirtualWire

Её необходимо распаковать и добавить в папку "libraries" в папке с Arduino IDE. Не забывайте перезагрузить среду, если на момент добавления IDEшка была открыта.

Пример программного кода

#include void setup (void ) { vw_set_ptt_inverted(true ); // Необходимо для DR3100 vw_setup(2000); // Устанавливаем скорость передачи (бит/с) } void loop (void ) { int number = 123; char symbol = "c" ; String strMsg = "z " ; strMsg += symbol; strMsg += " " ; strMsg += number; strMsg += " " ; char msg; strMsg.toCharArray(msg, 255); Serial .println (msg); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); // Ждем пока передача будет окончена delay (200); }

Разберем этот код для полного понимания.

Во первых мы формируем строку strMsg. Используем тип String, т.к. с ним проще работать (можно конкатенировать его с числами, используя оператор "+").

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

После этого преобразовываем тип String к стандартному массиву символов при помощи метода toCharArray и передаем его в команду vw_send .

Наш код будет отправлять строку "z c 123".

Перейдем к коду приемника:

Пример программного кода

// Тестировалось на Arduino IDE 1.0.1 #include void setup () { Serial .begin (9600); vw_set_ptt_inverted(true ); // Необходимо для DR3100 vw_setup(2000); // Задаем скорость приема vw_rx_start(); // Начинаем мониторинг эфира } void loop () { uint8_t buf; // Буфер для сообщения uint8_t buflen = VW_MAX_MESSAGE_LEN; // Длина буфера if (vw_get_message(buf, &buflen)) // Если принято сообщение { // Начинаем разбор int i; // Если сообщение адресовано не нам, выходим if (buf != "z" ) { return ; } char command = buf; // Команда находится на индексе 2 // Числовой параметр начинается с индекса 4 i = 4; int number = 0; // Поскольку передача идет посимвольно, то нужно преобразовать набор символов в число while (buf[i] != " " ) { number *= 10; number += buf[i] - "0" ; i++; } Serial .print (command); Serial .print (" " ); Serial .println (number); } }

Сообщение будет считано в буфер buf, который нужно разобрать.

В первую очередь проверяем наличие служебного символа "z", затем считываем код команды и затем преобразовываем строковое представление параметра в число.

Информация получена и разобрана, что делать дальше зависит от конкретной задачи.

В данной статье рассмотрен простейший вариант общения. В идеале нужно задуматься о кодировании передаваемой информации, т.к. её будут получать не только ваши приемники.

P.S. Работая с данными модулями, мы наткнулись на один не приятный подводный камень, а именно конфликт, невозможность работы с библиотекой "servo.h".

Радио модули: передатчик (FS1000A) и приёмник (MX-RM-5V) - предназначены для передачи данных по радиоканалу, на нелицензируемой частоте 433,920 МГц, лежащей в диапазоне LPD433 (Low Power Device) предназначенном для маломощных устройств.

Характеристики передатчика FS1000A

  • Рабочая частота: 433.920 МГц (указывается на металлическом корпусе модуля);
  • Дальность передачи: до 100 м (в зоне прямой видимости, без антенны);
  • Выходная мощность: до 40 мВт;
  • Напряжение питания: 3 ... 12 В;
  • Ток потребления в режиме ожидания: 0 мА;
  • Ток потребления в режиме передачи: 20 .. 30 мА;
  • Рабочая температура: -10 ... 70 °C;
  • Габариты: 19х19х8 мм;
  • Вес: 2 г;

Характеристики приёмника MX-RM-5V

  • Рабочая частота: 433.920 МГц (указывается в таблице на печатной плате, если это не шаблон 123456789);
  • Тип модуляции: ASK - амплитудная манипуляция;
  • Дальность приёма: до 100 м (в зоне прямой видимости, без антенны);
  • Напряжение питания: 5В;
  • Ток потребления: 4 мА;
  • Габариты 30х14х17 мм;
  • Вес: 4 г;

Подключение

Для удобства подключения к Arduino воспользуйтесь , или .

Передатчик подключается к любым выводам , а подключение приёмника зависит от типа используемой библиотеки:

  • При использовании библиотек , RemoteSwitch, RCSwitch, приёмник подключается только к выводу использующему внешнее прерывание. Но данные библиотеки не используют аппаратные таймеры, а значит не ограничивают Вас в использовании ШИМ.
  • При использовании библиотеки , приёмник подключается к любому выводу . Но библиотека использует первый аппаратный таймер, что накладывает ограничение на использование как данного таймера, так и его выводов ШИМ.

Питание

  • К выводам Vcc и GND передатчика, подаётся напряжение 2 ... 12 В постоянного тока.
  • К выводам Vcc и GND приёмника, подаётся напряжение 5 В постоянного тока.

Подробнее о модулях

  • Передатчик использует цифровой вход для передачи сигнала с использованием амплитудной манипуляции ASK (Amplitude Shift Keying). Амплитудная манипуляция (ASK) отличается от амплитудной модуляции (AM - amplitude modulation) тем, что модулировать можно любой сигнал (как цифровой, так и аналоговый), а манипулировать только цифровым.
  • Данные передаются по радиоканалу на расстоянии до 100 м в пределах прямой видимости (указано производителем)
  • Расстояние уверенного приёма можно увеличить, если подключить антенны к передатчику и приёмнику.
  • Приёмник имеет два, электрически соединённых, цифровых выхода (можно использовать любой). На выходе устанавливается уровень логической «1» при наличии несущей частоты в радиоканале и уровень логического «0» при её отсутствии.
  • В приёмнике реализован блок автоматической регулировки усиления (AGC - Automatic Gain Control) благодаря которому увеличивается дальность приёма, но при отсутствии сигнала от передатчика, на выходе приёмника наблюдаются хаотичные чередования логических уровней.
  • Приемник критичен даже к незначительным пульсациям на шине питания. Если таковые имеются, то приемник принимает их за информационный сигнал, усиливает и выводит на выход в виде логических уровней. Пульсации на шине питания могут вызывать такие устройства как: сервоприводы, LED индикаторы, устройства с собственными генераторами или использующие ШИМ и т.д.
  • Влияние пульсаций на приёмник можно снизить несколькими способами, вот некоторые из них:
    • Использовать, для питания Arduino, внешний источник, а не шину USB. Так как напряжение на выходе многих внешних источников питания контролируется или сглаживается. В отличии от шины USB, где напряжение может существенно «проседать».
    • Установить на шине питания приёмника сглаживающий конденсатор.
    • Использовать отдельное стабилизированное питание для приёмника.
    • Использовать отдельное питание для устройств вносящих пульсации в шину питания.

Антенны

Первый усилитель любого приёмника и последний усилитель любого передатчика, это антенна. Самая простая антенна - штыревая (отрезок провода определённой длины). Длина антенны (как приёмника, так и передатчика), должна быть кратна четверти длины волны несущей частоты. То есть, штыревые антенны, бывают четвертьволновые (L/4), полуволновые (L/2) и равные длине волны (1L).

На том же Aliexpress нашел недорогие радиомодули. Небольшие платы (не больше 2-3 см) с распаянными на них передатчиком и приемником диапазона 315МГц или 433МГц (указываем при заказе). В пересчете на один модуль цена получается 20-25 рублей. Юго-восточные соседи именуют данные конструкции так: RF wireless receiver module & transmitter module board.

Оказалось - очень интересные и полезные устройства для решения задачи передачи небольшого объема данных на короткие расстояния (в пределах 10-20 метров). Продаются, как правило, комплектами: передатчик + приемник.

Вроде бы радиопередатчик, но согласно «Перечня радиоэлектронных средств, для которых не требуется разрешений на использование», устройства дистанционного управления охранной сигнализации и оповещения в диапазоне 315/433МГц ±0,2% с выходной мощностью до 10 мВт могут эксплуатироваться без специальной регистрации. Радиочастотные модули очень просты в применении - для включения модуля достаточно подать питание, передаваемые данные и подключить антенну.

Такие модули широко распространены в бытовой технике. Они применяются, например в схемах: дистанционного управления люстрой, беспроводного дверного звонка и т.д.

Передатчик

Приемник

Радиомодуль приемника собран на печатной плате несколько большего размера 15х30мм по примерной схеме показанной на рисунке слева (схемка взята отсюда). За совпадение изображенного с оригиналом не ручаюсь, но общий принцип работы из рисунка ясен: есть транзисторный приемник ВЧ сигнала, к выходу которого через ФНЧ подключен компаратор на операционном усилителе. Таким образом, при наличии сигнала на входе приемника в указанном диапазоне, на выходе получаем "единицу", при отсутствии сигнала - "ноль". Приемник, имевшийся в моем распоряжении, несколько отличается от приведенной схемы. В частности, подстройка частоты производится не конденсатором, а индуктивностью (см фото), а выход операционного усилителя прямо подключен к линии DATA.

Примерные параметры устройства (по данным продавца с вышеуказанного сайта):

  • Питание (VCC) +5В.
  • Потребляемый ток не замерял, обещают - не выше 4мА.
  • Чувствительность приемника обещают на уровне 5мкВ...
Простейший вид модуляции (ООК) обладает рядом недостатков, главный из которых - низкая помехоустойчивость. Во время передачи лог. «О» передатчик не излучает несущей, и любая помеха на рабочей частоте приведет к наличию сигнала лог. «1» на выходе приемника. Без применения кодеров/декодеров использовать радиомодули, практически, невозможно. Действительно, осциллограмма сигнала на выходе приемника в отсутствии излучения передатчика представляет собой "хаотическое" появление лог."1".
Подключение модуля: GND - общий провод питания, VCC - питание приемника, DATA - выход приемника - можно трактовать как TTL сигнал и подавать его на вход микроконтроллера. К выводу ANT подключается антенна, в качестве которой можно оспользовать "четверть-волновый штырь" - отрезок провода 17см для диапазона 433МГц (но можно и подлиннее что-нибудь прицепить).

Fun fact! Существуют другие, но совместимые передатчики на 433 МГц, в частности раз и два . Кроме того, есть и альтернативный приемник . Но он не вполне совместим, так как на выходе всегда выдает какой-то сигнал, независимо от того, осуществляется ли реально сейчас передача, или нет.

Для своих экспериментов я также использовал купленный на eBay пульт от гаража с внутренним DIP-переключателем:

При некотором везении такие пульты все еще можно найти как на eBay, так и на AliExpress по запросу вроде «garage door opener 433mhz with dip switch». Но в последнее время их вытесняют «программируемые» пульты, умеющие принимать и копировать сигнал других пультов. Доходит вплоть до того, что продавцы высылают пульты без DIP-переключателя даже в случае, если он явно изображен на представленном ими фото и указан в описании товара. Полагаться на внешнюю схожесть пульта с тем, что использовал я, также не стоит. Впрочем, если вы решите повторить шаги из этой заметки, наличие или отсутствие DIP-переключателя не сыграет большой роли.

Модули крайне просто использовать в своих проектах:

Как приемник, так и передатчик, имеет пины VCC, GND и DATA. У приемника пин DATA повторяется дважды. Питаются модули от 5 В. На фото слева собрана схема, в который светодиод подключен к пину DATA приемника. Справа собрана схема с передатчиком, чей пин DATA подключен к кнопке и подтягивающему резистору. Плюс в обоих схемах используется стабилизатор LM7805. Проще некуда.

Запишем сигнал при помощи Gqrx и откроем получившийся файл в Inspectrum:

Здесь мы видим такие же короткие и длинные сигналы, что нам показал осциллограф. Кстати, такой способ кодирования сигнала называется On-Off Keying . Это, пожалуй, самый простой способ передачи информации при помощи радиоволн, который только можно вообразить.

Запускаем, и на Scope Plot видим:

Практически такой же сигнал, что нам показал осциллограф!

Как видите, копеечные радиомодули на 433 МГц дают нам огромный простор для творчества. Их можно использовать не только друг с другом, но и со многими другими устройствами, работающими на той же частоте. Можно вполне успешно использовать их в чисто аналоговых устройствах без какого-либо микроконтроллера, например, с таймером 555 . Можно реализовывать собственные протоколы с чексуммами, сжатием, шифрованием и так далее, безо всяких ограничений, скажем, на длину пакета, как у NRF24L01 . Наконец, модули прекрасно подходят для broadcast посылки сообщений.

А какие потрясающие применения этим радиомодулям приходят вам на ум?

Дополнение: Также вас могут заинтересовать посты

 

 

Это интересно: