Главная chevron_right Наши уроки chevron_right Arduino chevron_right Урок 26.6 Соединяем две arduino по радиоканалу 433 МГц

Урок 26.6 Соединяем две arduino по радиоканалу 433 МГц

Подключаем радиомодули FS1000A и MX-RM-5V к двум Arduino и передаём данные по радиоканалу 433 МГц на расстояние до 100 м с помощью библиотеки iarduino_RF433

Видео-обложка запускается при наведении

При создании некоторых проектов, требуется разделить выполняемые задачи между несколькими 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, где напряжение может существенно «проседать». Установить на шине питания приёмника сглаживающий конденсатор. Использовать отдельное стабилизированное питание для приёмника. Использовать отдельное питание для устройств вносящих пульсации в шину питания.

Нам понадобится:

Для реализации проекта нам необходимо установить библиотеки:

  • Библиотека 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.

Схема соединения двух Arduino по радиоканалу

Библиотека iarduino_RF433 (а также библиотеки RemoteSwitch и RCSwitch), в отличии от библиотеки VirtualWire, использует не аппаратный таймер, а внешнее прерывание. Это даёт возможность использовать другие библиотеки использующие первый аппаратный таймер и использовать любые выводы ШИМ, но радиоприёмник можно подключить только к тем выводам, которые используют внешнее прерывание:

Плата ArduinoВыводы использующие внешнее прерывание
Uno, ProMini, Nano, Ethernet2, 3
Leonardo, Micro2, 3, 0, 1, 7
Mega 25602, 3, 18, 19, 20, 21
DueЛюбые выводы

Алгоритм работы:

Передатчик:

При старте (в коде setup) скетч настраивает работу радиопередатчика, указывая скорость передачи данных и номер трубы. После чего, постоянно (в коде loop), считывает показания с Trema потенциометра и Trema слайдера, сохраняя их в массив data, и отправляет его радиопередатчику.

Приёмник:

При старте (в коде setup) скетч настраивает работу радиоприёмника, указывая те же параметры что и у передатчика, а также инициирует работу с LED индикатором. После чего, постоянно (в коде loop), проверяет нет ли в буфере данных, принятых радиоприёмником. Если данные есть, то они читаются в массив data, после чего значение 0 элемента (показания Trema слайдера) выводится на LED индикатор, а значение 1 элемента (показания Trema потенциометра) преобразуются и используется для установки яркости светодиода.

Код программы:

Передатчик:

#include <iarduino_RF433_Transmitter.h>                   // Подключаем библиотеку для работы с передатчиком FS1000A
iarduino_RF433_Transmitter radio(12);                     // Создаём объект radio для работы с библиотекой iarduino_RF433, указывая номер вывода к которому подключён передатчик
int                        data[2];                       // Создаём массив для передачи данных
void setup(){
    radio.begin();                                        // Инициируем работу передатчика FS1000A (в качестве параметра можно указать скорость ЧИСЛО бит/сек, тогда можно не вызывать функцию setDataRate)
    radio.setDataRate     (i433_1KBPS);                   // Указываем скорость передачи данных (i433_5KBPS, i433_4KBPS, i433_3KBPS, i433_2KBPS, i433_1KBPS, i433_500BPS, i433_100BPS), i433_1KBPS - 1кбит/сек
    radio.openWritingPipe (5);                            // Открываем 5 трубу для передачи данных (передатчик может передавать данные только по одной из труб: 0...7)
}                                                         // Если повторно вызвать функцию openWritingPipe указав другой номер трубы, то передатчик начнёт передавать данные по вновь указанной трубе
void loop(){
    data[0] = analogRead(A1);                             // считываем показания Trema слайдера с вывода A1 и записываем их в 0 элемент массива data
    data[1] = analogRead(A2);                             // считываем показания Trema потенциометра с вывода A2 и записываем их в 1 элемент массива data
    radio.write(&data, sizeof(data));                     // отправляем данные из массива data указывая сколько байт массива мы хотим отправить
    delay(10);                                            // пауза между пакетами
}

Скачать

Приемник:

