Главная » Arduino » Подключение радиомодуля nRF24L01 + к Arduino UNO

Подключение радиомодуля nRF24L01 + к Arduino UNO

Эта статья является логическим продолжением предыдущей статьи, где мы подробно рассмотрели особенности радиомодуля nRF24L01 +, привели его характеристики, распиновку выводов и описали его работу.

Сегодня продолжим изучение модуля nRF24L01 + и рассмотрим вопрос подключения радиомодуля nRF24L01 + к Arduino UNO.

Подключение приемопередающего модуля nRF24L01 + к Arduino UNO

Теперь, когда у нас есть полное понимание того, как работает радиомодуль nRF24L01 +, мы можем подключить его к нашей Arduino!

Для начала подключите контакт VCC модуля к 3,3 В Arduino, а контакт GND — к земле. Контакты CSN и CE могут быть подключены к любому цифровому контакту на Arduino. В нашем случае это цифровые выводы 8 и 9 соответственно. Теперь только остались выводы, которые используются для связи по шине SPI.

Поскольку модуль nRF24L01 + обеспечивает передачу  большого объема данных, то он может обеспечивать наилучшую производительность при подключении к аппаратным выводам SPI Arduino. Аппаратные выводы SPI намного быстрее, чем программные.

Обратите внимание, что каждая плата Arduino имеет разные выводы SPI, которые должны быть подключены соответствующим образом. Для плат Arduino, таких как UNO / Nano V3.0, этими цифровыми контактами являются 13 (SCK), 12 (MISO) и 11 (MOSI).

Если у вас Mega, то контакты будут другие! Вы должны использовать 50 (MISO), 51 (MOSI), 52 (SCK) и 53 (SS). См. Таблицу ниже для быстрого понимания.

MOSI MISO SCK
Arduino Uno 11 12 13
Arduino Nfno 11 12 13
Arduino Mega 51 50 52

В случае, если вы используете плату Arduino, отличную от упомянутых выше, рекомендуется проверить официальную документацию Arduino, прежде чем продолжить.

Подключение nRF24L01 + к Arduino UNO
Подключение nRF24L01 + к Arduino UNO
Подключение nRF24L01 + PA LNA к Arduino UNO
Подключение nRF24L01 + PA LNA к Arduino UNO

Библиотека Arduino RF24 для модуля nRF24L01

Взаимодействие с модулем приемопередатчика nRF24L01 + — это сложная работа, но, к счастью для нас, существует ряд доступных библиотек. Одна из популярных библиотек — RF24.

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

Вы можете скачать последнюю версию библиотеки RF24 на репозитория GitHub

Чтобы установить ее, откройте Arduino IDE, перейдите в «Эскиз»> «Include Library»> «Добавить .ZIP-библиотеку» и выберите только что загруженный мастер-файл RF24.

Инвертор 12 В/ 220 В
Инвертор с чистой синусоидой, может обеспечивать питание переменно...
Подробнее

Скетч для передатчика

В нашем эксперименте мы просто отправим традиционное сообщение «Hello World» от передатчика к приемнику.

Вот скетч, который мы будем использовать для нашего передатчика:

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//create an RF24 object
RF24 radio(9, 8);  // CE, CSN

//address through which two modules communicate.
const byte address[6] = "00001";

void setup()
{
  radio.begin();
  
  //set the address
  radio.openWritingPipe(address);
  
  //Set module as transmitter
  radio.stopListening();
}
void loop()
{
  //Send message to receiver
  const char text[] = "Hello World";
  radio.write(&text, sizeof(text));
  
  delay(1000);
}

Код начинается с подключения  библиотек. Библиотека SPI.h управляет связью SPI, а nRF24L01.h и RF24.h модулем:

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

Далее нам нужно создать объект RF24. Объект принимает два номера контактов в качестве параметров, к которым подключены сигналы CE и CSN:

//create an RF24 object
RF24 radio(9, 8);  // CE, CSN

Затем нам нужно создать байтовый массив, который будет представлять адрес канала, через который будут связываться два модуля nRF24L01 +:

//address through which two modules communicate.
const byte address[6] = "00001";

Мы можем изменить значение этого адреса на любую 5-буквенную строку, например «node1». Адрес необходим, если у вас есть несколько модулей в сети. Благодаря адресу вы можете выбрать конкретный модуль, с которым вы хотите общаться, поэтому в нашем случае у нас будет один и тот же адрес как для передатчика, так и для приемника.

Далее в функции setup() нам нужно инициализировать радиообъект, используя radio.begin() и используя radio.openWritingPipe() функцию, мы устанавливаем адрес передатчика:

//set the address
radio.openWritingPipe(address);

Наконец, мы будем использовать radio.stopListening() функцию, которая устанавливает модуль в качестве передатчика:

//Set module as transmitter
radio.stopListening();

В разделе loop () мы создаем массив символов, которым мы назначаем сообщение «Hello World». Используя radio.write() функцию, мы отправим это сообщение приемнику.

Первый аргумент здесь — это сообщение, которое мы хотим отправить. Второй аргумент — это количество байтов, присутствующих в этом сообщении:

const char text[] = "Hello World";
radio.write(&text, sizeof(text));

С помощью этого метода вы можете отправлять до 32 байтов за раз. Потому что это максимальный размер одного пакета, который может обработать nRF24L01 +. Если вам нужно подтверждение, что получатель получил данные, функция radio.write() возвращает bool значение. Если он возвращает TRUE, данные достигли получателя. Если он возвращает FALSE, данные были потеряны.

