В этой статье я постараюсь подробно описать процесс организации передачи данных между контролерами 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 КиБ, 6 137 hits)
Распакуйте содержимое архива в папку /libraries/, которая находится в каталоге среды разработки Arduino.
Примеры кода для работы с передатчиком MX-F01 с использованием библиотеки VirtualWire
Пример 1
Данный скетч будет отправлять раз в секунду сообщение "Hello World". Для наглядности, в начале передачи будет загораться светодиод, а после окончания – гаснуть.
#include <VirtualWire.h>
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
Данный скетч будет отправлять раз в секунду сообщение, которое содержит количество миллисекунд, прошедшее с момента начала выполнения текущей программы. Для наглядности, в начале передачи будет загораться светодиод, а после окончания – гаснуть.
#include <VirtualWire.h>
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
#include <VirtualWire.h>
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 < messageLength; i++)
{
Serial.write(message[i]); // выводим их в одной строке
}
Serial.println();
digitalWrite(led_pin, LOW); // Гасим светодиод в конце
}
}
Результат работы
Для “Пример 1” кода передатчика
Для “Пример 2” кода передатчика
Не забудьте припаять антенны, а то без них дальность передачи будет всего несколько сантиметров.
На этом пока все.
P.S.
Частота 433.920 МГц выделена для работы маломощных цифровых передатчиков таких как: радиобрелки автосигнализаций, брелки управления шлагбаумами на стоянках и другие подобные системы.
Для “Пример 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 передать сигнал на приемник что бы при этом на приемнике светился светодиод?
К сожалению, без дополнительного контроллера не получится.
Большое спасибо за статью. Все получилось. Дополнительно отправил дату и время с DS3231. Работает!!! Хочу сделать контроль температуры и влажности подвала гаража и приделать датчик движения. Нужно передавать не стринг а данные в цифра, чтобы вести лог с записью на SD.
Есть ли скетч для управления через эти радиомодули сервоприводом?
АТАД ???? то есть ты не понял что это Китаёзы слово Дата перевернули случайно?