Андрей Смирнов
Время чтения: ~12 мин.
Просмотров: 35

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

1584c141ece16b449855c5f8b94663ab.jpg

При создании некоторых проектов, требуется разделить выполняемые задачи между несколькими 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, они электрически соединены между собой, так что Вы можете использовать любой выход.

9afe95b4b22dcdb38287e1a1f4e52a77.jpg

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

Ссылки:

  • Код программы передатчика.
  • Код программы приёмника.
  • Библиотека iarduino_RF433.
  • Библиотека iarduino_4LED.
  • Wiki — Установка библиотек в Arduino IDE.
  • Wiki — Четырёхразрядный индикатор (Trema-модуль).
  • Wiki — Trema Shield.

На этом уроке мы решим задачу по передаче радиосигнала между двумя контроллерами Ардуино с помощью популярного приемопередатчика с частотой 433МГц.

На самом деле, устройство по передаче данных состоит из двух модулей: приемника и передатчика. Данные можно передавать только в одном направлении. Это важно понимать при использовании этих модулей.

RD-RF5-433-1024x768.jpg

Например, можно сделать дистанционное управление любым электронным устройством, будь то мобильный робот или, например, телевизор. В этом случае данные будут передаваться от пульта управления к устройству. Другой вариант — передача сигналов с беспроводных датчиков на систему сбора данных. Здесь уже маршрут меняется, теперь передатчик стоит на стороне датчика, а приемник на стороне системы сбора.

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

Подключение

Передатчик имеет всего три вывода: Gnd, Vcc и Data.

Подключаем их к первой плате Ардуино по схеме:

Передатчик MX-05V 433МГц GND VCC Data
Ардуино Уно №1 GND +5V 2

У приемника четыре вывода, но один не используется.

Схема подключения ко второй плате Ардуино идентична первой:

Приемник XD-RF-5V 433МГц GND VCC Data
Ардуино Уно №2 GND +5V 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 на плате Ардуино. Если приемник поймал код 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 МГц работает большинство радиоканальных пультов управления. Имея Ардуино и приемник, мы можем декодировать сигналы управления и повторить их. Подробнее о том, как это сделать мы напишем в одном из следующих уроков!

Чтобы передавать много данных с большой скоростью и на большие расстояния рекомендуем использовать цифровые приемопередатчики: nrf24l01, тот же bluetooth, wi-fi или LoraWAN.

3+Всем привет! У меня на работе есть автомобильная парковка. Конечно, цель данной статьи не хвастовство, учитывая тяжелую ситуацию на дорогах с парковочными местами, и не пиар моего руководства о том, что они заботятся о своих сотрудниках (не буду даже упоминать о месте свой работы!), дело совершено не в этом. Суть в том, что мешает любому другому человеку, не имеющему отношения к месту моей работы, припарковаться на этой парковке? А это шлагбаум, ограничивающий въезд и выезд с этой парковки. И как во многих организациях, вход на мое предприятие осуществляется по обыкновенным пропускам, дабы контролировать меня и всех остальных. Ну и въезд на парковку сделали также, по этим же пропускам. То есть подъезжаешь к парковке, подносишь пропуск к считывателю, он срабатывает, шлагбаум открывается (закрывается автоматически), заезжаешь и все. Так думали они. Но мое увлечение электроникой и природная лень (это ведь каждый раз подъезжать, открывать окно, вытаскивать руку, закрывать окно, а если дождь, а если холодно) пошли против системы. Итак, ближе к делу. Прежде всего, узнал, что шлагбаум оказался довольно-таки популярной фирмы Nice и начал искать о нем информацию. Однако, несмотря на популярность фирмы производителя, информации о его форматах кодов было очень мало. Выяснилось, что существуют 12-битные и 24-битные форматы кодов. 12-битные более древние, 24-битные – посовременней. Так как я знаю, что шлагбаум на работе стоит давно, решил начать с 12-битных кодов (впоследствии угадал). И так пакет данных состоит из 12 бит. Перед 12-битным кодом идет, так называемый, «пилотный период» и «стартовый импульс». «Пилотный период» состоит из 36 интервалов низкого уровня, «стартовый импульс» состоит из 1 интервала высокого уровня. Один пакет данных состоит из «пилотного периода», за ним «стартовый импульс» и за ним 12-битный код (для каждого шлагбаума свой). Пульты шлагбаумов передают сразу по 4 пакета данных, но я поставил больше, так как очень много устройств работают на данной частоте (в частности автомобильные сигнализации) и возможны помехи. Длительности импульсов для шлагбаумов Nice:

  • Логическая «1» – 1400 мкс низкого уровня (два интервала) и 700 мкс высокого (один интервал)
  • Логический «0» – это 700 мкс низкого уровня (один интервал) и 1400 мкс высокого (один интервал)
  • «Пилотный период» – 25200 мкс (36 интервалов)
  • «Стартовый импульс» – 700 мкс (1 интервал)