#include <iarduino_RF433_Receiver.h>                      // Подключаем библиотеку для работы с приёмником MX-RM-5V
#include <iarduino_4LED.h>                                // Подключаем библиотеку для работы с четырёхразрядным LED индикатором
iarduino_RF433_Receiver radio(2);                         // Создаём объект radio для работы с библиотекой iarduino_RF433, указывая номер вывода к которому подключён приёмник (можно подключать только к выводам использующим внешние прерывания)
iarduino_4LED           dispLED(6,7);                     // Создаём объект dispLED для работы с функциями библиотеки iarduino_4LED, с указанием выводов дисплея ( CLK , DIO )
int                     data[2];                          // Создаём массив для приёма данных
const uint8_t           pinLED=11;                        // Создаём константу с указанием вывода ШИМ к которому подключён светодиод
void setup(){
    dispLED.begin();                                      // Инициируем работу LED индикатора
    radio.begin();                                        // Инициируем работу приёмника MX-RM-5V (в качестве параметра можно указать скорость ЧИСЛО бит/сек, тогда можно не вызывать функцию setDataRate)
    radio.setDataRate     (i433_1KBPS);                   // Указываем скорость приёма данных (i433_5KBPS, i433_4KBPS, i433_3KBPS, i433_2KBPS, i433_1KBPS, i433_500BPS, i433_100BPS), i433_1KBPS - 1кбит/сек
    radio.openReadingPipe (5);                            // Открываем 5 трубу для приема данных (если вызвать функцию без параметра, то будут открыты все трубы сразу, от 0 до 7)
//  radio.openReadingPipe (2);                            // Открываем 2 трубу для приёма данных (таким образом можно прослушивать сразу несколько труб)
//  radio.closeReadingPipe(2);                            // Закрываем 2 трубу от  приёма данных (если вызвать функцию без параметра, то будут закрыты все трубы сразу, от 0 до 7)
    radio.startListening  ();                             // Включаем приемник, начинаем прослушивать открытую трубу
//  radio.stopListening   ();                             // Выключаем приёмник, если потребуется
}
void loop(){
    if(radio.available()){                                // Если в буфере имеются принятые данные
        radio.read(&data, sizeof(data));                  // Читаем данные в массив data и указываем сколько байт читать
        dispLED.print(data[0]);                           // Выводим показания Trema слайдера на индикатор
        analogWrite(pinLED, map(data[1],0,1023,0,255));   // Устанавливаем яркость свечения светодиода в соответствии с углом поворота Trema потенциометра
    }                                                     // Если вызвать функцию available с параметром в виде ссылки на переменную типа uint8_t, то мы получим номер трубы, по которой пришли данные (см. урок 26.5)
}

Скачать

Проверка модулей:

Работоспособность приёмника и передатчика можно проверить на одной плате Arduino. Для этого подключите приёмник к выводу D3, а передатчик к выводу D4 и загрузите скетч «check» из примеров библиотеки iarduino_RF433.

Ссылки:

Комплект для повторения проекта

Что понадобится

Это быстрый ориентир по основным модулям и деталям. Полный список для повторения проекта смотрите в самой статье.

11 позиций
Беспроводной передатчик + приемник 433Mhz Для передачи данных по радиоканалу, на нелицензируемой частоте 433,920 МГц, лежащей в диапазоне LPD433 (Low Power Device) предназначенном для маломощных устройств. Открыть в iArduino Радиомодуль nRF24L01+ 2,4 GHz Приёмопередатчик для обмена данными по воздуху на частоте 2,4 ГГц с дальностью связи до 100 метров Открыть в iArduino Trema Shield Плата расширения для удобного подключения периферийных устройств Открыть в iArduino Потенциометр v2 (Trema-модуль) Сенсор для настройки скорости вращения двигателя, угол поворота сервопривода, яркости светодиода и т.д. Открыть в iArduino Четырехразрядный индикатор LED, красный (Trema-модуль) Яркий индикатор, отлично подойдет для проектов где нужно выводить цифровые значения. Имеет программную регулировку яркости Открыть в iArduino Светодиод - красный (Trema-модуль) красный Открыть в iArduino Светодиод - оранжевый (Trema-модуль) оранжевый Открыть в iArduino Светодиод - зеленый (Trema-модуль) зелёный Открыть в iArduino Светодиод - синий (Trema-модуль) синий Открыть в iArduino Светодиод - белый (Trema-модуль) Удобно использовать в качестве светового индикатора Открыть в iArduino Соединительные силиконовые провода «мама-мама» (20 шт. / 20 см) Пучок из 20 мягких силиконовых проводов «мама-мама» длиной 20 см для прототипирования электронных устройств Открыть в iArduino
Все уроки Arduino