Ардуино: радиомодуль на 433 МГц

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

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

Радиомодуль на 433 МГц

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

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

Список необходимых компонентов

Для выполнения простого примера с радиомодулями, потребуется Ардуино-совместимый контроллер, светодиод, резистор, макетная плата и немного проводов вилка-вилка. Необходимые компоненты можно добавить в корзину прямо здесь, и затем оформить заказ в нашем интернет-магазине.

В корзину
В корзину
В корзину
В корзину
В корзину
В корзину

Подключение

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

Распиновка передатчика 433МГц

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

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

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

Распиновка приемника 433МГц

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

Приемник XD-RF-5V 433МГцGNDVCCData
Ардуино Уно №2GND+5V2

Собираем оба устройства на макетной плате и приступаем к написанию программ.

Подключение Ардуино к приемнику и передатчику 433 МГц

Программа для передатчика

Для работы с радиомодулями воспользуемся библиотекой 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();

Задания

Теперь можно попробовать потренироваться и сделать разные полезные устройства. Вот несколько идей.

  1. Пульт для светильника. На стороне приемника модуль реле, включенный в цепь питания светильника (осторожно, 220 Вольт!). На стороне передатчика: тактовая кнопка. Написать программы для приемника и передатчика, которые по нажатию кнопки будут включать удаленное реле. При повторном нажатии кнопки реле будет выключаться.
  2. Уличный термометр с радиоканалом. На стороне передатчика разместить датчик температуры. Предусмотреть автономное питание от батареек. На стороне приемника: символьный ЖК дисплей. Написать программы для приемника и передатчика, которые позволят выводить показания температуры с удаленного датчика на дисплее.

Заключение

Итак, теперь мы знаем простой и недорогой способ передавать данные на расстоянии. К сожалению, скорость передачи и дистанция в таких радиомодулях весьма ограничены, так что мы не сможем полноценно управлять, например квадрокоптером. Однако, сделать радиопульт для управления простым бытовым прибором: светильником, вентилятором или телевизором, нам под силу.

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

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


Изменено:

