Arduino – передача данных по радиоканалу на частоте 433.920 МГц
GeekElectronics » Arduino от А до Я » Arduino – передача данных по радиоканалу на частоте 433.920 МГц
В этой статье я постараюсь подробно описать процесс организации передачи данных между контролерами Arduino по радиоканалу с использованием передатчика MX-F01 и приемника MX-RM-5V.
Эти модули планирую использовать в своей умной метеостанции, чтобы избавиться от лишних проводов.
Для начала, давайте познакомимся с железом.
Технические характеристики передатчик MX-F01
- Напряжение питания: 3-12 В
- Ток потребления в режиме ожидания: 0 мА
- Ток потребления в режиме передачи: 20-28 мА
- Рабочая частота: 433.920 МГц (Есть на частоту 315 МГц)
- Выходная мощность передатчика: 40 мВт
- Дальность передачи: до 500 м в зоне прямой видимости с дополнительной антенной длинной 17,5, 35 или 70 см
- Тип модуляции: амплитудная
- Температурный диапазон: –10…+70 °C
- Размеры: 19х19х8 мм
Назначение выводов передатчика MX-F01
- ATAD — данные
- VCC — питание «+»
- GND — питание «-«
- ANT — антенна
Технические характеристики приемника MX-RM-5V
- Напряжение питания: 5 В
- Ток потребления: 4 мА
- Рабочая частота: 433.920 МГц (Есть на частоту 315 МГц)
- Размеры: 30х14х7 мм
Назначение выводов приемника MX-RM-5V
- GND — питание «-«
- DATA — данные
- VCC — питание «+»
- ANT — антенна
Базовую информацию получили – пора приступать к практической части.
Подключение передатчика MX-F01 к Arduino
Для управления передатчиком MX-F01 я буду использовать Arduino Mega 2560.
Приступим к подключению:
- ATAD на MX-F01 подключаем к 12 дискретному выводу Arduino Mega 2560
- VCC на MX-F01 подключаем к +5V Arduino Mega 2560
- GND на MX-F01 подключаем к GND Arduino Mega 2560
- ANT на MX-F01 к антенне в виде куска провода длинной 17,5, 35 или 70 см (я пока антенну не припаивал)
Подключение приемника MX-RM-5V к Arduino
Для управления приемником я буду использовать Arduino Nano ATmega328.
- DATA на MX-RM-5V подключаем к 12 дискретному выводу Arduino Nano ATmega328
- VCC на MX-RM-5Vподключаем к +5V Arduino Nano ATmega328
- GND на MX-RM-5V подключаем к GND Arduino Nano ATmega328
- ANT на MX-RM-5V к антенне в виде куска провода длинной 17,5, 35 или 70 см (я пока антенну не припаивал)
Библиотека VirtualWire
Чтобы упростить написания кода для работы с радиомодулями, была создана библиотека: VirtualWire.
VirtualWire.rar (17,3 KiB, 5 630 hits)
Распакуйте содержимое архива в папку /libraries/, которая находится в каталоге среды разработки Arduino.
Примеры кода для работы с передатчиком MX-F01 с использованием библиотеки VirtualWire
Пример 1
Данный скетч будет отправлять раз в секунду сообщение «Hello World». Для наглядности, в начале передачи будет загораться светодиод, а после окончания – гаснуть.
const int led_pin = 13; // Пин светодиода
const int transmit_pin = 12; // Пин подключения передатчика
void setup()
<
vw_set_tx_pin(transmit_pin);
vw_setup(2000); // Скорость передачи (Бит в секунду)
pinMode(led_pin, OUTPUT);
>
void loop()
<
const char *msg = «Hello World»; // Передаваемое сообщение
digitalWrite(led_pin, HIGH); // Зажигаем светодиод в начале передачи
vw_send((uint8_t *)msg, strlen(msg)); // Отправка сообщения
vw_wait_tx(); // Ожидаем окончания отправки сообщения
digitalWrite(led_pin, LOW); // Гасим светодиод в конце передачи
delay(1000); // Пауза 1 секунда
>
Пример 2
Данный скетч будет отправлять раз в секунду сообщение, которое содержит количество миллисекунд, прошедшее с момента начала выполнения текущей программы. Для наглядности, в начале передачи будет загораться светодиод, а после окончания – гаснуть.
const int led_pin = 13; // Пин светодиода
const int transmit_pin = 12; // Пин подключения передатчика
void setup()
<
vw_set_tx_pin(transmit_pin);
vw_setup(2000); // Скорость передачи (Бит в секунду)
pinMode(led_pin, OUTPUT);
>
void loop()
<
digitalWrite(led_pin, HIGH); // Зажигаем светодиод в начале передачи
String millisresult = String(millis()); // Присваиваем переменной значение, равное количеству миллисекунд с момента начала выполнения текущей программы
char msg[14];
millisresult.toCharArray(msg, 14);
vw_send((uint8_t *)msg, strlen(msg)); // Отправка сообщения
vw_wait_tx(); // Ожидаем окончания отправки сообщения
digitalWrite(led_pin, LOW); // Гасим светодиод в конце передачи
delay(1000); // Пауза 1 секунда
>
Пример кода для работы с приемником MX-RM-5V с использованием библиотеки VirtualWire
byte message[VW_MAX_MESSAGE_LEN]; // Буфер для хранения принимаемых данных
byte messageLength = VW_MAX_MESSAGE_LEN; // Размер сообщения
const int led_pin = 13; // Пин светодиода
const int receiver_pin = 12; // Пин подключения приемника
void setup()
<
Serial.begin(9600); // Скорость передачиданных
Serial.println(«MX-RM-5V is ready»);
vw_set_rx_pin(receiver_pin); // Пин подключения приемника
vw_setup(2000); // Скорость передачи данных (бит в секунду)
vw_rx_start(); // Активация применика
>
void loop()
<
if (vw_get_message(message, &messageLength)) // Если есть данные..
<
digitalWrite(led_pin, HIGH); // Зажигаем светодиод в начале приема пакета
for (int i = 0; i
Для “Пример 2” кода передатчика
Не забудьте припаять антенны, а то без них дальность передачи будет всего несколько сантиметров.
На этом пока все.
Частота 433.920 МГц выделена для работы маломощных цифровых передатчиков таких как: радиобрелки автосигнализаций, брелки управления шлагбаумами на стоянках и другие подобные системы.
- Автор: source
- Миниатюра:
- Рубрика: Arduino от А до ЯArduino, MX-F01, MX-RM-5V, VirtualWire, передатчик, приемник —>
- Опубликовано: 05.02.2022
- Обновлено: 05.02.2022
- Комментариев: 7
- Просмотров: 72 592 searchПоисковые боты
Похожие записи
Комментариев: 7
Для “Пример 2” кода передатчика
у меня происходит странное явление. После увеличения разрядности счетчика (было 99ххх стало 100ххх) число полученных знаков остается старым (в нашем примере 5) и младший разряд не получается.
После перезагрузки приемника начинаем принимать 6 разрядов но при следующем увеличении разрядности история повторяется.
Хуже дело обстоит с перезагрузкой передатчика. Приемник принимает только 1 знак (думаю это связано с тем что время после включения =0 и первый раз передается только 1 знак)
Далее к передаче прибавляю текст и в начало и в конец. Получаю строку «HI 99123 LO». Проблема сохраняется — при увеличении длины переданной строки начинает резать последний символ.
Нашел ошибку
void loop()
<
if (vw_get_message(message, &messageLength)) // Если есть данные..
messageLength получает длину полученной строки. а в следующем цикле мы ее передаем как размер буфера (размер message) . в начале цикла надо заново инициализировать эту переменную
messageLength = VW_MAX_MESSAGE_LEN;
А можно как то без использования Arduino передать сигнал на приемник что бы при этом на приемнике светился светодиод?
К сожалению, без дополнительного контроллера не получится.
Урок 26.6 Соединяем две arduino по радиоканалу 433 МГц
При создании некоторых проектов, требуется разделить выполняемые задачи между несколькими arduino.
В этом уроке мы научимся соединять две Arduino по радиоканалу, на частоте 433,920 МГц, используя радио модули FS1000A и MX-RM-5V , на расстоянии до 100 м. Данное расстояние можно увеличить, припаяв антенны к передатчику (FS1000A) и приёмнику (MX-RM-5V), см. схему подключения.
Преимущества:
- Отсутствие проводов между Arduino.
- Простота подключения. Рассматриваемые модули, в отличии от nRF24L01+, питаются от напряжения 5 В.
- Доступность. Радио модули выпускаются множеством производителей, в различном исполнении и являются взаимозаменяемыми.
Недостатки:
- На частоте 433,920 МГц работают множество других устройств (радио люстры, радио розетки, радио брелки, радио модели и т.д.), которые могут «глушить» передачу данных между радио модулями.
- Отсутствие обратной связи. Модули разделены на приёмник и передатчик. Таким образом, в отличии от модуля nRF24L01+, приемник не может отправить передатчику, сигнал подтверждения приёма.
- Низкая скорость передачи данных, до 5 кбит/сек.
- Приёмник MX-RM-5V критичен даже к небольшим пульсациям на шине питания. Если Arduino управляет устройствами вносящими даже небольшие, но постоянные, пульсации в шину питания (сервоприводы, LED индикаторы, ШИМ и т.д.), то приёмник расценивает эти пульсации как сигнал и не реагирует на радиоволны передатчика. Влияние пульсаций на приёмник можно снизить одним из способов:
- Использовать, для питания Arduino, внешний источник, а не шину USB. Так как напряжение на выходе многих внешних источников питания контролируется или сглаживается. В отличии от шины USB, где напряжение может существенно «проседать».
- Установить на шине питания приёмника сглаживающий конденсатор.
- Использовать отдельное стабилизированное питание для приёмника.
- Использовать отдельное питание для устройств вносящих пульсации в шину питания.
Нам понадобится:
- Радио модули FS1000A и MX-RM-5V х 1 комплект.
- Arduino х 2шт.
- Trema Shield х 2шт.
- Trema Slider х 1шт.
- Trema потенциометр х 1шт.
- Trema четырехразрядный LED индикатор х 1шт.
- Trema светодиод (красный, оранжевый, зелёный, синий или белый) x 1шт.
- Набор проводов «мама-мама» для подключения радио модулей х 1 комплект.
Для реализации проекта нам необходимо установить библиотеки:
- Библиотека iarduino_RF433 (для работы с радио модулями FS1000A и MX-RM-5V).
- Библиотека iarduino_4LED, (для работы с Trema четырехразрядным LED индикатором).
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE .
Антенна:
Первый усилитель любого приёмника и последний усилитель любого передатчика, это антенна. Самая простая антенна — штыревая (отрезок провода определённой длины). Длина антенны (как приёмника, так и передатчика), должна быть кратна четверти длины волны несущей частоты. То есть, штыревые антенны, бывают четвертьволновые (L/4), полуволновые (L/2) и равные длине волны (1L).
Длинна радиоволны вычисляется делением скорости света (299’792’458 м/с) на частоту (в нашем случае 433’920’000 Гц).
L = 299’792’458 / 433’920’000 = 0,6909 м = 691 мм.
Таким образом длина антенн для радио модулей на 433,920 МГц может быть: 691 мм (1L), 345 мм (L/2), или 173 мм (L/4). Антенны припаиваются к контактным площадкам, как показано на схеме подключения.
Видео:
Схема подключения:
Радиопередатчик подключён к выводу D12 (можно подключить к любому выводу Arduino). Радиоприёмник подключён к выводу D2 (при работе с библиотекой iarduino_RF433, его можно подключить только к выводам использующим внешние прерывания). Trema четырехразрядный LED индикатор подключён к цифровым выводам D6 и D7 (можно подключить к любым выводам Arduino). Светодиод подключён к цифровому выводу D11 (для изменения яркости нужны выводы, которые используют ШИМ). Trema потенциометр и слайдер подключены к аналоговым входам A1 и A0 (можно подключить к любым аналоговым входам).
У радиоприёмника имеются два выхода DATA, они электрически соединены между собой, так что Вы можете использовать любой выход.
Приёмник MX-RM-5V критичен даже к небольшим пульсациям на шине питания (см. раздел недостатки).
Для питания Arduino, используйте внешний источник питания, а не шину USB.
Библиотека iarduino_RF433 (а также библиотеки RemoteSwitch и RCSwitch) , в отличии от библиотеки VirtualWire, использует не аппаратный таймер, а внешнее прерывание. Это даёт возможность использовать другие библиотеки использующие первый аппаратный таймер и использовать любые выводы ШИМ, но радиоприёмник можно подключить только к тем выводам, которые используют внешнее прерывание:
Плата Arduino | Выводы использующие внешнее прерывание |
---|---|
Uno, ProMini, Nano, Ethernet | 2, 3 |
Leonadro, Micro | 2, 3, 0, 1, 7 |
Mega 2560 | 2, 3, 18, 19, 20, 21 |
Due | Любые выводы |
Алгоритм работы:
Передатчик:
При старте (в коде setup) скетч настраивает работу радиопередатчика, указывая скорость передачи данных и номер трубы. После чего, постоянно (в коде loop), считывает показания с Trema потенциометра и Trema слайдера, сохраняя их в массив data, и отправляет его радиопередатчику.
Приёмник:
При старте (в коде setup) скетч настраивает работу радиоприёмника, указывая те же параметры что и у передатчика, а также инициирует работу с LED индикатором. После чего, постоянно (в коде loop), проверяет нет ли в буфере данных, принятых радиоприёмником. Если данные есть, то они читаются в массив data, после чего значение 0 элемента (показания Trema слайдера) выводится на LED индикатор, а значение 1 элемента (показания Trema потенциометра) преобразуются и используется для установки яркости светодиода.
Код программы:
Передатчик:
Приемник:
Проверка модулей:
Работоспособность приёмника и передатчика можно проверить на одной плате Arduino. Для этого подключите приёмник к выводу D3, а передатчик к выводу D4 и загрузите скетч «check» из примеров библиотеки iarduino_RF433.