Пишем программный код для настройки радиосвязи между двумя микроконтроллерами с помощью радио модулей в среде программирования Arduino IDE.

В данном уроке мы с Вами настроим связь между двумя платами Arduino Nano с помощью радио  модуля:

Так же есть точно такой модуль но с супергетеродином (по характеристикам он лучше чем обычный модуль):

Очень важно:
очень не рекомендуется включать модуля без впаянных антенн, это может привести к выходу платы из строя, длина антенны должна составлять 17,3см (четверть длины волны).

Работают данные платы на частоте 433МГц. При подключении плат, необходимо знать напряжение питания, так как есть платы на 5В и на 3,3В. В нашем уроке мы будем передавать значения данных с АЦП и в зависимости от их значения регулировать яркость свечения светодиода на второй плате.
Схема подключения:

Для обоих схем (приемника и передатчика) выход DATA подключается к третей ножке нашей плате.

 

 

 

 

 

 

 

 

Для работы с данным модулем нам понадобиться библиотека RH_ASK.h, данная библиотека использует в качестве прерывания Timer1 (по умолчанию), так же можно использовать Timer2, если расcкомментировать строку #define RH_ASK_ARDUINO_USE_TIMER2 файла RH_ASK.cpp

 Для библиотеки RH-ASK сигналы форматируются с помощью 36-битной обучающей преамбулы, состоящей из 18 пар битов 0 и 1, 12-битного начального символа (0xB38), 1-байтового числа для размера поля данных, 4-байтового заголовка, N байт, содержащих N символов сообщения с максимумом 60 символов на сообщение и 2 байта для контрольной последовательности. Размер поля данных количество символов в сообщении плюс семь (1 для длины поля данных; 4 для заголовка и 2 для FCS).  Кроме   преамбулы и начального символа, каждый байт разбивается на старшие и младшие 4-разрядные последовательности, которые перекодируются в 6-разрядные последовательности и передаются младшим  битом (LSB) вперед.

Цель перекодирования состоит в том, чтобы гарантировать, что 12-битная последовательность содержит 6 бит со значением один и 6 бит со значением ноль, она называется сбалансированно по постоянному току.   

Программный код передатчика:

#include <VirtualWire.h>
#define size 1
int pot = A0;
byte TX_buffer[size]={0};
byte i;

void setup(){
// virtual wire
vw_set_tx_pin(3); // pin
vw_setup(2000); // bps
for(i=0;i<size;i++){
  TX_buffer[i]=i;
 }
}

void loop(){
 int val = map(analogRead(pot),0,1024,0,255);
 TX_buffer[0] = val;
 vw_send(TX_buffer, size);
 vw_wait_tx();
 delay(10);
}

Код приемника

#include <VirtualWire.h>
byte message[VW_MAX_MESSAGE_LEN]; // a buffer to store the incoming messages
byte messageLength = VW_MAX_MESSAGE_LEN; // the size of the message
int received_number = 0;
int LED = 5;

void setup(){
 Serial.begin(9600);
 pinMode(LED, OUTPUT);
 Serial.println("Ready...");
 vw_set_rx_pin(3); // pin
 vw_setup(2000); // bps
 vw_rx_start();
}

void loop(){
if (vw_get_message(message, &messageLength)){ // non-blocking
  Serial.print("Potentiometer: ");
  for (int i = 0; i < messageLength; i++){
   Serial.print(message[i]);
   received_number = message[i];
 }
 Serial.println(received_number);
 analogWrite(LED, received_number);
 }
}