Передача данных по радиоканалу arduino

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.

Источник

Adblock
detector