Содержание статьи
Содержание

Главная / Arduino для начинающих / Радиопередатчик RF 315/433 МГц и Arduino

Радиопередатчик RF 315/433 МГц и Arduino

Данная статья посвящена модулям-радиопередатчикам RF 315 МГц и 433 МГц. Использование этих модулей с Arduino открывает совершенно новые возможности: например, дистанционное управление вашими макетами, системами измерений и т.п. Рассмотрим основные технические характеристики трансивера, схему подключения к Arduino и программирование микроконтроллера в Arduino IDE.

Необходимое оборудование

Итак, нам понадобятся:

Технические характеристики модуля RF 315/433

RF 315/433 МГц

Технические характеристики передатчика:

Этот модуль обеспечивает передачу данных на расстояние до 90 метров на открытом пространстве.

Технические характеристики приемника:

Можно использовать дополнительную антенну и качество вашего беспроводного соединения значительно улучшится.

Схема подключения радиомодуля к Arduino

Модуль подключается к Arduino достаточно просто.

Скетч для Arduino с использованием библиотеки VirtualWire

RF 315/433 МГц Arduino и монтажная плата

К счастью для нас свами есть отличная библиотека для Arduino под названием VirtualWire, написанная неким Mike McCauley.

Эта библиотека дает возможность отправлять короткие сообщения без перезагрузки и переадресации по типу беспроводных протоколов UDP. Кроме того, библиотека поддерживает возможность работы с некоторыми моделями радиопередатчиков.

Библиотека позволяет отправлять и принимать данные в виде байтов информации и строк.

Скачать библиотеку VirtualWire для работы RF радиопередатчика с Arduino можно здесь: Seedstudio

.

После распаковки архива, переместите его в папку Libraries в папке с Arduino IDE.

Ниже представлен простой код, с помощью которого можно последовательно, через каждые 2 секунды отправляются значения значения '1' и '0'.

Код для трансмиттера:

// Tx на пине D12

#include

char *controller;

void setup() {

pinMode(13,OUTPUT);

vw_set_ptt_inverted(true); //

vw_set_tx_pin(12);

vw_setup(4000);// скорость передачи данных в Kbps

}

void loop(){

controller="1" ;

vw_send((uint8_t *)controller, strlen(controller));

vw_wait_tx(); // ждем, пока отправится все сообщение

digitalWrite(13,1);

delay(2000);

controller="0" ;

vw_send((uint8_t *)controller, strlen(controller));

vw_wait_tx(); // ждем, пока отправится все сообщение

digitalWrite(13,0);

delay(2000);

}

И код для приемника:

//Светодиод на 13 пине Arduino загорается, когда приходит '1' и тухнет, когда поступает '0'.

// Tx на пине D12

#include

void setup()

{

vw_set_ptt_inverted(true); // необходимо для модуля DR3100

vw_set_rx_pin(12);

vw_setup(4000); // бит в секунду

pinMode(13, OUTPUT);

vw_rx_start(); // запуск фазовой автоподстройки частоты (ФАПЧ)

}

void loop()

{

uint8_t buf[VW_MAX_MESSAGE_LEN];

uint8_t buflen = VW_MAX_MESSAGE_LEN;

if (vw_get_message(buf, &buflen)) // Не блокируется

{

if(buf[0]=='1'){

digitalWrite(13,1);

}

if(buf[0]=='0'){

digitalWrite(13,0);

}

}

}

Один радиопередатчик, несколько приемников

Как вы уже могли догадаться, можно подключить несколько приемников, а отправлять информацию с одного трансмиттера.

Несколько приемников RF 315/433 МГц

Вам понадобится так называемый энкодер-декодер.

Энкодер - это цепь, в которой сигнал преобразуется к код.

Декодер - это цепь, в которой код преобразуется в сигнал.

Для этих целей вы можете использовать Arduino

