В данном уроке мы с Вами настроим связь между двумя платами 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); } }