Найти в Дзене
Электроника, Arduino и IT

Подключение NRF24L01+PA+LNA к Arduino. Побеждаем радиомодули

Оглавление

Приветствую Вас дорогие читатели, на этот раз я покажу вам как подключить радиомодуль 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м.

Радиомодуль NRF24L01+PA+LNA
Радиомодуль NRF24L01+PA+LNA

Подключение питания:
►  VCC: Питание 3.3В
►  GND: Земля

Группа контактов для подключения к Arduino:
►  CE: Выбор ведомого
►  CSN: Режим работы (прием или передача)
►  SCK: Тактирование
►  MOSI: Прием данных
►  MISO: Передача данных
►  IRO: Выход прерывания (не используется в данной статье)

Подключение библиотеки

Модуль использует библиотеку RF24, которую можно скачать тут или с GitHub.
Для установки библиотеки перейдите в Скетч —>  Подключить Библиотеку —>  Добавить ZIP Библиотеку и выберите файл RF24.zip, который Вы загрузили, либо скопируйте папку библиотеки в папку libraries среды Arduino IDE.

Для этого модуля также выпускается специальный адаптер, который я рекомендую приобрести. Этот модуль очень требователен к питанию, адаптер же позволяет сделать питание стабильным.

Адаптер для NRF24L01
Адаптер для NRF24L01

Характеристики модуля 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.

Адаптер с установленным NRF24L01+
Адаптер с установленным NRF24L01+

►  Напряжение питания: 4.8В … 12В (рекомендуемое 5В)
►  Выходное напряжение: 3.3В
►  Максимальный рабочий ток: до 800 мА

-4

Подключение NRF24L01 к Arduino

Подключение NRF24L01 к Arduino. Изображение с сайта RobotChip
Подключение NRF24L01 к Arduino. Изображение с сайта RobotChip
Схема подключения NRF24L01 к Arduino
Схема подключения 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");

}

В результате в мониторе порта получается такая картинка (вывод может отличаться):

-7

Если у Вас повсюду в адресах 0 или f, например 0x000000000f или 0xfffffffffffff, то проверьте, правильно ли вы подключили модуль. У меня так ожил вроде бы "нерабочий" модуль.

Теперь смотрим дальше. Постепенно выведется подобная картина:

-8

В первой строке - первая цифра номера канала, во второй строке - вторая (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); // выводим текст в монитор порта

}

}

Если всё заработало, и данные успешно передаются и выводятся в монитор порта, если Вы ещё не напаяли конденсаторы на приёмник и передатчик, то рекомендую это сделать. Это позволяет значительно улучшить качество связи. Например, при тестировании модулей в квартире, когда модули были в её разных концах, приёмник ничего не получал. Но с напаянными конденсаторами приёмник стал получать данные от передатчика.

На этот раз всё, всем спасибо за внимание и удачи в проектах!