При создании некоторых проектов, требуется разделить выполняемые задачи между несколькими 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, они электрически соединены между собой, так что Вы можете использовать любой выход.
Библиотека 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МГц.
На самом деле, устройство по передаче данных состоит из двух модулей: приемника и передатчика. Данные можно передавать только в одном направлении. Это важно понимать при использовании этих модулей.
Например, можно сделать дистанционное управление любым электронным устройством, будь то мобильный робот или, например, телевизор. В этом случае данные будут передаваться от пульта управления к устройству. Другой вариант — передача сигналов с беспроводных датчиков на систему сбора данных. Здесь уже маршрут меняется, теперь передатчик стоит на стороне датчика, а приемник на стороне системы сбора.
Модули могут иметь разные названия: 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();
Задания
Теперь можно попробовать потренироваться и сделать разные полезные устройства. Вот несколько идей.
- Пульт для светильника. На стороне приемника модуль реле, включенный в цепь питания светильника (осторожно, 220 Вольт!). На стороне передатчика: тактовая кнопка. Написать программы для приемника и передатчика, которые по нажатию кнопки будут включать удаленное реле. При повторном нажатии кнопки реле будет выключаться.
- Уличный термометр с радиоканалом. На стороне передатчика разместить датчик температуры. Предусмотреть автономное питание от батареек. На стороне приемника: символьный ЖК дисплей. Написать программы для приемника и передатчика, которые позволят выводить показания температуры с удаленного датчика на дисплее.
Заключение
Итак, теперь мы знаем простой и недорогой способ передавать данные на расстоянии. К сожалению, скорость передачи и дистанция в таких радиомодулях весьма ограничены, так что мы не сможем полноценно управлять, например квадрокоптером. Однако, сделать радиопульт для управления простым бытовым прибором: светильником, вентилятором или телевизором, нам под силу.
На основе приемопередатчиков с частотой 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,2. Радиопередатчик 433Мгц, самодельная антенна к нему,3. Батарейка 9 вольт, в народе «Крона». Данные радиопередатчики в известных китайских магазинах продаются очень дешево (порядка 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/