Сегодня мы рассмотрим радиочастотную связь между микроконтроллерами с использованием одного из самых популярных ВЧ модулей связи - коммуникационного модуля NRF24LO1.
Модуль NRF24L01 - недорогой экономичный, двухнаправленный приемопередатчик. Он предназначен для работы в диапазоне 2,4 ГГц ISM, который означает, что он может быть использован для проектов, промышленных, научных и медицинских приложений. Модуль может передавать данные со скоростью до 2МБит/с и использует высокоскоростной интерфейс SPI для связи с Arduino или другими микроконтроллерами.
Одна из самых лучших характеристик этого модуля, кроме легкости с которой ее можно использовать с Arduino и другим контроллером, это низкое собственное потребление. Этот модуль потребляет меньше, чем 14mA в при работе и всего несколько микроампер в режиме сна. Это делает его идеальным для проектов, работающих от батареек или аккумуляторов.
Чтобы продемонстрировать использование этого модуля с Ардуино, мы построим простой проект передатчика и приемника. Передатчик посылает данные через регклярные интервалы времени к приемнику, который показывает полученные данные на терминале. Эти данные могут быть данными от датчиков в реальном приложении или командами для приемника для выполнения определенных действий.
Требуемые компоненты
Для сборки этого проекта требуются следующие компоненты;
- 2 nrf24l01
- 2 Arduino Uno или аналогичные
- 2 Батареи
- Провода-перемычки
Схема
Схемы для этого проекта довольно просты, все, что нам нужно сделать, это подключить NRF24L01 к Arduino.
Подключите компоненты, как показано на схеме ниже.
Не забывайте, что один и тот же компонент будет использоваться для создания как передатчика, так и приемника, поэтому нам нужно сделать две одинаковые схемы. Таблица соединений контактов приведена ниже.
Nrf24l01-Arduino
GND - GND
VCC - 3.3v
CE - D7
CS - D8
SCK - D13
MOSI - D11
MISO - D12
Важно, что vcc-вывод модуля NRF24L01 не подключен к контакту Arduino 5v, так как это может повредить модуль NRF24L01. Модуль работает от 3.3 в.
Код
Мы напишем два разных скетча Arduino для этого проекта. Один из скетчей будет для передатчика и один для приемника. Скетч передатчика в основном выполняет задачу отправки данных через равные промежутки времени на приемник, который после получения сообщения печатает его на последовательный порт. Оба кода передатчика и приемника сильно зависят от библиотеки RF24, который можно скачать отсюда.
Первое, что мы делаем, как обычно, это подключаем библиотеки, которые мы будем использовать для программы. В данном случае это библиотека SPI, которая поставляется с Arduino IDE и библиотеки RF24, упомянутые выше.
#include <SPI.h> #include "RF24.h"
Далее мы создаем экземпляр библиотеки RF24 с выводами Arduino, к которым в качестве аргументов подключены CE и CS-выводы NF24L01.
RF24 myRadio (7, 8);
Затем мы создаем структуру package, которая в основном является функцией для упаковки данных, которые будут отправлены, после чего мы переходим к функции setup.
struct package { int id=1; float temperature = 18.3; char text[100] = "Text to be transmitted"; }; typedef struct package Package; Package data;
В функции setup, мы инициализируем параметры связи установки модуля НРФ24Л01 как уровень мощности, канал, и битрейт. Важно обратить внимание на канал, используемый на передатчике, поскольку тот же канал должен использоваться на приемнике.
void setup() { Serial.begin(115200); delay(1000); myRadio.begin(); myRadio.setChannel(115); myRadio.setPALevel(RF24_PA_MAX); myRadio.setDataRate( RF24_250KBPS ) ; myRadio.openWritingPipe( addresses[0]); delay(1000); }
После этого мы напишем функцию loop.
Функция loop генерирует фиктивные данные для отправки получателю, увеличивая значение, присвоенное фиктивной переменной temperature в пакете структуры, на 1 при каждом запуске цикла. После генерации данных они отправляются получателю с помощью функции myradio.write (), которая находится в начале цикла.
void loop() { myRadio.write(&data, sizeof(data)); Serial.print("\nPackage:"); Serial.print(data.id); Serial.print("\n"); Serial.println(data.temperature); Serial.println(data.text); data.id = data.id + 1; data.temperature = data.temperature+0.1; delay(1000); }
Второй скетч для приемника аналогичен первому, этот скетч принимает данные от передатчика и отправляет их на последовательный порт. Он начинается также путем включения библиотек, которые необходимы для него.
#include <SPI.h> #include "RF24.h"
Далее мы создаем экземпляр библиотеки RF24 также с выводами Arduino, к которому подключены выводы CE и CS NRF24L01, после чего создаем структуру package, к которой поступают температурные данные.
RF24 myRadio (7, 8) struct package { int id=0; float temperature = 0.0; char text[100] ="empty"; }; byte addresses[][6] = {"0"};
Затем, функция установки. Так же, как мы сделали для передатчика, мы инициализируем радиочастотный модуль, устанавливая параметры связи в соответствии с параметрами в скетче передатчика.
void setup() { Serial.begin(115200); delay(1000); myRadio.begin(); myRadio.setChannel(115); myRadio.setPALevel(RF24_PA_MAX); myRadio.setDataRate( RF24_250KBPS ) ; myRadio.openReadingPipe(1, addresses[0]); myRadio.startListening(); }
Функция loop для приемника довольно проста, когда данные доступны, мы читаем данные с помощью MyRadio.read и отправляем их на последовательный порт.
void loop() { if ( myRadio.available()) { while (myRadio.available()) { myRadio.read( &data, sizeof(data) ); } Serial.print("\nPackage:"); Serial.print(data.id); Serial.print("\n"); Serial.println(data.temperature); Serial.println(data.text); } }
Полный скетч для передатчика и приемника можно скачать в конце статьи.
Демонстрация
Загрузите соответствующий скетч на каждую плату и держите плату, на которой выполняется код приемника, подключенной к компьютеру, чтобы вы могли просматривать данные, отображаемые на последовательном порту. Через некоторое время вы увидите данные с передатчика, как показано на рисунке ниже.
Хотя мы использовали фиктивные данные для этого урока, это могли быть реальные данные, отправляемые с одного Arduino на другой, обеспечивая решение реальной задачи.