Ардуино: радиомодуль на 433 МГц: 47 комментариев

  1. это опечатка?

    void setup() {
    pinMode( 3, OUTPUT );
    mySwitch.enableReceive(0);
    }
    или действительно » eReceive(0);» а не 2

    • Это не опечатка. Метод enableReceive принимает не номер вывода, а номер прерывания. На ноге №2 висит прерывание №0, так что всё ок!

      • спасибо за детальный ответ
        если не трудно подскажите
        на каких портах есть еще прерывания и какие.

        • Верно, их всего два. А вот на Arduino Mega их целых шесть, на ногах: 2, 3, 18, 19, 20, 21.

          • огромное спасибо за то как Вы поддерживаете таких новичков как я.

            удачи Вам в вашем бизнесе

            и если нетрудно подскажите какие еще устройства работают на этих каналах (шинах прерываниях протоколах или как они правильно называются)
            чтоб не было ситуации когда ног не хватает.
            или на одной ноге может быть несколько устройств как на I2C?

          • На одну ногу прерывания посадить несколько устройств, но возникнет проблема их идентификации. Контроллер не сможет узнать какое именно устройство запустило прерывание. А если сигналы их наложатся, то вообще будет беда.
            Если возникает задача принимать сигналы с кучи радиопередатчиков, лучше подумать о другой технологии. К примеру, тот же nrf24 отлично подойдет.

  2. Здравствуйте, а можно сделать так чтобы ардуино и принимала и передавала сигнал. То есть, подключить к одному ардуино и приемник и передатчик и также ко второму

    • Можно, никаких препятствий не вижу. Только надо сделать так, чтобы сеанс связи не происходил одновременно. Пусть одна ардуина сначала отправляет второй некий запрос, вторая в ответ отправляет какие-то данные.

      • полностью поддержую. И в отличии от NRF есть 2 плюса 1. задействована только одна «нога» ардуины и на шину ISP можно повесить графический, сенсорный экран, 2. более простой код. Из недостатков 1. нет адресации, 2. через NRF можно передать массив данных.

  3. Никто не знает где находятся вывода с прерываниями на плате ардуино стм32

  4. Здравствуйте!
    При компиляции скетча для передатчика, описанного в статье Ардуино: радиомодуль на 433 МГц Олег Евсегнеев, появляется ошибка в строке:
    mySwitch.enableTransmit(2);
    Ошибка:
    exit status 1
    stray ‘\342’ in program
    Помогите!

    • Похоже что при копировании со страницы скопировался какой-то скрытый символ. Попробуйте набрать этот код прямо в Arduino IDE.

      • Поздновато, но кому-то пригодится, 1. скопирован скеч с сайта при включенном автоматическом переводчике. 2. Некоторые сайты в конце добавляют свой значек, и не сразу обратишь внимание на приписку, сам попался на обе ловушки, патратил часа полтора и кучу матов на автора скеча, хотя он не виноват.

  5. Всем привет такой вопрос как реализовать чтоб при потере сигнала реле выключалось ?

    • Пока передача не начата, сигнала, как такового нету… Сигнал появляется в момент, когда на контроллер приходит
      mySwitch.send(ХХХХ, 4);
      Дальше сигнала опять нету.

      • Можно попытаться отключить реле, если какое-то время не приходит сигнал… Тогда надо обеспечить регулярную посылку управляющего сигнала, чтобы каждый раз обнулять/сбрасывать этот таймер.

  6. хочу сделать «радио пейджер» но не знаю как это реализовать
    какая нужна программа ?
    какие нужны компоненты ?
    т.к. у меня только ARDUINO nano

  7. 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

    Что это? я несколько дней убил на этою.

  8. а получится ли радиомодуль подключить к реле без ардуино? допустим на передатчике висит Инфракрасный датчик движения а на приемнике реле для сигнализации.. можно ли как-то настроить такую схему?

    • Я давно и с успехом это юзаю. Подключить то можно без-но на 433.92 мгц много сигналок работает-будут ложные срабатывания. У меня сигнал кодируется ПИКом и на приемнике и на передатчике. Ловит только свой сигнал.Система 4 канальная. Хоть датчик подключай,хоть кнопку. Датчик движения можно применить и микроволновый RCWL-0516 RCWL 0516 . Вариантов много для разных условий.Просто и надежно. ПРИДУМАЛ НЕ Я. СПАСИБО автору.http://cxem.net/rmodem/rmodem16.php

      • Добавлю немного.Модули есть и получше-смотри на Алиэкпресс или еще где. ПИК 629 там-же .Я по 5 штук заказываю.Можно и Ардуино (типа промини) ,но тогда нужен скетч.Датчики микроволновые лучше,но очень чувствительные.Могут и через стену реагировать. ИК датчики можно сделать направленным и моделей больше.Я датчики если надо скрытность,автономность вместе с радиомодулем передатчика питаю от аккум 18650.Потребляют мало особенно в деж. режиме. Хватает и 3.7 в с ПИКом .Пару стен точно пробьет.

  9. Доброго времени. Подскажите пожалуйста.
    Залил в ардуинку нано скетч передатчика и тишина. В мониторе порта ни чего не отображается и светодиод на плате rx tx не моргает. Так же и приемник ни чего не принимает. Хотел проверить модули 433мгц и тишина. В чем может быть проблемка? В скетче или в модулях приемник передатчик?

    • «Доброго времени. Подскажите пожалуйста.
      Залил в ардуинку нано скетч передатчика и тишина. В мониторе порта ни чего не отображается и светодиод на плате rx tx не моргает. Так же и приемник ни чего не принимает. Хотел проверить модули 433мгц и тишина. В чем может быть проблемка? В скетче или в модулях приемник передатчик?» —
      «проблемка» может быть в неправильном подключении модулей например. У автора на передатчике вход «сигнал» находится с краю, а передо мной лежит передатчика, где сигнал по центру… Да и «проверили модули и тишина» — как вы их проверили?)

  10. А можно сделать так чтобы передавать данные с 2 осевого джойстика?А на 2 устройстве принимать значения и выводить их в Serial одновременно?

    • Теоретические можно, но сложно. Передатчик за раз передает всего 4 бита, а только от одного джойстика мы получим число от 0 до 1023 — 10бит. Плюс — скорость передачи будет крайне небольшая.
      Лучше всего для этой задачи использовать модуль nrf24.

  11. Здравствуйте. Скажите, пожалуйста, можно ли подавать сигналы с Arduino Nano, их же снова получить на микроконтроллер и передать по радиомодулю? Вот схема подключения со стороны передатчика:
    https://ibb.co/rw8kDyr
    Хочу сделать беспроводные поворотники на рюкзак и велосипед (то есть моргают поворотники/горит стопсигнал и там и там). Сделал моргание на mills, чтобы не грузить МК. Но когда подключаю радиомодуль, Arduino начинает тормозить. А код по радиомодулю брал отсюда:
    https://sites.google.com/site/rodrigodflores/electronics

  12. Кто знает код чтобы просто улавливать код и просматривать его в мониторе порта?

    • #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();
      }
      }

  13. Здрасьте. Как подключить приемник и передатчик для передачи сигнала от кнопки без использования ардуино?

  14. Есть вопрос, мы же можем передавать массив данных? К примеру в массив я буду записывать значения для поворота сервопривода, для скорости вращения моторов, а потом передавать этот массив на приемник, а там в свою очередь уже его значения подавать на пины. Просто мне в примеры стало непонятно, могу ли я так делать.

  15. У нас такая беда, поставили шлагбаум во дворе, а пультов на всех не хватило, ну вот я не ищу лёгких путей, буду пробовать с помощью arduino сначала принять чей-нибудь сигнал в момент открытия шлагбаума, а затем его воспроизвести, трансмиттер и ресивер есть, останется найти код такой задумки, буду крайне признателен, если его кто-нибудь подарит 🤗

  16. Случилось так что я купил электронные настольные часы(IAN375672) с выносным беспроводным температурным датчиком(IAN392071),как видите маркировки не совпадают.
    Потом в инете я визуально увидел что датчик не от моих часов,но было уже поздно и поменять их сейчас уже по разным причинам не возможно. Остаётся только вариант использовать как часы,без внешнего датчика(этот естественно не подключается)
    Та вот у меня созрел вопрос (как у человека совершенно ничего не соображающего в электронике),можно ли их как то состыковать,частото у них одинаковая (433,92 МГц),или там всё на уровне прошивок,и ничего неподелаешь?

    • Частота может совпадать, но какие данные идут на этой частоте одному производителю известно. Реверес-инжиниринг протокола передачи будет несоизмерим с покупкой новых часов, или даже с созданием своих собственных:)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.