Ардуино: радиомодуль на 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 МГц: 3 комментария

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

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

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

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

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

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