nRF24L01 — как это работает, интерфейс Arduino, схемы, коды
<основной класс="главный сайт" id="главный">
В этом уроке мы узнаем, как настроить беспроводную связь. между двумя платами Arduino с помощью nRF24L01 приемопередающие модули. Модуль nRF24L01 очень популярен для беспроводной связи при использовании Arduino.
Я уже использовал этот модуль для множества проектов Arduino, и вы можете ознакомиться с некоторыми из них здесь:
- Радиоуправляемый передатчик Arduino своими руками
- Самолет на радиоуправлении Arduino | 100 % сделай сам.
- Радиоуправляемый корабль на воздушной подушке на базе Arduino своими руками
- Проект беспроводной метеостанции Arduino
Вы можете посмотреть следующее видео или прочитать письменный учебник ниже. Он включает в себя все, что нам нужно знать о модуле приемопередатчика nRF24L01, например, схему контактов модуля, принцип работы, подключение и несколько примеров кода.
Обзор
Для объяснения беспроводной связи мы сделаем два примера, первый из которых будет отправлять простое сообщение «Hello World» с одной Arduino на другую, а во втором примере у нас будет двунаправленная связь между платами Arduino, где используется Джойстиком на первой Ардуино мы будем управлять серводвигателем на второй Ардуино, и наоборот, с помощью кнопки на второй Ардуино будем управлять светодиодом на первой Ардуино.
Модуль приемопередатчика nRF24L01
Давайте подробнее рассмотрим модуль приемопередатчика NRF24L01. Он использует диапазон 2,4 ГГц и может работать со скоростью передачи данных от 250 кбит/с до 2 Мбит/с. При использовании на открытом пространстве и с более низкой скоростью передачи данных его радиус действия может достигать 100 метров.
Вот полные спецификации:
Диапазон частот | Диапазон ISM 2,4–2,5 ГГц |
Скорость передачи данных | 250 Кбит/с / 1 Мбит/с / 2 Мбит/с |
Макс. выходная мощность | 0dBm |
Рабочее напряжение | 1,9–3,6 В |
Макс. рабочий ток | 12,3 мА |
Резервный текущий | 22 мкА |
Логические входы | Допускает 5 В |
Дальность связи | 100 м (открытое пространство) |
Как это работает
Модуль может использовать 125 различных каналов, что дает возможность иметь сеть из 125 независимо работающих модемов в одном месте. Каждый канал может иметь до 6 адресов, или каждое устройство может обмениваться данными с 6 другими устройствами одновременно.
Потребляемая мощность этого модуля составляет всего около 12 мА во время передачи, что даже ниже, чем у одного светодиода. Рабочее напряжение модуля составляет от 1,9 до 3,6 В, но хорошо то, что остальные выводы допускают логику 5 В, поэтому мы можем легко подключить его к Arduino без использования каких-либо преобразователей логических уровней.
Три из этих контактов предназначены для связи SPI, и их необходимо подключить к контактам SPI Arduino, но обратите внимание, что каждая плата Arduino имеет разные контакты SPI. Выводы CSN и CE могут быть подключены к любому цифровому выводу платы Arduino и используются для установки модуля в ждущий или активный режим, а также для переключения между режимом передачи или режимом управления. Последний контакт — это контакт прерывания, который не нужно использовать.
Варианты модуля
Существует несколько вариантов модулей NRF24L01. Самый популярный — с бортовой антенной. Это делает модуль более компактным, но с другой стороны снижает дальность передачи до расстояния около 100 метров.
Второй вариант, вместо бортовой антенны, он имеет разъем SMA, к которому мы можем подключить утиную антенну для лучшей дальности передачи.
Третий вариант, показанный здесь, помимо утиной антенны, имеет микросхему RFX2401C, которая включает в себя PA. (усилитель мощности) и МШУ (Малошумящий усилитель). Это усиливает сигнал NRF24L01 и обеспечивает еще большую дальность передачи до 1000 метров на открытом пространстве.
Распиновка модуля nRF24L01
Вот подробный обзор распиновки NRF24L01, а также модуля NRF24L01+ PA/LNA.
Оба модуля, NRF24L01 и NRF24L01+ PA/LNA, имеют одинаковую распиновку, поэтому мы можем подключить их к нашей схеме одинаковым образом.
Как подключить nRF24L01 к Arduino
Вот как нам нужно подключить модули NRF24L01 к платам Arduino.
Как я уже упоминал, каждая плата Arduino имеет разные контакты SPI, поэтому имейте это в виду при подключении модулей к плате Arduino.
Arduinoтд> | SCK | MISO | MOSI | SS |
Нет | 13 | 12 | 11 | 10 |
Нано | 13 | 12 | 11 | 10 |
Мега | 52 | 50 | 51 | 53 |
Компоненты, необходимые для этого руководства по Arduino, можно получить по ссылкам ниже:
- Модуль приемопередатчика NRF24L01………
- Плата Arduino …………………………………
- Макет и соединительные провода…………
Код Arduino и nRF24L01
Как только мы подключим модули NRF24L01 к платам Arduino, мы готовы создать коды как для передатчика, так и для приемника.
Сначала нам нужно загрузить и установить библиотеку RF24, которая упрощает программирование. Мы также можем установить эту библиотеку непосредственно из диспетчера библиотек Arduino IDE. Просто выполните поиск «rf24», найдите и установите «TMRh20, Avamander».
Вот два кода для беспроводной связи, а ниже их описание.
Код передатчика
/*
* Arduino Wireless Communication Tutorial
* Example 1 - Transmitter Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
void setup() {
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
}
void loop() {
const char text[] = "Hello World";
radio.write(&text, sizeof(text));
delay(1000);
}
Code language: Arduino (arduino)
Код получателя
/*
* Arduino Wireless Communication Tutorial
* Example 1 - Receiver Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
void setup() {
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
}
void loop() {
if (radio.available()) {
char text[32] = "";
radio.read(&text, sizeof(text));
Serial.println(text);
}
}
Code language: Arduino (arduino)
Описание кода
Поэтому нам нужно включить базовый SPI и недавно установленные библиотеки RF24 и создать объект RF24. Здесь два аргумента — контакты CSN и CE.
RF24 radio(7, 8); // CE, CSN
Code language: Arduino (arduino)
Далее нам нужно создать массив байтов, который будет представлять адрес, или так называемый канал, через который будут взаимодействовать два модуля.
const byte address[6] = "00001";
Code language: Arduino (arduino)
Мы можем изменить значение этого адреса на любую строку из 5 букв, и это позволит выбрать, с каким приемником мы будем разговаривать, поэтому в нашем случае у нас будет один и тот же адрес как у приемника, так и у передатчика.
В разделе настройки нам нужно инициализировать объект радио и с помощью функции radio.openWritingPipe() мы устанавливаем адрес получателя, на который мы будем отправлять данные, строку из 5 букв, которую мы ранее установили.
radio.openWritingPipe(address);
Code language: Arduino (arduino)
С другой стороны, на приемнике с помощью функции radio.setReadingPipe() мы устанавливаем тот же адрес и тем самым обеспечиваем связь между двумя модулями.
radio.openReadingPipe(0, address);
Code language: Arduino (arduino)
Затем с помощью функции radio.setPALevel() мы устанавливаем уровень усилителя мощности, в нашем случае я установлю его на минимум, так как мои модули расположены очень близко друг к другу.
radio.setPALevel(RF24_PA_MIN);
Code language: Arduino (arduino)
Обратите внимание, что при использовании более высокого уровня рекомендуется использовать обходные конденсаторы между GND и 3,3 В модулей, чтобы они имели более стабильное напряжение во время работы.
Затем у нас есть функция radio.stopListening(), которая устанавливает модуль в качестве передатчика, а с другой стороны у нас есть функция radio.startListening(), которая устанавливает модуль в качестве приемника.
// at the Transmitter
radio.stopListening();
Code language: Arduino (arduino)
// at the Receiver
radio.startListening();
Code language: Arduino (arduino)
В секции цикла на передатчике мы создаем массив символов, которым мы присваиваем сообщение «Hello World». Используя функцию radio.write(), мы отправим это сообщение получателю. Первый аргумент здесь — это переменная, которую мы хотим отправить.
void loop() {
const char text[] = "Hello World";
radio.write(&text, sizeof(text));
delay(1000);
}
Code language: Arduino (arduino)
Используя «&» перед именем переменной, мы фактически устанавливаем указание переменной, в которой хранятся данные, которые мы хотим отправить, и используя второй аргумент, мы устанавливаем количество байтов, которые мы хотим взять из этой переменной. В этом случае функция sizeof() получает все байты строки text. В конце программы мы добавим задержку в 1 секунду.
Используя функцию radio.write(), мы можем отправить максимум 32 байта за раз.
С другой стороны, на приемнике, в секции loop с помощью функции radio.available() проверяем, есть ли данные для приема. Если это так, то сначала мы создаем массив из 32 элементов, называемый «текст», в котором мы будем сохранять поступающие данные.
void loop() {
if (radio.available()) {
char text[32] = "";
radio.read(&text, sizeof(text));
Serial.println(text);
}
}
Code language: Arduino (arduino)
Используя функцию radion.read(), мы читаем и сохраняем данные в переменной text. В конце мы просто печатаем текст на последовательном мониторе. Итак, как только мы загрузим обе программы, мы сможем запустить последовательный монитор на приемнике, и мы заметим, что сообщение «Hello World» печатается каждую секунду.
Устранение неполадок
Стоит отметить, что шум источника питания является одной из наиболее распространенных проблем, с которыми сталкиваются люди при попытке установить успешную связь с модулями NRF24L01. Как правило, радиочастотные цепи или радиочастотные сигналы чувствительны к шуму источника питания. Поэтому всегда рекомендуется включать развязывающий конденсатор в линию питания. Конденсатор может быть любым от 10 мкФ до 100 мкФ.
Другая распространенная проблема заключается в том, что контакт 3,3 В плат Arduino не всегда может обеспечить достаточную мощность для модуля NRF24L01. Таким образом, питание модуля от внешнего источника также является хорошей идеей.
Двунаправленная беспроводная связь с двумя NRF24L01 и Arduino
Давайте посмотрим на второй пример, двунаправленную беспроводную связь между двумя платами Arduino. Вот принципиальная схема:
Компоненты, необходимые для этого примера, можно получить по ссылкам ниже:
- Модуль приемопередатчика NRF24L01…………
- Плата Arduino…………………………………….
- Модуль джойстика ……………………………….
- Серводвигатель ……………………………………….
- Кнопка ………………………………………..
- Светодиод …………………………………………………
Исходный код nRF24L01
Вот два кода и их описание ниже.
Код передатчика
/*
* Arduino Wireless Communication Tutorial
* Example 2 - Transmitter Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define led 12
RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
boolean buttonState = 0;
void setup() {
pinMode(12, OUTPUT);
radio.begin();
radio.openWritingPipe(addresses[1]); // 00002
radio.openReadingPipe(1, addresses[0]); // 00001
radio.setPALevel(RF24_PA_MIN);
}
void loop() {
delay(5);
radio.stopListening();
int potValue = analogRead(A0);
int angleValue = map(potValue, 0, 1023, 0, 180);
radio.write(&angleValue, sizeof(angleValue));
delay(5);
radio.startListening();
while (!radio.available());
radio.read(&buttonState, sizeof(buttonState));
if (buttonState == HIGH) {
digitalWrite(led, HIGH);
}
else {
digitalWrite(led, LOW);
}
}
Code language: Arduino (arduino)
Код получателя
/*
* Arduino Wireless Communication Tutorial
* Example 2 - Receiver Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
#define button 4
RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
Servo myServo;
boolean buttonState = 0;
void setup() {
pinMode(button, INPUT);
myServo.attach(5);
radio.begin();
radio.openWritingPipe(addresses[0]); // 00001
radio.openReadingPipe(1, addresses[1]); // 00002
radio.setPALevel(RF24_PA_MIN);
}
void loop() {
delay(5);
radio.startListening();
if ( radio.available()) {
while (radio.available()) {
int angleV = 0;
radio.read(&angleV, sizeof(angleV));
myServo.write(angleV);
}
delay(5);
radio.stopListening();
buttonState = digitalRead(button);
radio.write(&buttonState, sizeof(buttonState));
}
}
Code language: Arduino (arduino)
Что здесь отличается от предыдущего примера, так это то, что нам нужно создать два канала или адреса для двунаправленной связи.
const byte addresses[][6] = {"00001", "00002"};
Code language: Arduino (arduino)
В разделе настройки нам нужно определить оба канала, и обратите внимание, что адрес записи на первом Arduino должен быть адресом чтения на втором Arduino, и наоборот, адрес чтения на первом Arduino должен быть адресом записи на второй Ардуино.
// at the Transmitter
radio.openWritingPipe(addresses[1]); // 00001
radio.openReadingPipe(1, addresses[0]); // 00002
Code language: Arduino (arduino)
// at the Receiver
radio.openWritingPipe(addresses[0]); // 00002
radio.openReadingPipe(1, addresses[1]); // 00001
Code language: Arduino (arduino)
В секции цикла с помощью функции radio.stopListening() мы устанавливаем первый Arduino в качестве передатчика, считываем и отображаем значение джойстика от 0 до 180 и с помощью функции radio.write() отправляем данные на приемник.П>
radio.stopListening();
int potValue = analogRead(A0);
int angleValue = map(potValue, 0, 1023, 0, 180);
radio.write(&angleValue, sizeof(angleValue));
Code language: Arduino (arduino)
С другой стороны, используя функцию radio.startListening(), мы устанавливаем второй Arduino в качестве приемника и проверяем, есть ли доступные данные. Пока есть доступные данные, мы их считываем, сохраняем в переменной «angleV», а затем используем это значение для вращения серводвигателя.
radio.startListening();
if ( radio.available()) {
while (radio.available()) {
int angleV = 0;
radio.read(&angleV, sizeof(angleV));
myServo.write(angleV);
}
Code language: Arduino (arduino)
Затем в передатчике мы устанавливаем первый Arduino в качестве приемника и с помощью пустого цикла «пока» ждем, пока второй Arduino отправит данные, а это данные о состоянии кнопки, независимо от того, нажата она или нет. Если кнопка нажата, загорается светодиод. Таким образом, этот процесс постоянно повторяется, и обе платы Arduino постоянно отправляют и получают данные.
Пример 3. Отправка нескольких переменных в одном пакете
Давайте рассмотрим еще один пример кода с использованием модулей NRF24L01. Все остается так же, как и в предыдущих примерах, за исключением того, как мы структурируем и отправляем дату.
Код передатчика
/*
Arduino Wireless Communication Tutorial
Example 1 - Transmitter Code
by Dejan Nedelkovski, www.HowToMechatronics.com
Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
byte a = 0;
byte b = 125;
byte c = 255;
int d = 1024;
float e = 3.141592;
String f = "Test";
};
Data_Package data; // Create a variable with the above structure
void setup() {
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
}
void loop() {
// Send the whole data from the structure to the receiver
radio.write(&data, sizeof(Data_Package));
delay(500);
}
Code language: Arduino (arduino)
Итак, мы можем создать структуру, которая на самом деле представляет собой набор различных типов переменных.
// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
byte a = 0;
byte b = 125;
byte c = 255;
int d = 1024;
float e = 3.141592;
String f = "Test";
};
Data_Package data; // Create a variable with the above structure
Code language: Arduino (arduino)
Мы должны иметь в виду, что максимальный размер данных этой структуры может составлять 32 байта. Здесь мы видим, что я включил три переменных типа byte, одну целочисленную переменную (4 байта), одну переменную с плавающей запятой (4 байта) и одну строку, содержащую четыре символа (4 байта). Всего 15 байт.
Код получателя
/*
Arduino Wireless Communication Tutorial
Example 1 - Receiver Code
by Dejan Nedelkovski, www.HowToMechatronics.com
Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
byte a = 0;
byte b = 125;
byte c = 255;
int d = 1024;
float e = 3.141592;
String f = "Test";
};
Data_Package data; //Create a variable with the above structure
void setup() {
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
}
void loop() {
// Check whether there is data to be received
if (radio.available()) {
radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure
}
Serial.print("a: ");
Serial.print(data.a);
Serial.print(" b: ");
Serial.print(data.b);
Serial.print(" c: ");
Serial.print(data.c);
Serial.print(" d: ");
Serial.print(data.d);
Serial.print(" e: ");
Serial.print(data.e);
Serial.print(" f: ");
Serial.println(data.f);
}
Code language: Arduino (arduino)
На стороне получателя мы должны определить те же данные структуры, чтобы иметь возможность получать входящие данные. Чтобы проверить, правильно ли работает беспроводная связь, я распечатал каждую переменную на последовательном мониторе.
Заключение
Модуль NRF24L01 — отличный вариант, когда вам нужна беспроводная связь для вашего проекта Arduino. Я уже использовал этот модуль во многих своих проектах Arduino.
Здесь я перечислю все свои проекты, в которых я использовал эти модули.
- Беспроводное управление роботом-автомобилем Arduino с использованием Bluetooth HC-05, модулей приемопередатчика NRF24L01 и HC-12
- Проект беспроводной метеостанции Arduino
- Радиоуправляемый передатчик Arduino своими руками
- Робот Arduino Ant Hexapod
- Радиоуправляемый корабль на воздушной подушке на базе Arduino своими руками
- Робот на колесах Arduino Mecanum
- Сделай сам радиоуправляемый приемник Arduino для радиоуправляемых моделей и проектов Arduino
- Самолет на радиоуправлении Arduino | 100 % сделай сам.
В каждом из этих проектов/учебников есть подробное объяснение того, как использовать модуль NRF24L01, включая принципиальные схемы, улучшенную реализацию кода для улучшения связи и т. д.
Мой любимый проект — это специально разработанный радиоуправляемый передатчик Arduino. На самом деле это 14-канальный RC-контроллер, который можно использовать для управления практически любым проектом Arduino.
Это все для этого урока, я надеюсь, вам понравилось и вы узнали что-то новое. Как всегда, не стесняйтесь задавать любые вопросы в разделе комментариев ниже.
Производственный процесс
- Как измерить качество воздуха на OpenSensors
- Как взломать ИК-пульты
- Какой ты рост?
- Генератор волн JX
- Скейтборд виртуальной реальности «Сделай сам»
- Как связать Arduino Mega с GPS-модулем NEO-6M
- Насколько легко использовать термистор ?!
- Как создавать музыку с помощью Arduino
- Как использовать Modbus с Arduino
- Вот идея:как работает интерфейс мозг-компьютер