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

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

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

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

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

1. Подключение

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

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

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

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

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

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

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

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

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

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

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. Программа для приемника

Теперь напишем программу для приемника. Для демонстрации факта передачи мы будем зажигать светодиод, подключенный к выводу №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 МГц работает большинство радиоканальных пультов управления. Имея Ардуино и приемник, мы можем декодировать сигналы управления и повторить их. Подробнее о том, как это сделать мы напишем в одном из следующих уроков!


Изменено:

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

  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 можно передать массив данных.

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

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