Ниже приведен простой пример, в котором используется 1 трансмиттер и два ресивера. В результате опять таки будем посылать команды для включения/выключения светодиода.

Код для передатчика:

#include

char *controller;

void setup() {

pinMode(13,OUTPUT);

vw_set_ptt_inverted(true);

vw_set_tx_pin(12);

vw_setup(4000);// скорость передачи данных в Kbps

}

void loop(){

controller="A1" ;

vw_send((uint8_t *)controller, strlen(controller));

vw_wait_tx(); // Ждем, пока отправится вся информация

digitalWrite(13,1);

delay(1000);

digitalWrite(13,0);

delay(1000);

controller="B1" ;

vw_send((uint8_t *)controller, strlen(controller));

vw_wait_tx(); // Ждем, пока отправится вся информация

digitalWrite(13,1);

delay(1000);

digitalWrite(13,0);

delay(1000);

}

Первый приемник:

#include

void setup()

{

vw_set_ptt_inverted(true); // строка, которая необходима для радиомодулей DR3100

vw_set_rx_pin(12);

vw_setup(4000); // Бит в секунду

pinMode(13, OUTPUT);

vw_rx_start(); // запуск ФАПЧ приемника

}

void loop()

{

uint8_t buf[VW_MAX_MESSAGE_LEN];

uint8_t buflen = VW_MAX_MESSAGE_LEN;

if (vw_get_message(buf, &buflen)) // Не блокируется

{

if((buf[0]=='A')&&(buf[1]=='1')){

digitalWrite(13,1);

delay(1000);

}

}

else{

digitalWrite(13,0);

}

}

Второй приемник:

#include

void setup()

{

vw_set_ptt_inverted(true); // строка, необходимая для DR3100

vw_set_rx_pin(12);

vw_setup(4000); // Бит в секунду

pinMode(13, OUTPUT);

vw_rx_start(); // запуск ФАПЧ

}

void loop()

{

uint8_t buf[VW_MAX_MESSAGE_LEN];

uint8_t buflen = VW_MAX_MESSAGE_LEN;

if (vw_get_message(buf, &buflen)) // НЕ БЛОКИРУЕТСЯ

{

if((buf[0]=='B')&&(buf[1]=='1')){

digitalWrite(13,1);

delay(1000);

}

}

else{

digitalWrite(13,0);

}

}

Несколько приемников RF 315/433 МГц

Библиотека VirtualWire ..... изнутри

Как мы уже разобрались выше, VirtualWire - это библиотека для Arduino, с помощью которой мы обеспечиваем работу нашего радиопередатчика.

Можно ли использовать серийный протокол? Ответ - НЕТ.

ASK-ресиверам необходимо несколько пробных импульсов для синхронизации с трансмиттером. Кроме того, необходимо разграничить сигналы 0 и 1. UART обеспечить этого не может.

Функции, которые использованы для работы с библиотекой описаны ниже.

Для работы библиотеки VirtualWire ее надо включить в скетч:

#include

Для выбора пина с данными для передатчика:

vw_set_tx_pin

Для выбора пина с данными для приемника:

vw_set_rx_pin

Необходимо настроить скорость передачи. Скорость трансмиттера должна быть одинаковой со скоростью ресивера.

Скорость передачи данных будет числом в диапазоне от 0 до 9600. При передаче данных на короткие расстояния, можно использовать большую скорость, при больших расстояниях (вплоть до 90 метров), скорость передачи данных надо максимально уменьшать.

vw_setup(uint16_t speed);

Запуск ФАЧП надо провести до приема сигнала:

vw_rx_start();

Когда данные будут получены, vw_have_message() вернет состояние true.

vw_rx_stop();

Блокировка и ожидание трансмиттера при простое:

vw_wait_tx();

Отправка сообщения заданной длины:

vw_send(uint8_t* buf, uint8_t len);

Возвращает true, если есть непрочитанное сообщение от ресивера:

vw_have_message();