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

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

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

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

Работают данные платы на частоте 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);
 }
}