Nrf24l01+
Содержание
- 1 Взаимодействие nRF24L01 с Arduino
- 2 Подключение nRF24L01 к Ардуино
- 3 Работа BMP280
- 4 Рабочее расстояние NRF24L01
- 5 Скетчи для nRF24L01 и Arduino
- 6 Скетч для передатчика
- 7 Организация питания nrf24l01
- 8 Работа NRF24L01
- 9 Технические характеристики
- 10 Принцип работы и основные настройки nRF24L01 +
- 11 Команды
- 12 Улучшение дальности передачи модуля nRF24L01 +
- 13 Как работает радиомодуль nRF24L01 +?
- 14 Ардуино код для Мастера
- 15 Краткое описание
- 16 Enhanced ShockBurst
- 17 Варианты подключения к «Ардуино»
Взаимодействие nRF24L01 с Arduino
В этом руководстве мы узнаем, как связать nRF24L01 с Arduino, управляя серводвигателем, подключенным к одной плате Arduino, путем изменения потенциометра, подключенного к другой плате Arduino. Для простоты мы использовали один модуль nRF24L01 в качестве передатчика и один в качестве приемника, но каждый модуль может быть отдельно запрограммирован для передачи и приема данных.
Принципиальная схема подключения модуля nRF24L01 к Arduino приведена ниже. Для разнообразия я использовал UNO для приемной части и Nano для предающей части. Но для других плат Arduino, таких как Mini и Mega, логика подключения остается неизменной.
Подключение nRF24L01 к Ардуино
Вывод MOSI с платы nRF24L01 подключается к пину 11 для Ардуино Uno, Nano и на 51 для Arduino Mega. Контакт SCK нужно подключить к 13 для Ардуино Uno, Nano и 52 для Arduino Mega. MISO – к 12 для Ардуино Uno, Nano и 50 для Arduino Mega. Контакты CE и CSN подключаются к любому цифровому пину Ардуино. Питание – на 3,3 В. Если используется плата Arduino Mini, придется использовать внешний стабилизатор напряжения, так как на плате отсутствует выход 3,3В. Также к пинам питания можно добавить конденсатор на 10 мкФ и более для обеспечения стабильной и качественной работы. Модуль с припаянным конденсатором изображен на рисунке.
Питание для NRF2401
Внешний вид макета представлен на рисунке ниже.
При подключении важно не перепутать напряжение – 5 Вольт могут вывести модуль из строя
Подключение к Ардуино через адаптер NRF24L01
Адаптер специально разрабатывался для модуля NRF24L01+. На нем имеется специальный стабилизатор напряжения и удобно расположены выходы к контроллерам и платам Ардуино.
Как видно, на адаптере имеется 2 вида разъемов. Двухрядный разъем используется для подключения радиомодуля, однорядный – для соединения с Ардуино. Отдельно расположены выходы на питание (5В) и землю.
Для подключения радиомодуль NRF24L01+ нужно вставить в соответствующий двухуровневый разъем. При помощи проводов адаптер подключается к плате Ардуино к тем же выводам, которые нужны для подключения напрямую к модулю. Для подключения к Arduino Uno, Nano: MISO-12, MOSI-11, SCK-13,выводы CE –к D10 и CSN – D9, вывод VCC к Arduino (+5V), а вывод GND к Arduino (GND).
Работа BMP280
BMP280 поставляется в различных типах в зависимости от того, где вы его покупаете. Имейте в виду, так как некоторые из них являются устройствами с 5 В, а некоторые — с 3.3 В. Кроме того, некоторые — SPI или I2C, а некоторые — нет. В этой статье будет использована версия I2C 3.3 В. Эта, хотя и 3 В, соответствует 5 В на выводах данных. Мы используем I2C версию, так как NRF24L01 использует шину SPI.
BMP280
Диапазон давления составляет от 300 до 1100 гПа, что примерно на 500 м ниже уровня моря до 9 км в высоту и между 950 и 1050 гПа, а точность высоты +/-1 м, что довольно неплохо. Диапазон температур составляет от 40 до 85 °C с точностью +/-1 °C и 0,5 при 25.
На некоторых устройствах адрес I2C установлен на 0x77, а на других — на 0x76. На официальном сайте Arduino есть полезный сканер адресов по этой ссылке. Если он не найдет адрес, проверьте проводку.
Рабочее расстояние NRF24L01
Расстояние зависит от внешних условий. То есть: находитесь вы в помещении или на улице, есть ли препятствия на пути сигнала от радиопередатчика. Большинство производителей модулей nRF24L01 с маленькой мощностью передатчика указывают расстояние его действия 200 футов или 100 метров. Это характеристика передатчиков, которые используются на открытом воздухе, без препятствий на пути сигнала. Частота передатчика настроена на 2500 кГц. Внутри помещений, из-за наличия стен и других преград расстояние срабатывания будет меньше.
Рекомендуем протестировать ваш радиопередатчик в конкретных условиях перед его использованием. Кроме того, есть некоторые модификации радиопередатчиков nRF24L01 с внешней антенной, которая усиливает сигнал. Каждая конкретная ситуация накладывает свои ограничения, так что установить точную характеристику расстояния их действия невозможно.
Существуют дополнительные модули для трансмиттера/ресивера (передатчика/приемника), которые обеспечивают беспроводную радиопередачу на расстояния до 1 км! Эти модули используют внешнюю антенну, которая может устанавливаться непосредственно на модуль или антенна, которая подключается с помощью дополнительных коннекторов. На фото ниже приведены несколько разновидностей модулей.
Слева маломощная версия передатчика со встроенной антенной. Справа вы можете увидеть нижние контакты (на фото они сверху), которые подключаются к Arduino. Схему подключения мы рассмотрим позже.
На фото ниже показаны трансмиттер с возможностью подключения внешней антенны и сама антенна. Для подключения радиопередатчика к Arduino используются те же 8 контактов и тот же софт.
Трансивер использует частоту 2.4 ГГц, как и большинство современных WiFi роутеров, телефонов.
Подобные трансиверы отправляют и принимают пакеты данных по несколько байт. Предусмотрена встроенная коррекция погрешностей и возможность отправить данные еще раз. Каждый отдельный модуль NRF24L01 может одновременно обмениваться данными с шестью! аналогичными модулями!
Этот недорогой модуль не так просто освоить, но талантливые люди написали библиотеки для Arduino, благодаря которым использовать эти передатчики стало на порядок проще. Ниже приведены примеры использования передатчиков с Arduino и ссылки на библиотеки, которые вам понадобятся. На рисунках ниже показана схема подключения NRF24L01 к Arduino, которая используется во всех последующих примерах.
Подключение NRF24L01 к Arduino (вид сверху):
Подключение NRF24L01 к Arduino (вид снизу):
Сигнал | Контакт на модуле RF | Цвет кабеля | Пин на модуле | Контакт на Arduino (библиотека TMRh20,RF24) | Контакт на Arduino (библиотека RF24) | Контакт на Arduino (библиотека Mirf) | Контакт MEGA2560 (библиотека RF24) | Контакт Arduino (библиотека RH_NRF24 RadioHead) | Контакт MEGA2560 (библиотека RH_NRF24 RadioHead) |
---|---|---|---|---|---|---|---|---|---|
GND | 1 | Коричневый | GND | GND | GND | GND | GND | GND | GND |
VCC | 2 | Красный | VCC | 3.3 V | 3.3V | 3.3V | 3.3V | 3.3V | 3.3V |
CE | 3 | Оранжевый | CE | 7 | 9 | 8 | 9 | 8 | 8 |
CSN | 4 | Желтый | CSN | 8 | 10 | 7 | 53 | 10 | 53 |
SCK | 5 | Зеленый | SCK | 13 | 13 | 13 | 52 | 13 | 52 |
MOSI | 6 | Синий | MO | 11 | 11 | 11 | 51 | 11 | 51 |
MISO | 7 | Фиолетовый | MI | 12 | 12 | 12 | 50 | 12 | 50 |
IRQ | 8 | Серый | IRQ | — | 2 | Зависит от библиотеки | N/C | N/C |
Обратите внимание! Большинство проблем при передаче возникает из-за шумов от источника питания 3.3 В. Особенно это чувствуется при использовании плат Arduino Mega
Решить эту проблему можно следующим образом: добавить в схему конденсатор между контактом GND и 3.3 В на радио модуле. Можно использовать конденсаторы номиналом 100 нФ. Некоторые ставят конденсаторы номиналом от 1 пкФ до 10 пФ.
Цвета приведены для удобства кодировки. Вы можете использовать их иначе. Главное, не запутаться.
Обратите внимание, что модули подключаются к 3.3 В, а не 5.0 В, хотя ваш Arduino при этом может работать и от 5 В. NRF24L01+ IC рассчитан на питание от 3.3 В, но контакты выдержат и питание 5 В
На платах Arduino Uno и более ранних версиях есть выход 3.3 В, который можно использовать для некоторых версий передатчиков (смотрите в статье выше — проблемы с питанием). Но если вы используете более мощные передатчики, на них надо подавать отдельное питание на 3.3 В.
Скетчи для nRF24L01 и Arduino
Скетчи для nRF24L01 и Arduino
Пример: передача данных о положении координат джойстика Х и Y от одного модуля nRF24L01 к другому nRF24L01. Второй модуль получает данные положении джойстика и передает их на дальнейшее отображение.
Ниже два скетча. Загрузите первый на ваш первый Arduino, к которому подключен радиопередатчик nRF24L01 и джойстик (или можно использовать потенциометр). Второй скетч загрузите на Arduino с подключенным модулем nRf24L01.
/* YourDuinoStarter пример: nRF24L01 передаем данные о положении джойстика
— Что делает скетч: считывает аналоговые значения на контакте A0, A1 и передает их
с помощью радиопередатчика nRF24L01 приемнику.
— Подключение nRF24L01 модуля смотрите на:
1 — GND
2 — VCC 3.3V !!! НЕ 5V
3 — CE к Arduino пину 9
4 — CSN к Arduino пину 10
5 — SCK к Arduino пину 13
6 — MOSI к Arduino пину 11
7 — MISO к Arduino пину 12
8 — НЕ ИСПОЛЬЗУЕТСЯ
Аналоговый джойстик или два потенциометра 10 КОм:
GND к Arduino GND
VCC к Arduino +5V
X потенциометр к Arduino A0
Y потенциометр к Arduino A1 */
/*——(Импортируем необходимые библиотеки)——*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
/*——(Объявляем константы и номера пинов)——*/
#define CE_PIN 9
#define CSN_PIN 10
#define JOYSTICK_X A0
#define JOYSTICK_Y A1 // ПРИМЕЧАНИЕ: «LL» в конце константы — это тип данных «LongLong»
const uint64_t pipe = 0xE8E8F0F0E1LL;
/*——(Объявляем объекты)——*/
RF24 radio(CE_PIN, CSN_PIN); // Создаем объект Radio
/*——(Объявляем переменные)——*/
int joystick; // массив из 2-х элементов, в котором хранятся с джойстика
int i = 0;
void setup() /****** SETUP: ОТРАБАТЫВАЕТ 1 РАЗ ******/
{
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe);
}//—(завершение setup )—
void loop() /****** LOOP: ОТРАБАТЫВАЕТ В БЕСКОНЕЧНОМ ЦИКЛЕ ******/
{
joystick = i++;
joystick = i++;
radio.write( joystick, sizeof(joystick) );
delay(3);
}//—(завершаем главный цикл)—
Если что-то не работает???
В первую очередь проверьте питание 3.3 В. Хотя среднее значение силы тока питания равно 15 мА, бывают резкие скачки. В результате бывает такое, что передатчик отлично работает день/минуту, а потом перестает. Поэтому в схеме подключения желательно использовать конденсаторы на 10 мкФ между контактами GND и 3.3 В.
Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!
Скетч для передатчика
В нашем эксперименте мы просто отправим традиционное сообщение «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 = "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 = "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, данные были потеряны.
Организация питания nrf24l01
Во время запуска микроконтроллера могут возникнуть проблемы, которые связаны с тем, что не предусмотрена нужная сила тока в модуле питания 3,3 В. Из-за этого могут возникнуть помехи, мешающие стабильной работе. Обычно подобные трудности появляются, когда используются платы Arduino Uno, Nano, Mega, то есть в тех, в которых не хватает мощности. Для приведенных видов плат на пины подается небольшой ток 50 мА.
Существует несколько методов решения этой проблемы:
- Подключение конденсатора к микросхеме на 3, 3 В(+) и землю GND (-). Емкость лучше выбирать 10 мкФ и более.
- Дополнительный источник напряжения на 3,3 В.
- Разработка отдельной платы, установка на нее модуля nRF24L01 и добавление конденсаторов на 1 и 10 мкФ.
- Применение YourDuinoRobo1, который обладает дополнительным регулятором на 3,3 В.
Работа NRF24L01
NRF24L01 — это цифровой приемопередатчик с SPI-подключением, способный передавать и принимать данные в диапазоне 24 ГГц ISM (ISM — промышленный, научный и медицинский; Industrial, Scientific, Medical).
NRF24L01
Это тот же самый диапазон, который используется Bluetooth и WiFi, и не требует лицензирования, так как он маломощный. Это устройство с питанием от 3 В, но линии данных соответствуют 5 В, поэтому преобразование не требуется. Вы можете управлять его VCC выводом прямо с вывода 3,3 В Arduino Uno.
Интерфейс SPI работает со скоростью до 10 Мбит/с. Каждый модуль работает на одной и той же частоте или канале в диапазоне от 2,400 до 2,525 ГГц. Внутри каждого канала имеется 6 «линий», позволяющих установить до 6 связей в каждом канале. Это означает, что один мастер может прослушивать 6 ведомых устройств, все на одном канале, но на разных «линиях».
Технические характеристики
- Частота передачи/приема 2.4GHz.
- Дальность до 100м. В помещении — до 30м.
- Скорость до 2Mbps. Возможные варианты: 250kbps, 1Mbps и 2Mbps.
- Интерфейс взаимодействия с микроконтроллером — SPI. Выводы толерантны к 5 вольтам.
- Напряжение: 3-3.6В (рекомендуется 3,3В). При попытке подключения 5В вывод из строя маловероятен,но работать устройство отказывается..
-
Максимальная выходная мощность: 0dBm
-
Коэффициент усиления антенны (пиковая): 2dBm
- Количество каналов: 126. Нулевой канал начинается с 2400MHz и далее с шагом 1MHz,например 70 канал находится соответственно на 2470MHz. При установке скорости 2Mbps занимается ширина двух каналов.
Принцип работы и основные настройки nRF24L01 +
Частота 2.4ГГц очень популярна и на ней работает достаточно большое количество приборов, например: WiFi, радиоуправляемые модели, и тому подобное. Как они не мешают друг другу? Дело в том, что частота 2.4ГГц — это условное обозначение. На самом деле, имеется в виду диапазон частот, близкий к 2.4ГГц. nRF24L01+ работает на частотах 2.400-2.4835ГГц. Частота, на которой будут работать ваши модули, определяется номером канала. Каналы имеют шаг в 1МГц. То есть если Вы выбираете канал 0 — это частота 2.400ГГц, если канал 76 — 2.476ГГц. Разумеется, нужно выбирать свободную волну (канал) — иначе связь будет не стабильной или вообще отсутствовать.
Вы можете выбрать одну из трех скоростей передачи данных. Чем меньше скорость — тем больше чувствительность. То есть, при скорости 250kbps модули будут работать на большей дистанции, чем при более высоких скоростях.
На дальность работы модулей также влияет настройки выходной мощности модуля. Вы можете выбрать мощность в зависимости от приоритетов. То есть, если для вас важнее максимальная дальность, то надо выбрать максимальную мощность. Если приоритетной является экономичность, а дальность — несколько метров, разумно выбрать меньшую мощность сигнала. Интересное наблюдение в режиме приема данных (RX) модуль потребляет больший ток, чем в режиме передачи (TX).
Модуль nRF24L01+ в один момент времени может находиться в одном из режимов:
Power Down — выключен
Standby — спящий режим
RX Mode — режим ресивера (приемника)
TX Mode — режим трансмиттера (передатчика)
Диаграмма переходов из режима в режим изображенны на рисунке:
Информационный пакет, который передает модуль nRF24L01+ имеет следующий формат:
Preamble — Преамбула представляет собой последовательность битов и используется для синхронизации демодуляторов приемников.
Address — Адрес приемника. Адрес гарантирует, что пакет получит нужен приемник. Вы можете настроить длину адреса 3, 4 или 5 байт. Надо стараться чтобы адреса были уникальны. Но иногда Адреса могут быть одинаковые в нескольких nRF24L01+ если этого требуют Ваши задачи.
Packet Control Field — контрольное поле. Содержит: 6 бит, определяющих длину пакета (имеется в виду длина пакета полезных данных (от 0 до 32 байт)); 2 бита PID, используемые для определения является ли пакет новым или пересланным повторно; 1 бит — флаг NO_ACK.
Payload — полезный «груз». То есть данные, которые передает микроконтроллер. Может быть от 0 до 32 байт. Длину Payload можно настроить.
CRC — CRC является обязательным механизмом обнаружения ошибок в пакете. Длина CRC — 1 или 2 байта и зависит от общей длины пакета.
Для того, чтобы переданный пакет был принят нужным приемником, настройки приемника должны быть такими же, как и у передатчика. Если параметры пакета будут отличаться, приемник не сможет его обработать. Также надо корректно указывать адреса (об этом чуть ниже).
Если одновременно будут передавать несколько передатчиков, или возникнут другие препятствия, произойдет коллизия. Приемник не сможет получить пакет. Поэтому nRF24L01+ имеет настройку автоматической повторной отправки пакета (Aoto Retransmission (ART)). Эти настройки указывают с каким интервалом и сколько раз пытаться отправить пакет.
Как отмечалось в самом начале nRF24L01+ может работать на одном канале с 6-ю nRF24L01+. Для этого все модуля должны работать на одном канале, но каждый nRF24L01+ должен иметь уникальный адрес. Относительно адресации в документации приведена наглядная диаграмма:
Обратите внимание, что адреса для Data Pipe 1 — Pipe 5 отличаются друг от друга лишь последним байтом. Этого требует документация на nRF24L01+
На этой диаграмме модуль отмеченный как PRX прослушивает эфир для указанных адресов RX_ADDR_P0..RX_ADDR_P5. Каждый из PTX1..PTX6 отправляет пакеты на адреса TX_ADDR. Модуль, который работает как PRX тоже может отправлять модулям пакеты по их адресам.
Если все настройки (разумеется, кроме адресов) будут одинаковыми — модули будут работать нормально. Основные проблемы возникают когда настройки передатчика и приемника имеют отличия. Также проблемы могут возникнуть, если вы выбрали канал, который занят и радиопомехи мешают радиосвязи.
Команды
Сеанс обмена начинается с установки низкого уровня на линии CSN. Первый переданный после этого от микроконтроллера байт является командой. Одновременно с байтом команды от микроконтроллера, к микроконтроллеру по линии MISO передаётся байт статуса.
Перечень команд:
Наименование | Двоичный код | 16-чный код | Размер данных | Описание |
---|---|---|---|---|
R_REGISTER | 000n nnnn | 0x00 + n | 1-5 (приём) | Прочитать регистр n |
W_REGISTER | 001n nnnn | 0x20 + n | 1-5 (передача) | Записать регистр n |
R_RX_PAYLOAD | 0110 0001 | 0x61 | 1-32 (приём) | Принять данные из верхнего слота очереди приёмника. После чтения данные из очереди удаляются |
W_TX_PAYLOAD | 1010 0000 | 0xA0 | 1-32 (передача) | Записать в очередь передатчика данные для отправки |
FLUSH_TX | 1110 0001 | 0xE1 | Сбросить очередь передатчика | |
FLUSH_RX | 1110 0010 | 0xE2 | Сбросить очередь приёмника | |
REUSE_TX_PL | 1110 0011 | 0xE3 | Использовать повторно последний переданный пакет | |
R_RX_PL_WID | 0110 0000 | 0x60 | 1 (приём) | Прочитать размер данных принятого пакета в начале очереди приёмника. Значение больше 32, означает ошибку приёма, в таком случае пакет должен быть удалён командой FLUSH_RX |
W_ACK_PAYLOAD | 1010 1ppp | 0xA8 + p | 1-32 (передача) | Записать данные для отправки с пакетом подтверждения по каналу p. При этом бит EN_ACK_PAY в регистре FEATURE должен быть установлен |
W_TX_PAYLOAD_NOACK | 1011 0000 | 0xB0 | 1-32 (передача) | Записать в очередь передатчика данные для отправки, для которых не требуется подтверждение приёма. |
NOP | 1111 1111 | 0xFF | Нет операции. Может быть использовано для чтения регистра статуса |
Все байты данных, сопутствующие команде должны быть переданы/получены в течение одного сеанса обмена. Сеанс обмена завершается установкой высокого уровня на линии CSN.
Улучшение дальности передачи модуля nRF24L01 +
Ключевым параметром для системы беспроводной связи является дальность связи. Во многих случаях это решающий фактор в пользу выбора радиочастотного решения. Итак, давайте обсудим, что мы можем сделать, чтобы получить хорошую дальность связи для нашего модуля.
Уменьшить шум источника питания
ВЧ цепь, которая генерирует радиочастотный (РЧ) сигнал, очень чувствительна к шуму источника питания. Если не контролировать шум источника питания да большую дальность связи можно не рассчитывать.
Если источник питания не является автономным аккумулятором, существует высокая вероятность того, что при генерации сигнала будет шум. Чтобы этот шум не попал в систему, рекомендуется разместить фильтрующий конденсатор емкостью 10 мкФ на линии электропитания как можно ближе к модулю 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 раз слабее.
Таким образом, снижение скорости передачи данных может значительно улучшить дальность связи, которую вы можете достичь. Кроме того, для большинства наших проектов скорость 250 Кбит/с более чем достаточна.
Более высокая выходная мощность
Установка максимальной выходной мощности также может улучшить дальность связи. NRF24L01 + позволяет вам выбрать уровень выходной мощности, а именно: 0 дБм, -6 дБм, -12 дБм или -18 дБм. Выбор выходной мощности 0 дБм посылает более сильный сигнал.
Как работает радиомодуль nRF24L01 +?
Частота RF канала
Модуль приемопередатчика nRF24L01 передает и принимает данные на определенной частоте, называемой каналом. Кроме того, чтобы два или более приемопередающих модуля могли обмениваться данными друг с другом, они должны находиться на одном канале. Этот канал может быть любой частоты в диапазоне ISM 2,4 ГГц или, если быть более точным, он может составлять от 2,400 до 2,525 ГГц (от 2400 до 2525 МГц).
Каждый канал занимает полосу частот менее 1 МГц. Это дает нам 125 возможных каналов с интервалом 1 МГц. Таким образом, модуль может использовать 125 различных каналов, что дает возможность иметь сеть из 125 независимо работающих модулей в одном месте.
Частота выбранного вами канала устанавливается по следующей формуле:
Например, если вы выберете 108 в качестве канала для передачи данных, частота радиочастотного канала вашего канала будет 2508 МГц (2400 + 108).
Ардуино код для Мастера
Код для нашего ведущего Ардуино (т.е. мастера):
Разбираем код Мастера
QNH — авиационный термин. Это один из факторов коррекции, который при применении к альтиметру позволит ему точно считывать высоту над уровнем моря в текущем местоположении.
Варьируется ото дня ко дню и даже от часа к часу. Пилоты должны устанавливать этот коэффициент каждый раз при полете для калибровки своих альтиметров. Если пилоты не могут этого добиться, например, во время полета над океаном, они все используют 1013, то все их высотомеры считывают используя один и тот же эталон. Это позволяет им летать на разных высотах, чтобы избежать столкновения. Его можно получить на погодных сайтах.
Например, вот для Кейптауна — см. ссылку.
Вам не обязательно это делать. Но без скорректированного значения высоты в вашем местоположении, оно будет неверным (так как вы должны учитывать местные изменения атмосферного давления) и может даже отображаться отрицательным. Фактическое давление и температура все равно будут верны.
Запускает один из 125 каналов. Передатчик и приемник должны иметь один и тот же адрес.
Устанавливает уровень мощности передатчика. Высокий уровень может вызвать проблемы с нестабильностью, если питание 3,3 В осуществляется по длинным проводам. Лучше всего вставить через него конденсатор 100 мкФ, но для более долгого срока службы батареи лучше использовать низкочастотный конденсатор.
Говорит модулю вести себя как передатчик и наоборот:
говорит ему вести себя как приемник.
Передаваемые данные выводятся локально на последовательный монитор (если он подключен), а также передаются на приемник.
Строки:
посылают символ степени на последовательный монитор (для некоторых ПК это может отличаться).
Если вы используете ЖК-дисплей, вы можете сделать это с помощью:
Наконец, передает содержимое массива данных
Обратите внимание, что ему необходимо знать, сколько байт отправить и получит это
Краткое описание
nRF24L01+ — высокоинтегрированный, ультрамалопотребляющий (ULP), радиочастотный трансивер ISM (Industrial, Scientific and Medical)-диапазона 2.4 ГГц со скоростью передачи данных 2 МБит/с. С пиковым током потребления RX/TX менее 14 мA, с суб-мкA режимом power down, расширенным управлением питанием и диапазоном входных напряжений 1.9 — 3.6В, nRF24L01+ представляет собой действительно ультрамалопотребляющее решение, обеспечивающее время автономной работы источников питания в виде батарей типа AA/AAA от нескольких месяцев до нескольких лет. Аппаратный механизм Enhanced ShockBurst позволяет значительно снизить время загрузки функций стека протоколов с управляющего микроконтроллера в трансивер. Благодаря этому становится возможным использовать в качестве хост-процессора даже самые бюджетные и низкопроизводительные вычислительные системы
nRF24L01+ интегрирует в себе полноценный радио трансивер 2.4 ГГц, радиочастотный синтезатор и процессор базовой логики, включая аппаратную поддержку механизма Enhanced ShockBurst с высокоскоростным SPI-интерфейсом для взаимодействия с внешним управляющим контроллером. Для дизайна не требуется никаких внешних фильтров, резонаторов или диодных генераторов ГУН. Только самый обычный недорогой кварц ±60ppm, элементы согласования с антенной, и собственно антенна.
Микросхема nRF24L01+ доступна в компактном 20-выводном корпусе QFN размером 4 x 4 мм.
Enhanced ShockBurst
Микросхема поддерживает работу протокола канального уровня Enhanced ShockBurst, гарантирующего надежную пеоедачу данных.
Preamble | Address | Packet Control Field | Payload | CRC |
---|---|---|---|---|
1 байт | 3-5 байт | 9 бит | 0-32 байта | 1-2 байта |
Структура пакета Enhanced ShockBurst
Заголовок (Preamble) представляет собой последовательность битов, сгенерированную автоматически на основе адреса абонента, необходимую для синхронизации приемника с передатчиком.
Поле адреса (Address) может иметь длину три, четыре или пять байт.
Поле управления пакетом (Packet Control Field) содержит 9 бит. Первые шесть бит определяют количество битов, содержащихся в поле полезной нагрузки (Payload). Следующие 2 бита нужны для того, чтобы определить новый ли пакет получил приемник или отправленный повторно. Последний бит говорит о том, надо ли высылать подтверждение получения пакета.
Если одновременно будут передавать несколько передатчиков, или возникнут другие препятствия, произойдет коллизия. Приемник не сможет получить пакет. Поэтому nRF24L01+ имеет настройку автоматической повторной отправки пакета (Aoto Retransmission (ART)). Эти настройки указывают с каким интервалом и сколько раз пытаться отправить пакет.
Контрольная сумма (CRC) рассчитывается по полю адреса, управляющему полю и полю данных. Если при приёме пакета контрольная сумма не совпала, то пакет игнорируется, никаких действий не предпринимается.
Получив пакет данных, приемник распознает адрес этого пакета и тем самым идентифицирует, какой передатчик его ему отправил. Далее приемник высылает пакет подтверждения приёма с таким же адресом, как и принятый пакет. Если это сделать ему не удалось, то он посылает его еще раз, при этом количество таких попыток можно задать программно. Если же отправить данные в итоге не получилось, то генерируется прерывание.
Управляющее поле/Packet Control Field
Управляющее поле имеет следующую структуру:
Длина данных | PID | NO_ACK |
---|---|---|
6 бит | 2 бита | 1 бит |
Длина данных — размер поля «Данные» в пакете. Если опция данных произвольной длины отключена, принимает значение 33 (100001), в этом случае длина данных на принимающей стороне определяется значением соответствующего регистра RX_PW_Px. Значения в диапазоне 1-32 кодируют размер данных в режиме произвольной длины, значение 0 указывает на отсутствие данных и используется в пакетах подтверждения. Режим произвольной длины должен быть включен у передающей стороны для канала 0, чтобы принимать пакеты подтверждения.
PID — двухбитное поле, значение которого циклически увеличивается на 1 при отправке нового пакета. В случае если принимающая сторона приняла пакет, но отправленное подтверждение о приёме не дошло до отправляющей стороны, может быть предпринята повторная отправка с таким же значением PID, как при первой попытке. Если приёмник получает пакет, где поле PID равно полученному в предыдущий раз и значение поля CRC также идентично последнему полученному, то автоматически отправляется подтверждение о получении, но полученные данные считаются повтором и игнорируются, не помещаются в очередь FIFO приёмника, и прерывание TX_DS в этом случае не появляется.
NO_ACK — флаг указывающий получателю на то, что подтверждение получения пакета высылать не требуется. Сами пакеты подтверждения маркируются этим флагам. Также можно отправить пакет не требующий подтверждения командой W_TX_PAYLOAD_NOACK, если в регистре FEATURE установлен бит EN_DYN_ACK.
Варианты подключения к «Ардуино»
Создание радиоканала востребовано при беспроводном соединении двух плат «Ардуино». На базе модуля организуется многоканальная защищенная связь между приемником и передатчиком. Подключение к Arduino осуществляется по различным схемам с учетом низкой скорости передаваемой информации и особенностей работы каждого устройства. Востребовано соединение по шине SPI с использованием программных или аппаратных средств.
Установка библиотеки RF24
Возможности NRF реализуются функциями библиотеки RF24. Загруженный код распаковывается в каталог «Arduino/libraries». Среда программирования Arduino IDE должна быть перезагружена, если она была открыта в момент установки библиотеки. RF24 допускается инсталлировать из самой IDE таким образом:
- запускаем среду программирования;
- переходим в главное меню;
- спускаемся на 3 уровня вниз «Скетч->Подключить библиотеку->Управлять библиотеками»;
- открываем менеджер библиотек;
- в поле поиска вводим «RF24»;
- выбираем новую версию;
- кликаем «Установить».
На этом подготовка к работе с библиотекой завершена.
Подключение NRF+ к Arduino напрямую
Прямое подключение к «Ардуино» требует согласования уровней питающего напряжения. Большая часть плат работает от +5 В, а для модуля требуется 3,3 В. Кроме того, в модуле отсутствует защита от ошибочного присоединения полюсов. Для увеличения стабильности на входные пины VCC и GND желательно припаять конденсатор на 10 мкФ. Модуль NRF24+ можно напрямую подключать к разным платам микроконтроллеров Arduino UNO, Pro Mini, MEGA2560, изменяя схему соединения коннекторов.
Подключение модуля к «Arduino».
NRF+ |
Arduino UNO/Pro Mini |
Arduino MEGA2560 |
---|---|---|
GND |
GND |
GND |
VCC |
3,3 В |
3,3 В |
CE |
9 |
9 |
CSN |
10 |
53 |
SCK |
13 |
52 |
MOSI |
11 |
51 |
MISO |
12 |
50 |
IRQ |
— |
— |
Подключение к Arduino через адаптер
При подключении через адаптер задействованы среда разработки Arduino IDE и библиотека подпрограмм RF24. При удачном соединении всех коннекторов после запуска проверочного скетча в окне терминала должна появиться строка «Модуль NRF24L01 подключен». Это означает корректные обнаружение и инициализацию модуля подключенной библиотекой.
Среда программирования «Arduino IDE».
Если на мониторе серийного порта появилась строка «Неизвестный модуль», тогда следует проверить правильность и надежность соединения коннекторов. Максимум ошибок допускается при соединении пина CE (Chip Enable) к выводу 7 Arduino. Пин SS (Slave Select) должен быть подключен к выводу 10 Arduino. Если подключение верное, но модуль не обнаруживается, проверьте тип используемой микросхемы, убедитесь, что модуль собран на базе NRF.
Адаптер NRF+ |
UNO/Pro Mini |
MEGA2560 |
---|---|---|
GND |
GND |
GND |
VCC |
5.0V |
5.0V |
CE |
9 |
9 |
CSN |
10 |
53 |
SCK |
13 |
52 |
MO/MOSI |
11 |
51 |
MI/MISO |
12 |
50 |
IRQ |
— |
— |
Исходные коды проверочных скетчей расположены по адресу: micro-pi.ru
Адаптер создан для NRF24+ и содержит стабилизатор напряжения 3,3 В. Расположение его выводов обеспечивает удобство при подключении модуля к плате. 2-рядный разъем предназначен для радиомодуля, 1-рядный — для «Ардуино». Несколько пинов обеспечивают доступ к шине питания.