Так как пультов от этого шлагбаума ни у меня и ни у кого нет (в таком бы случаем просто можно было считать сигнал с действующего пульта), то угадывать истинный код придется методом перебора всех возможных вариантов, а 4096. С помощью чего, вообще, все это можно реализовать? Недавнее мое увлечение платформами Arduino, не дали мне долго размышлять над этим вопросом. Список компонентов:1. Arduino Uno,c2ec7a09e0704b25aadcd80cb8472205.jpg2. Радиопередатчик 433Мгц, самодельная антенна к нему,1ef42240f9da4a92b7c48f5fffd9c8cd.jpg3. Батарейка 9 вольт, в народе «Крона».db567a28f65547939aae58c9f958f20f.jpg Данные радиопередатчики в известных китайских магазинах продаются очень дешево (порядка 50 руб.), совместно с радиоприемниками. Они очень простые, три контакта: питание, земля и сигнальный контакт. Питания от 5 до 12 вольт, чем выше напряжение питания, тем лучше дальнобойность. Собственно по этой причине была выбрана 9 вольтовая батарейка. Рекомендованное напряжения питания Arduino Uno от 7 до 12 вольт (контакт Vin), так что «Крона» вполне подходит. Также дальнобойность радиопередатчика зависит от наличия антенны (без нее дальность будет около 1 метра). Весь комплект обошелся порядка 300 руб. Вот, собственно, и сам скетч для Arduino Uno:

int send_code_pin = 13; //int send_code = 3061; это код определенный методом перебора для моего шлагбаума   void setup() {   pinMode(send_code_pin, OUTPUT); }  void loop () {   for (int send_code = 0; send_code < 4096; send_code++) // этот цикл после того как код определен необходимо убрать   {     for (int j = 0; j  j++) // достаточно 4-х, но из-за помех поставил 7     {       digitalWrite(send_code_pin, HIGH); // стартовый импульс       delayMicroseconds(700);       digitalWrite(send_code_pin, LOW);       for (int i = 12; i > 0; i--)       {         boolean bit_code = bitRead(send_code, i - 1);         if (bit_code)         {           digitalWrite(send_code_pin, LOW); // единица           delayMicroseconds(1400);           digitalWrite(send_code_pin, HIGH);           delayMicroseconds(700);         }         else         {           digitalWrite(send_code_pin, LOW); // ноль           delayMicroseconds(700);           digitalWrite(send_code_pin, HIGH);           delayMicroseconds(1400);         }       }       digitalWrite(send_code_pin, LOW); // пилотный период       delayMicroseconds(25200);     }   }   //delay(10000); после определения кода поставить задержку } 

Перебор всех возможных вариантов занял около 1 недели, с учетом одного выхода в день к шлагбауму. Методика быстрого выбора правильного кода была очень простой. С помощью команды micros() определил время передачи одного кода. Он составил примерно 0,25 сек. Общее перебора всех вариантов около 17 мин. Перед шлагбаумом запустил Arduino и засек время. Где-то на 12,5 минуте открылся шлагбаум. Исходя из этого, я отбросил сразу первые 2800 вариантов. И так далее. Когда вариантов осталось около 30, после каждой передачи данных ставил задержку в 1 секунду. Так как контакт передачи данных я установил 13-ым (со светодиодом), было видно каждый момент передачи, подсчитал и определил точный код. Вот и все! В качестве демо — видео вскрытия: Спасибо за внимание!Используемые источники:

  • https://lesson.iarduino.ru/page/urok-26-6-soedinyaem-dve-arduino-po-radiokanalu-433-mgc/
  • https://robotclass.ru/tutorials/arduino-radio-433mhz/
  • https://habr.com/post/311818/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации