На этом уроке мы решим задачу по передаче радиосигнала между двумя контроллерами Ардуино с помощью популярного приемопередатчика с частотой 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.h>
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.h>
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.
это опечатка?
void setup() {
pinMode( 3, OUTPUT );
mySwitch.enableReceive(0);
}
или действительно » eReceive(0);» а не 2
Это не опечатка. Метод enableReceive принимает не номер вывода, а номер прерывания. На ноге №2 висит прерывание №0, так что всё ок!
спасибо за детальный ответ
если не трудно подскажите
на каких портах есть еще прерывания и какие.
нашол на 3 ноге есть прерывание 1.
Верно, их всего два. А вот на Arduino Mega их целых шесть, на ногах: 2, 3, 18, 19, 20, 21.
огромное спасибо за то как Вы поддерживаете таких новичков как я.
удачи Вам в вашем бизнесе
и если нетрудно подскажите какие еще устройства работают на этих каналах (шинах прерываниях протоколах или как они правильно называются)
чтоб не было ситуации когда ног не хватает.
или на одной ноге может быть несколько устройств как на I2C?
На одну ногу прерывания посадить несколько устройств, но возникнет проблема их идентификации. Контроллер не сможет узнать какое именно устройство запустило прерывание. А если сигналы их наложатся, то вообще будет беда.
Если возникает задача принимать сигналы с кучи радиопередатчиков, лучше подумать о другой технологии. К примеру, тот же nrf24 отлично подойдет.
Здравствуйте, а можно сделать так чтобы ардуино и принимала и передавала сигнал. То есть, подключить к одному ардуино и приемник и передатчик и также ко второму
Можно, никаких препятствий не вижу. Только надо сделать так, чтобы сеанс связи не происходил одновременно. Пусть одна ардуина сначала отправляет второй некий запрос, вторая в ответ отправляет какие-то данные.
полностью поддержую. И в отличии от NRF есть 2 плюса 1. задействована только одна «нога» ардуины и на шину ISP можно повесить графический, сенсорный экран, 2. более простой код. Из недостатков 1. нет адресации, 2. через NRF можно передать массив данных.
Никто не знает где находятся вывода с прерываниями на плате ардуино стм32
Здравствуйте!
При компиляции скетча для передатчика, описанного в статье Ардуино: радиомодуль на 433 МГц Олег Евсегнеев, появляется ошибка в строке:
mySwitch.enableTransmit(2);
Ошибка:
exit status 1
stray ‘\342’ in program
Помогите!
Похоже что при копировании со страницы скопировался какой-то скрытый символ. Попробуйте набрать этот код прямо в Arduino IDE.
Поздновато, но кому-то пригодится, 1. скопирован скеч с сайта при включенном автоматическом переводчике. 2. Некоторые сайты в конце добавляют свой значек, и не сразу обратишь внимание на приписку, сам попался на обе ловушки, патратил часа полтора и кучу матов на автора скеча, хотя он не виноват.
Проверьте какая плата при компиляции
Всем привет такой вопрос как реализовать чтоб при потере сигнала реле выключалось ?
Пока передача не начата, сигнала, как такового нету… Сигнал появляется в момент, когда на контроллер приходит
mySwitch.send(ХХХХ, 4);
Дальше сигнала опять нету.
Можно попытаться отключить реле, если какое-то время не приходит сигнал… Тогда надо обеспечить регулярную посылку управляющего сигнала, чтобы каждый раз обнулять/сбрасывать этот таймер.
И получится мусор в эфире, я не прав?
Я так и не понял, а как можно температуру передавать через них?
хочу сделать «радио пейджер» но не знаю как это реализовать
какая нужна программа ?
какие нужны компоненты ?
т.к. у меня только ARDUINO nano
sketch_feb04a.ino:1:22: error: RCSwitch.h: No such file or directory
sketch_feb04a.ino: In function ‘void setup()’:
sketch_feb04a:6: error: ‘mySwitch’ was not declared in this scope
sketch_feb04a:7: error: ‘RCSwitch’ was not declared in this scope
sketch_feb04a.ino: In function ‘void loop()’:
sketch_feb04a:11: error: ‘mySwitch’ was not declared in this scope
Что это? я несколько дней убил на этою.
установи библиотеку
а получится ли радиомодуль подключить к реле без ардуино? допустим на передатчике висит Инфракрасный датчик движения а на приемнике реле для сигнализации.. можно ли как-то настроить такую схему?
Тут больше подойдет нечто подобное:
https://shop.robotclass.ru/index.php?route=product/product&product_id=594
Можно разобрать пульт, и на вместо кнопки подключить датчик движения.
А приемник для этого пульта напрямую подключить к реле.
Я давно и с успехом это юзаю. Подключить то можно без-но на 433.92 мгц много сигналок работает-будут ложные срабатывания. У меня сигнал кодируется ПИКом и на приемнике и на передатчике. Ловит только свой сигнал.Система 4 канальная. Хоть датчик подключай,хоть кнопку. Датчик движения можно применить и микроволновый RCWL-0516 RCWL 0516 . Вариантов много для разных условий.Просто и надежно. ПРИДУМАЛ НЕ Я. СПАСИБО автору.http://cxem.net/rmodem/rmodem16.php
Добавлю немного.Модули есть и получше-смотри на Алиэкпресс или еще где. ПИК 629 там-же .Я по 5 штук заказываю.Можно и Ардуино (типа промини) ,но тогда нужен скетч.Датчики микроволновые лучше,но очень чувствительные.Могут и через стену реагировать. ИК датчики можно сделать направленным и моделей больше.Я датчики если надо скрытность,автономность вместе с радиомодулем передатчика питаю от аккум 18650.Потребляют мало особенно в деж. режиме. Хватает и 3.7 в с ПИКом .Пару стен точно пробьет.
Доброго времени. Подскажите пожалуйста.
Залил в ардуинку нано скетч передатчика и тишина. В мониторе порта ни чего не отображается и светодиод на плате rx tx не моргает. Так же и приемник ни чего не принимает. Хотел проверить модули 433мгц и тишина. В чем может быть проблемка? В скетче или в модулях приемник передатчик?
«Доброго времени. Подскажите пожалуйста.
Залил в ардуинку нано скетч передатчика и тишина. В мониторе порта ни чего не отображается и светодиод на плате rx tx не моргает. Так же и приемник ни чего не принимает. Хотел проверить модули 433мгц и тишина. В чем может быть проблемка? В скетче или в модулях приемник передатчик?» —
«проблемка» может быть в неправильном подключении модулей например. У автора на передатчике вход «сигнал» находится с краю, а передо мной лежит передатчика, где сигнал по центру… Да и «проверили модули и тишина» — как вы их проверили?)
А можно сделать так чтобы передавать данные с 2 осевого джойстика?А на 2 устройстве принимать значения и выводить их в Serial одновременно?
Теоретические можно, но сложно. Передатчик за раз передает всего 4 бита, а только от одного джойстика мы получим число от 0 до 1023 — 10бит. Плюс — скорость передачи будет крайне небольшая.
Лучше всего для этой задачи использовать модуль nrf24.
если посылаю B0000 , то приемник не получяет
Здравствуйте. Скажите, пожалуйста, можно ли подавать сигналы с Arduino Nano, их же снова получить на микроконтроллер и передать по радиомодулю? Вот схема подключения со стороны передатчика:
https://ibb.co/rw8kDyr
Хочу сделать беспроводные поворотники на рюкзак и велосипед (то есть моргают поворотники/горит стопсигнал и там и там). Сделал моргание на mills, чтобы не грузить МК. Но когда подключаю радиомодуль, Arduino начинает тормозить. А код по радиомодулю брал отсюда:
https://sites.google.com/site/rodrigodflores/electronics
Кто знает код чтобы просто улавливать код и просматривать его в мониторе порта?
#include
RCSwitch mySwitch = RCSwitch();
void setup() {
Serial.begin(9600);
mySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2
}
void loop() {
if (mySwitch.available()) {
int value = mySwitch.getReceivedValue();
if (value == 0) {
Serial.print(«Unknown encoding»);
} else {
Serial.print(«Received «);
Serial.print( mySwitch.getReceivedValue() );
Serial.print(» / «);
Serial.print( mySwitch.getReceivedBitlength() );
Serial.print(«bit «);
Serial.print(«Protocol: «);
Serial.println( mySwitch.getReceivedProtocol() );
}
mySwitch.resetAvailable();
}
}
Скачай библиотеку RCSwitch.h
Здрасьте. Как подключить приемник и передатчик для передачи сигнала от кнопки без использования ардуино?
А можно это организовать на attyni 13???????
Как проверить радопередатчик? Хочу узнать, передает он или нет.
можете помоч где можно скачать библиотеку для проги
Есть вопрос, мы же можем передавать массив данных? К примеру в массив я буду записывать значения для поворота сервопривода, для скорости вращения моторов, а потом передавать этот массив на приемник, а там в свою очередь уже его значения подавать на пины. Просто мне в примеры стало непонятно, могу ли я так делать.
Данный модуль не очень подходит для таких целей. Лучше использовать bluetooth или радиомодули nrf24, например, так:
https://robotclass.ru/tutorials/arduino-radio-nrf24l01/
У нас такая беда, поставили шлагбаум во дворе, а пультов на всех не хватило, ну вот я не ищу лёгких путей, буду пробовать с помощью arduino сначала принять чей-нибудь сигнал в момент открытия шлагбаума, а затем его воспроизвести, трансмиттер и ресивер есть, останется найти код такой задумки, буду крайне признателен, если его кто-нибудь подарит 🤗
Случилось так что я купил электронные настольные часы(IAN375672) с выносным беспроводным температурным датчиком(IAN392071),как видите маркировки не совпадают.
Потом в инете я визуально увидел что датчик не от моих часов,но было уже поздно и поменять их сейчас уже по разным причинам не возможно. Остаётся только вариант использовать как часы,без внешнего датчика(этот естественно не подключается)
Та вот у меня созрел вопрос (как у человека совершенно ничего не соображающего в электронике),можно ли их как то состыковать,частото у них одинаковая (433,92 МГц),или там всё на уровне прошивок,и ничего неподелаешь?
Частота может совпадать, но какие данные идут на этой частоте одному производителю известно. Реверес-инжиниринг протокола передачи будет несоизмерим с покупкой новых часов, или даже с созданием своих собственных:)
для чего нужна команда resetAvailable();
спасибо миша
Здравствуйте, а можно пожалуйста схему подключения пинов и модулей?