Приветствую Вас дорогие читатели, на этот раз я покажу вам как подключить радиомодуль NRF24L01 + PA + LNA к Arduino и заставить его работать.
В этом уроке использованы:
1. Плата Arduino Uno 2шт. (возможно использование arduino nano, mega...)
2. Компьютер с установленной Arduino IDE и драйверами для плат
3. Соединительные провода
4. Радиомодуль NRF24L01 + PA + LNA 2шт.
5. Адаптер для NRF24L01 2шт.
6. Конденсатор 2-10 мкф (необязателен)
Описание NRF24L01+PA+LNA
На NRF24L01+PA+LNA установлен разъем SMA с внешней антенной. Он оснащен чипом, который объединяет схемы коммутации PA и LNA (передачи и приема). Эта микросхема совместно с антенной расширяет диапазон работы модуля NRF24L01 + PA + LNA и позволяет достичь значительно большего диапазона передачи около 1км, в отличие от NRF24L01+ со встроенной антенной, диапазон передачи которой достигает 100м.
Подключение питания:
► VCC: Питание 3.3В
► GND: Земля
Группа контактов для подключения к Arduino:
► CE: Выбор ведомого
► CSN: Режим работы (прием или передача)
► SCK: Тактирование
► MOSI: Прием данных
► MISO: Передача данных
► IRO: Выход прерывания (не используется в данной статье)
Подключение библиотеки
Модуль использует библиотеку RF24, которую можно скачать тут или с GitHub.
Для установки библиотеки перейдите в Скетч —> Подключить Библиотеку —> Добавить ZIP Библиотеку и выберите файл RF24.zip, который Вы загрузили, либо скопируйте папку библиотеки в папку libraries среды Arduino IDE.
Для этого модуля также выпускается специальный адаптер, который я рекомендую приобрести. Этот модуль очень требователен к питанию, адаптер же позволяет сделать питание стабильным.
Характеристики модуля NRF24L01 + PA + LNA
► Напряжение питания: от 3В до 3.6В (рекомендуется 3.3В)
► Потребляемый ток при мощности 0dBm: 45 мА
► Потребляемый ток при передачи 2 Мбит: 115 мА
► Максимальная выходная мощность: +20dBm
► Частота: 2.4 ГГц
► Коэффициент усиления антенны (макс.): 2dBi
► Скорость передачи: 2MB (открытое пространство): 520 м.
► Скорость передачи: 1 MB (открытое пространство): 750 м.
► Скорость передачи: 250 Kb (открытое пространство): 1000 м.
► Размеры: 46мм x 17мм x 12мм (длина антенны 115 мм)
► Интерфейс: SPI
Если Вы обратите внимание, то можно заменить, что чем ниже скорость передачи, тем больше диапазон связи.
Описание и характеристики адаптера для NRF24L01
Адаптер разработан для модулей NRF24L01+ и NRF24L01+PA+LNA. На нём установлен стабилизатор напряжения AMS1117 на 3.3В. Имеется три группы контактов: подключение питания, подключение модуля и группа контактов для подключения к arduino.
Подключение питания:
► VCC: Питание 5В
► GND: Земля
Группа контактов для подключения к Arduino:
► CE: Выбор ведомого
► CSN: Режим работы (прием или передача)
► SCK: Тактирование
► MOSI: Прием данных
► MISO: Передача данных
► IRO: Выход прерывания (не используется в данной статье)
Группа контактов для подключения модуля состоит из контактов с таким же назначением, как в предыдущих двух группах, за исключением VCC 3.3V.
► Напряжение питания: 4.8В … 12В (рекомендуемое 5В)
► Выходное напряжение: 3.3В
► Максимальный рабочий ток: до 800 мА
Подключение NRF24L01 к Arduino
При подключении NRF24L01 важно не перепутать выводы 3.3V и 5V. Это может испортить модуль! Схема подключения NRF24L01 с адаптером такая же, только VCC адаптера нужно подключать к 5V Arduino. Приёмник и передатчик подключаются одинаково.
Заставляем NRF24L01 работать
Казалось, всё просто, подключили и всё заработало. Но не всё так просто... Подключены верно, питание стабильное, но они не работают... Можно винить себя, что это я их сломал, пересмотреть сотню раз схему (так и я делал), а дело может быть вообще не в Вас и не в схеме.
Вот этот скетч позволяет проверить работоспособность модуля и правильность подключения:
#include <SPI.h> // библиотека для обмена данными по протоколу SPI
#include <nRF24L01.h> // библиотека для nRF24L01+
#include <RF24.h> // библиотека для радио модуля
RF24 radio(9,10); // Для MEGA2560 замените на RF24 radio(9,53);
const uint8_t num_channels = 128;
uint8_t values[num_channels];
int serial_putc( char c, FILE * ) {
Serial.write( c );
return c;
}
void printf_begin(void) {
fdevopen( &serial_putc, 0 );
}
void setup(void)
{
Serial.begin(9600);
printf_begin();
radio.begin();
radio.setAutoAck(false);
radio.startListening(); // включаем прием сигнала
radio.printDetails(); // если правильно соединили, то увидите настройки модуля
delay(10000); // задержка на 10 секунд
radio.stopListening(); // выключаем прием сигнала
int i = 0; // вывод заголовков всех 127 каналов
while ( i < num_channels ) {
printf("%x",i>>4);
++i;
}
printf("\n\r");
i = 0;
while ( i < num_channels ) {
printf("%x",i&0xf);
++i;
}
printf("\n\r");
}
const int num_reps = 100;
void loop(void)
{
memset(values, 0, sizeof(values));
int rep_counter = num_reps;
while (rep_counter--) {
int i = num_channels;
while (i--) {
radio.setChannel(i);
radio.startListening(); // включаем прием сигнала
delayMicroseconds(128);
radio.stopListening(); // выключаем прием сигнала
if ( radio.testCarrier() )
++values[i];
}
}
int i = 0;
while ( i < num_channels ) {
printf("%x", min(0xf, values[i] & 0xf));
++i;
}
printf("\n\r");
}
В результате в мониторе порта получается такая картинка (вывод может отличаться):
Если у Вас повсюду в адресах 0 или f, например 0x000000000f или 0xfffffffffffff, то проверьте, правильно ли вы подключили модуль. У меня так ожил вроде бы "нерабочий" модуль.
Теперь смотрим дальше. Постепенно выведется подобная картина:
В первой строке - первая цифра номера канала, во второй строке - вторая (hex). Ниже выводится уровень зашумленности канала при каждом тесте. Если у вас везде одни нули, то либо модуль подключён неправильно, либо нужно напаять конденсатор 2-10 мкф между плюсом и минусом на модуле, а если и тогда не заработало, то параллельно припаяйте керамический конденсатор, а если снова нет - можете посетить форум на сайте Amperka, там написано 130 страниц про эти модули).
Если же всё это не помогло, то он серьёзно может быть нерабочим изначально. Посмотрев различные статьи и видео на YouTube, я узнал, что они действительно могут быть нерабочими изначально. Одни нули говорят о том, что он вообще ничего не принимает. А здесь только два варианта: либо Вы живёте в 1000 км от цивилизации (что точно не подходит), либо модуль нерабочий. Именно так я мучался с одним из своих модулей, что только с ним не делал, ничего не помогло. Но стоило только купить новый, подключить по абсолютно такой же схеме, и он заработал!
Тестирование NRF24L01
Если же всё прошло успешно, и модули определились, то можно перейти к тестированию. Один из модулей является передатчиком и отправляет сообщение HelloWorld на приёмник. Приёмник выводит сообщение в монитор порта. В данном примере модули используют канал 0x6f. Вы можете выбрать любой другой незашумлённый канал.
Код передатчика:
#include <SPI.h> // Подключаем библиотеку SPI
#include <nRF24L01.h> // Подключаем библиотеку nRF24L01
#include <RF24.h> // Подключаем библиотеку RF24
RF24 radio(9,10); // Указываем номера выводов nRF24L01: CE и CSN
// (9, 10) у Arduino Uno и (9, 53) у Arduino Mega
const uint32_t pipe = 111156789; // адрес "трубы" - адрес передатчика
void setup() {
radio.begin(); // Инициируем работу nRF24L01
radio.setChannel(0x6f); // Устанавливаем канал
radio.openWritingPipe(pipe); // Открываем "трубу" отправки данных
radio.stopListening(); // Прекращаем прослушивание
}
void loop() {
const char text[] = "Hello World"; // Текст сообщения
radio.write(&text, sizeof(text)); // Отсылаем текст
delay(1000); // Задержка 1с
}
Теперь перейдём к коду приёмника.
#include <SPI.h> // Подключаем библиотеку SPI
#include <nRF24L01.h> // Подключаем библиотеку nRF24L01
#include <RF24.h> // Подключаем библиотеку RF24
RF24 radio(9,10); // Указываем номера выводов nRF24L01: CE и CSN
const uint32_t pipe = 111156789; // адрес "трубы" - адрес приёмника
void setup() {
while (!Serial); // для Leonardo и т. п. плат
// ждёт пока откроем монитор порта
Serial.begin(9600); // устанавливаем скор. обмена данными 9600 бод
radio.begin(); // Инициируем работу nRF24L01
radio.setChannel(0x6f); // Устанавливаем канал
radio.openReadingPipe(0, pipe); // Открываем "трубу" чтения
radio.startListening(); // начинаем прослушивать
}
void loop() {
if (radio.available()) { // если модуль получил информацию
char text[32] = {0}; // переменная, хранящая текст сообщения
radio.read(&text, sizeof(text)); // читаем текст сообщения
Serial.println(text); // выводим текст в монитор порта
}
}
Если всё заработало, и данные успешно передаются и выводятся в монитор порта, если Вы ещё не напаяли конденсаторы на приёмник и передатчик, то рекомендую это сделать. Это позволяет значительно улучшить качество связи. Например, при тестировании модулей в квартире, когда модули были в её разных концах, приёмник ничего не получал. Но с напаянными конденсаторами приёмник стал получать данные от передатчика.
На этот раз всё, всем спасибо за внимание и удачи в проектах!