Внимание! Функция radio.write () блокирует программу, пока она не получит подтверждение или не исчерпает все попытки повторной передачи.

Скетч для приемника

Вот код, который мы будем использовать для нашего приемника:

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//create an RF24 object
RF24 radio(9, 8);  // CE, CSN

//address through which two modules communicate.
const byte address[6] = "00001";

void setup()
{
  while (!Serial);
    Serial.begin(9600);
  
  radio.begin();
  
  //set the address
  radio.openReadingPipe(0, address);
  
  //Set module as receiver
  radio.startListening();
}

void loop()
{
  //Read the data if available in buffer
  if (radio.available())
  {
    char text[32] = {0};
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }
}

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

В начале функции setup() мы запускаем последовательную связь. Затем, используя функцию radio.setReadingPipe(), мы устанавливаем тот же адрес, что и у передатчика, и таким образом включаем связь между передатчиком и приемником:

//set the address
  radio.openReadingPipe(0, address);

Первый аргумент — номер потока. Вы можете создать до 6 потоков, которые отвечают на разные адреса. Мы создали только адрес для потока номер 0. Второй аргумент — это адрес, на который поток будет реагировать для сбора данных.

Следующим шагом является установка модуля в качестве приемника и начало приема данных. Для этого мы используем функцию radio.startListening(). С этого момента модем ожидает отправки данных на указанный адрес:

//Set module as receiver
  radio.startListening();

В функции loop()  Arduino проверяет, были ли получены какие-либо данные по адресу, используя функцию radio.available(). Эта функция возвращает значение TRUE, если в буфере доступны какие-либо данные:

if (radio.available())
  {
    char text[32] = {0};
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }

Если данные получены, то создается массив из 32 символов, заполненный нулями (позже программа заполнит его полученными данными). Для чтения данных мы используем функцию radio.read (& text, sizeof (text)). Это сохранит полученные данные в наш массив символов.

В конце мы просто печатаем полученное сообщение на серийном мониторе. Если вы все сделали правильно и в соединениях нет ошибок, вы должны увидеть что-то подобное в вашем Serial Monitor:

Результат в Serial Monitor

Улучшение дальности передачи модуля nRF24L01 +

Ключевым параметром для системы беспроводной связи является дальность связи. Во многих случаях это решающий фактор в пользу выбора радиочастотного решения. Итак, давайте обсудим, что мы можем сделать, чтобы получить хорошую дальность связи для нашего модуля.

Уменьшить шум источника питания

ВЧ цепь, которая генерирует радиочастотный (РЧ) сигнал, очень чувствительна к шуму источника питания. Если не контролировать шум источника питания да большую дальность связи можно не рассчитывать.

Если источник питания не является автономным аккумулятором, существует высокая вероятность того, что при генерации сигнала будет шум. Чтобы этот шум не попал в систему, рекомендуется разместить фильтрующий конденсатор емкостью 10 мкФ на линии электропитания как можно ближе к модулю nRF24L01 +.

Самый простой способ покончить с этим — использовать очень недорогой адаптерный модуль для nRF24L01.

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

Этот адаптер имеет 8-контактный разъем, позволяющий подключить модуль nRF24L01. Он может соединяться как с модулем, который мы обсуждали ранее (со встроенной антенной), так и с внешней антенной (PA/LNA). Адаптер также имеет 6-контактный разъем для подключения SPI и прерываний и 2-контактный разъем для ввода питания.

Модуль адаптера имеет собственный регулятор напряжения 3,3 В и набор конденсаторов фильтра, поэтому вы можете подключить его к источнику питания 5 В.

Изменить частоту канала

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

Чтобы эти сигналы не вызывали проблем, мы рекомендуем использовать модуль nRF24L01 + с самыми высокими 25 каналами. Причиной этого является то, что WiFi использует большинство нижних каналов.

Более низкая скорость передачи данных

NRF24L01 + обеспечивает максимальную чувствительность приемника при скорости 250 Кбит/с, которая составляет -94 дБм. Однако при скорости передачи данных 2 Мбит с чувствительность приемника падает до -82 дБм.

Если вы общаетесь на этой скорости, вы знаете, что приемник на скорости 250 Кбит/с почти в 10 раз более чувствителен, чем на 2 Мбит/с. Это означает, что приемник может декодировать сигнал, который в 10 раз слабее.

Что означает чувствительность приемника (Rx)?

Чувствительность приемника — это самый низкий уровень мощности, при котором приемник может обнаруживать РЧ-сигнал. Чем больше абсолютное значение отрицательного числа, тем лучше чувствительность приемника. Например, чувствительность приемника -94 дБм лучше, чем чувствительность приемника -82 дБм на 12 дБ.

Таким образом, снижение скорости передачи данных может значительно улучшить дальность связи, которую вы можете достичь. Кроме того, для большинства наших проектов скорость 250 Кбит/с более чем достаточна.

Более высокая выходная мощность

Установка максимальной выходной мощности также может улучшить дальность связи. NRF24L01 + позволяет вам выбрать уровень выходной мощности, а именно: 0 дБм, -6 дБм, -12 дБм или -18 дБм. Выбор выходной мощности 0 дБм посылает более сильный сигнал.



Тестер транзисторов / ESR-метр / генератор
Многофункциональный прибор для проверки транзисторов, диодов, тиристоров...
Подробнее



Добавить комментарий