Радио модуль NRF24L01: описание, подключение, схема, характеристики | ВИКИ

Радио модуль NRF24L01: описание, подключение, схема, характеристики | ВИКИ Мультикоптеры

Адаптер для nrf24l01 с atmega48 / купить в roboshop

Модуль для отладки работы приемопередатчика NRF24L01 на базе AVR микроконтроллера ATmega48. Модуль позволяет питать приемопередатчик от напряжения 5В вместо 3.3В, а так же упрощает его подключение. ATmega48 выполняет роль конвертера интерфейсов и позволяет подключать радиомодуль по I2C .

Характеристики:

  • Напряжение питания: 5В
  • Максимальный ток: 800мА
  • Размер: 45 х 21.5 х 10 мм

Аппаратура радиоуправления на arduino

В этой статье рассмотрено изготовление пропорциональной аппаратуры радиоуправления на основе платы Arduino. Интересной особенностью проекта является то, что аппаратура задумывалась как альтернатива “взрослой” аппаратуры, но которую можно изготовить самому. На передатчике присутствуют клавиши триммирования, что важно для управления например моделями самолетов, так же передатчик оснащен небольшим дисплеем на органических светодиодах, отображающий основную информацию по работе передатчика. Аппаратура рассчитана на 6 каналов, 4 пропорциональных и 2 дискретных. Также автор заложил на будущее добавление еще двух пропорциональных каналов, на корпусе добавлены 2 потенциометра, однако на данный момент они не задействованы. Тем не менее этого достаточно для управления моделью самолета, судна или автомобиля, а дискретные каналы позволят управлять дополнительной нагрузкой, например включением фар, подсветки палубы, ходовых авиационных огней или даже запуска небольших ракет. Аппаратура имеет два режима управления — линейный и экспоненциальный.

Смотрите про коптеры:  Победа над nRF24L01: на три шага ближе / Хабр

Для передатчика понадобятся:

1 x Arduino NANO/UNO/ProMini
1 x Плата защиты BMS для трех Li-ion банок
1 x разъем 5,5 x 2,1 мм
1 x повышающий DC/DC преобразователь XL6009
1 x небольшой понижающий преобразователь LM2596 (о нем скажу отдельно)
3 x 18650 :
2 x джойстики JH-D202X (продаются на али)
2 x тумблер
1 x i2c OLED-экран 0,96 дюйма 128X64
1 x радио модуль NRF24l01 с усилителем и антенной
9 x тактовая кнопка 6 * 6 * 5 мм
Резисторы выводные (смотри схему)

Для приемника понадобятся:

1 х Arduino NANO/UNO/Pro Mini
1 х радио модуль NRF24l01
1 х AMS1117 3,3 В стабилизатор напряжения
30 х PLS гребенки
1 х макетная плата
1 х 10 мкФ конденсатор

Ниже Вы можете видеть графическое изображение всех компонентов и схему их соединения. Перед сборкой понижающие преобразователи обязательно нужно настроить, XL6009 на 12,6 В (этот модуль ответственен за зарядку), LM2596 на 3,3 В (питание радиомодуля). Вместо LM2596 теоретически можно использовать и ASM117, согласно даташиту максимальное входное напряжение этого стабилизатора 15 В, однако советуется не подавать выше 12 В. Видимо исходя из этих соображений автор и использовал еще один DC/DC преобразователь. Вместо него так же можно использовать регулируемый стабилизатор, например LM317.

Корпус

Корпус состоит из двух основных частей: верхней и нижней. Помимо этого печатаются 9 кнопок (8 на триммирование и одна кнопка режима), 5 подпорок для кнопок, окантовка дисплея и ползунок включения. Автор печатал PLA ластиком с 20% заполнением, соплом 0,4 мм и высотой слоя 0,3 мм. К слову, никто не запрещает использовать другой корпус, можно взять просто подходящую коробку, склеить его самому или взять достаточно крупный корпус от китайской игрушки, на сайтах объявлений их чуть ли не мешками продают.

Монтаж передатчика

Аккумуляторы соединяются последовательно. Автор сделал это при помощи пайки, хочу отметить, что пайка банок 18650 требует некой сноровки, по этому если у Вас такого опыта нет — покупайте аккумуляторы с уже приваренными лепестками и подпаивайтесь к ним. Так же аккумуляторы согласно вышеизложенной схеме припаиваются к модулю BMS, на вход которого подается напряжение с преобразователя XL6009 (вместо него можно использовать MT3608). BMS отвечает за равномерную зарядку/разрядку всех банок и отключает питание, когда аккумуляторы разрядятся. Напряжение так же можно мониторить при помощи дисплейчика. Зарядка аккумуляторов осуществляется блоком питания 9 В с током не выше 3 А (максимум для XL6009 ). Фактически же ток заряда нужно подсчитать в зависимости от емкости аккумуляторов и взять блок питания с немного меньшим током или ограничить его. Монтировать модули в корпус удобно при помощи “автомобильного” двухстороннего скотча.

Тактовые кнопки устанавливаются на специальные площадки, после чего небольшими шурупами крепятся к соответствующим опорам внутри корпуса. Тут, собственно, все на уровне конструктора и хорошо понятно по фото.

Кнопки соединяются между собой резисторами, таким образом по сути выходит небольшая резистивная клавиатура, что позволяет использовать всего один вывод платы ардуино. К потенциометрам джойстиков припаиваются провода, крайние выводы идут на землю и 5 В, средний на соответствующий вывод Arduino. У меня в планах повторить эту схему, уже немного поэкспериментировал и могу сказать, что в коде заложена функция автоматического инвертирования каналов по необходимости, однако я пока не понял, как схема определяет эту самую необходимость. Это я к тому, что так-то инвертирование канала по сути производиться перепаиванием крайних выводов местами. Такие джойстики, на момент написания статьи, продаются на али по цене примерно 7 долларов за штуку, много это или мало решать Вам. Вместо них можно использовать модули джойстиков для ардуино или джойстики от игровых манипуляторов.

По сути джойстик работает как делитель, отклоняя ручку мы меняем напряжение на среднем выводе потенциометра, и в зависимости от этого напряжения ардуино определяет отклонение.
[center] [/center]
Так же подключаются и тумблеры. Тумблеры нужны двухпозиционные, так как канал дискретный и имеет только два значения – 0 или 1, в зависимости от того, к чему притягивается вывод ардуино – к земле или питанию 5 В. При чем обязательно двухпозиционный, если оставить вывод “висеть в воздухе”, что было бы при использовании трех позиционного, контроллер не понимает что происходит и значение рандомно скачет то 0, то 1 (по моим опытам). Дополнительные потенциометры можете не ставить, на данный момент они не задействованы. А можете поставить и мониторить страницу источника, возможно автор со временем выложит обновленную прошивку.

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

Прошивка

О прошивке ардуино говорилось уже 1000 раз, на данном момент времени умение это делать взявшись за проект на ардуино является таким же важным по умолчанию, как умение держать в руках паяльник, взявшись что-то паять. Код для передатчика, приемника, необходимые библиотеки и файл для 3D печати корпуса можно скачать одним архивом в конце статьи.

Приёмник

Для приёмника потребуется ещё одна плата ардуино, радио модуль (без антенны, телеметрия все равно тут не реализована) и стабилизатор на 3,3 вольта. Приемник распаивается на макетной плате. Питание приемника осуществляется так же, как и питание любого другого заводского приемника, со специального выхода регулятора скорости.

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

Помимо этого автор реализовал очень важную функцию — вывод с приемника PPM сигнала. Схематически при этом ничего не меняется, нужно лишь залить другую прошивку, PPM сигнал при этом выводиться так же, как и в большинстве заводских приемников – с первого канала (газа).

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

Скачать все необходимое можно тут.

Всем успехов в творчестве!

Беспроводное управление серводвигателем с помощью nrf24l01

Тестовый макет для проекта
Тестовый макет для проекта

Когда вы будете готовы, загрузите программы передатчика и приемника (приведены ниже) на соответствующие платы Arduino и подайте на них питание через USB порт. Вы также может запустить монитор последовательного порта для обеих плат, чтобы проверить, какое значение передается, и что принимается.

Работа проекта показана на демонстрационном видео ниже. Вполне нормально, если эти модули не заработают с первой попытки. Если вы столкнулись с какой-либо проблемой, снова проверьте код и разводку и попробуйте приведенные выше рекомендации по устранению неполадок.

Взаимодействие nrf24l01 с arduino

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

Принципиальная схема подключения модуля nRF24L01 к Arduino приведена ниже. Для разнообразия я использовал UNO для приемной части и Nano для предающей части. Но для других плат Arduino, таких как Mini и Mega, логика подключения остается неизменной.

Видео

Оригинал статьи:

Встраиваемый модуль радиоуправления на nrf24l01 – проекты – avr – проекты на микроконтроллерах avr

 Пульт

 Питаться схема планировалась от одной 3-х вольтовой литиевой батарейки.  Главная цель была утрамбовать всю схему передатчика в минимальные размеры, чтобы она влезла в заранее купленный корпус-брелок. Я использовал батарейку CR2023, получилось достаточно компактно, плата поместилась в корпус G1402-4B купленном в http://chipnn.ru/ Но чтобы плата влезла в корпус по высоте пришлось перепаять кварц на передатчике (см. фото №3). 

 Для того чтобы продлить жизнь батарейки, все время пока пульт лежит без дела, микроконтроллер находится в режиме энергосбережения. Передатчик в свою очередь питается напрямую от ножки микроконтроллера (PortD.0), поэтому когда микроконтроллер спит, питание на передатчик не поступает и расход батареи минимален. Посмотрю сколько проживет батарейка в режиме ожидания. 

 Светодиод D5 на схеме мигает каждый раз при нажатии на кнопки, чтобы было видно что оно работает. Потом можно будет выпаять чтобы не сажало лишний раз батарейку.

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

 Так как логика работы приемника может быть разной, и зависит от области применения привожу сразу три прошивки, в которых реализована разная логика работы. 

 Первый режим работы

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

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

 Второй режим работы

 Во втором режиме при нажатии на кнопку происходит кратковременное (1 сек.) изменение уровня на выходе модуля приемника. 

 Третий режим работы

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

UPD: по прошествии 3 недель, в течении которых я каждый день нажимал несколько раз на кнопки, пульт продолжает работать от этой батарейки. Напряжение на ней упало с 3 до 2,6 вольта.


Еще одна версия пульта от товарища Polle:

Знакомство с rf модулем nrf24l01

Модули nRF24L01 являются приемопередающими модулями, то есть каждый модуль может отправлять и принимать данные, но поскольку они полудуплексные, в какой-либо момент времени они могут либо передавать, либо принимать данные. Модуль содержит микросхему nRF24L01 от Nordic semiconductors, которая отвечает за передачу и прием данных.

Микросхема обменивается данным с помощью интерфейса SPI и, следовательно, может легко взаимодействовать с любыми микроконтроллерами. С Arduino всё становится намного проще, так как для нее доступны библиотеки. Распиновка стандартного модуля nRF24L01 показана ниже.

Распиновка модуля nRF24L01
Распиновка модуля nRF24L01

Рабочее напряжение модуля составляет от 1,9 В до 3,6 В (как правило, 3,3 В). Модуль потребляет очень маленький ток, составляющий всего 12 мА при нормальной работе, что делает его эффективным при использовании с аккумуляторами, и, следовательно, он может работать даже от элементов питания размером с монету.

Несмотря на то, что рабочее напряжение составляет 3,3 В, большинство выводов толерантны к 5 В и, следовательно, могут напрямую подключаться к 5-вольтовым микроконтроллерам, таким как Arduino. Еще одним преимуществом использования этих модулей является то, что каждый модуль имеет 6 каналов связи (pipeline).

Это означает, что каждый модуль может связываться с 6 другими модулями для передачи и приема данных. Это делает данный модуль пригодным для создания сетей с топологиями «звезда» и «ячеистая» в приложениях IoT. Кроме того, они имеют широкий диапазон адресов из 125 уникальных идентификаторов, поэтому в закрытом пространстве мы можем использовать 125 таких модулей, не мешающих друг другу.

Купить модуль-адаптер беспроводной связи atmega48 (для nrf24l01)

Наш магазин работает в соответствии с Законом РФ “О защите прав потребителей”.

В соответствие с п. 4 ст. 26.1 ФЗ «О защите прав потребителей» и п. 21 Постановления Правительства РФ «Об утверждении правил продажи товаров дистанционным способом» потребитель (покупатель) имеет право отказаться от товара (в том числе и надлежащего качества) в любое время до его передачи, а после передачи – в течение 7 дней. При этом, обмен товара надлежащего качества возможен только в случае, если:

  • товар не включен в перечень товаров надлежащего качества, не подлежащих возврату утвержденный Постановлением Правительства РФ №55 от 19.01.1998 г.
  • товар не был в употреблении
  • сохранены фабричные ярлыки, гарантийные талоны, техническая документация, комплектующие детали
  • сохранена упаковка товара
  • в наличии документы, подтверждающие факт и условия покупки указанного товара (Ст. 25 Закона “О защите прав потребителей”).

В случае отказа от товара возврату подлежит уплаченная сумма, за исключением расходов на доставку товара, а также других расходов интернет-магазина, подлежащих компенсации за счет Покупателя (Ст. 26.1 Закона “О защите прав потребителей”).

Возвратом и обменом товара занимается тот филиал, в котором была совершена покупка

Дополнительная информация по возврату

Передающая часть: подключение модуля nrf24l01 к arduino nano

Передающая часть: подключение модуля nRF24L01  Arduino Nano. Схема соединений
Передающая часть: подключение модуля nRF24L01 Arduino Nano. Схема соединений

Соединения для передатчика точно такие же; кроме того, я использовал потенциометр, подключенный через выводы 5V и GND к Arduino. Выходное аналоговое напряжение, которое изменяется от 0 до 5 вольт, подается на вывод A7 Arduino Nano. Обе платы питаются через порт USB.

Подключение nrf24l01 к плате arduino

Подключение радиомодуля NRF24L01 к Arduino осуществляется по
SPI-интерфейсу, что предполагает
использование 5 проводов не считая
выводов питания. Для разных линеек
Arduino номера выводов, на которые завязан
аппаратный 
SPI-интерфейс, могут
отличаться. На рисунке №5 показана карта подключения
NRF24L01 к различным сериям
Arduino.

 Рисунок №5 – карта подключения NRF24L01 к различным сериям
Arduino.

Выводы CE и CSNмогут
быть соединены с любыми цифровыми пинами Arduino.

Единственное что потребуется – указать их номера при написании скетча. Что
касается программирования, то для взаимодействия с NRF24L01 существует
несколько библиотек, но наиболее популярной и стабильной является библиотека RF24.

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

Но
что делать, когда на одном канале необходимо контролировать сразу несколько
датчиков, например температуру в разных комнатах? В этом случае, функциональные
возможности радиомодуля NRF24L01 предусматривают
возможность организации мини-сети.

А именно, на одной частоте или канале могут
работать до 6 передатчиков и 1 приёмник. При этом каждому
передатчику присваивается свой уникальный идентификатор («PipeID»
или «Идентификатор трубы»), а
приёмнику необходимо присвоить все идентификаторы тех передатчиков, от которых
он будет принимать данные.

Каждый идентификатор представляет из
себя произвольное число, состоящее из 5
байт, но он должен задаваться по определённым правилам, а именно:

Рисунок
№6 наглядно демонстрирует вышеизложенное.

Рисунок №6 – Приём данных от 6 передатчиков

Для закрепления материала, создадим
проект, где 2платы Arduino
будут соединены между собой по радиоканалу. К первой Arduino
подсоединим потенциометр, а ко второй – светодиод.

Рисунок №7 – соединение 2-х Arduinoпо
радиоканалу

Программный код для передатчика:

#include <SPI.h>  // Подключаем библиотеку для работы с SPI-интерфейсом
#include <nRF24L01.h> // Подключаем файл конфигурации из библиотеки RF24
#include <RF24.h> // Подключаем библиотеку для работа для работы с модулем NRF24L01
#define PIN_POT A7  // Номер пина Arduino, к которому подключен потенциометр
#define PIN_CE  10  // Номер пина Arduino, к которому подключен вывод CE радиомодуля 
#define PIN_CSN 9 // Номер пина Arduino, к которому подключен вывод CSN радиомодуля
RF24 radio(PIN_CE, PIN_CSN); // Создаём объект radio с указанием выводов CE и CSN

int potValue[1]; // Создаём массив для передачи значений потенциометра

void setup() {
  radio.begin();  // Инициализация модуля NRF24L01
  radio.setChannel(5); // Обмен данными будет вестись на пятом канале (2,405 ГГц)
  radio.setDataRate (RF24_1MBPS); // Скорость обмена данными 1 Мбит/сек
  radio.setPALevel(RF24_PA_HIGH); // Выбираем высокую мощность передатчика (-6dBm)
  radio.openWritingPipe(0x7878787878LL); // Открываем трубу с уникальным ID
}

void loop() {
  potValue[0] = analogRead(PIN_POT); // Считываем показания потенциометра
  radio.write(potValue, 1); // Отправляем считанные показания по радиоканалу
}

Программный код для приёмника:

#include <SPI.h>  // Подключаем библиотеку для работы с SPI-интерфейсом
#include <nRF24L01.h> // Подключаем файл конфигурации из библиотеки RF24
#include <RF24.h> // Подключаем библиотеку для работа для работы с модулем NRF24L01
#define PIN_LED 3  // Номер пина Arduino, к которому подключен светодиод
#define PIN_CE  10  // Номер пина Arduino, к которому подключен вывод CE радиомодуля 
#define PIN_CSN 9 // Номер пина Arduino, к которому подключен вывод CSN радиомодуля
RF24 radio(PIN_CE, PIN_CSN); // Создаём объект radio с указанием выводов CE и CSN

int potValue[1]; // Создаём массив для приёма значений потенциометра

void setup() {
  pinMode(PIN_LED, OUTPUT); // Настраиваем на выход пин светодиода
  radio.begin();  // Инициализация модуля NRF24L01
  radio.setChannel(5); // Обмен данными будет вестись на пятом канале (2,405 ГГц)
  radio.setDataRate (RF24_1MBPS); // Скорость обмена данными 1 Мбит/сек
  radio.setPALevel(RF24_PA_HIGH); // Выбираем высокую мощность передатчика (-6dBm)
  radio.openReadingPipe (1, 0x7878787878LL); // Открываем трубу ID передатчика
  radio.startListening(); // Начинаем прослушивать открываемую трубу
}

void loop() {
  if(radio.available()){ // Если в буфер приёмника поступили данные
    radio.read(&potValue, sizeof(potValue)); // Читаем показания потенциометра
    analogWrite(PIN_LED, map(potValue[0],0,1023,0,255)); // Регулируем яркость диода
  }
}

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

-RF24_250KBPS
– скорость 250 кбит/сек;

-RF24_1MBPS
– скорость 1Мбит/сек;

-RF24_2MBPS
– скорость 2Мбит/сек;

-RF24_PA_MIN – мощность -18dBm;

-RF24_PA_LOW – мощность -12dBm;

-RF24_PA_HIGH – мощность -6dBm;

https://www.youtube.com/watch?v=TrRxwQm6AZc

-RF24_PA_MAX – мощность 0dBm;

Приемная часть: подключение модуля nrf24l01 к arduino uno

Приемная часть: подключение модуля nRF24L01  Arduino Uno. Схема соединений
Приемная часть: подключение модуля nRF24L01 Arduino Uno. Схема соединений

Как было сказано ранее, nRF24L01 взаимодействует с помощью интерфейса SPI. Для связи через SPI на Arduino Nano и UNO используются выводы 11, 12 и 13. Следовательно, мы подключаем выводы MOSI, MISO и SCK от nRF к выводам 11, 12 и 13 соответственно.

Выводы CE и CS настраиваются пользователем, здесь я использовал выводы 7 и 8, но вы можете использовать любые выводы, изменив программу. Модуль nRF питается от вывода 3,3V на Arduino, что в большинстве случаев работать будет. Если нет, то можно попробовать отдельный источник питания.

Пример использования №2

Создадим проект передачи данных с одной плата Arduino на другую по радиоканалу и использованием модулей nRF24L01 .

Схема соединений нашего проекта на рис. 10.


Рисунок 10.

Листинг 3.

#include <SPI.h>                                     
#include <nRF24L01.h>                                         
#include <RF24.h>
// Создаём объект 
RF24  m24l01(7, 8);                  
// Массив для отправки данных  
byte  arr1[4];                                   
// идентификатор канала
#define ID 0xF0F0F0F0E2LL
// стартовый байт отправки
#define SEND_START 55       
// стоповый байт отправки
#define SEND_STOP 56         

#include "DHT.h"                                          
// создание DHT
DHT snr(6, DHT11);                              
int t;
int h;
unsigned long millissenddata=0;

void setup(){
    Serial.begin(9600); 

    m24l01.begin();
    m24l01.setPALevel(RF24_PA_HIGH);
    m24l01.setDataRate(RF24_250KBPS);
    m24l01.setChannel(0x55);
    m24l01.openWritingPipe(ID);

    snr.begin();      
}

void loop() {
   // отправка данных
   if(millis()-millissenddata>10000) {
      // получение данных с датчика
      h = snr.readHumidity();
      t = snr.readTemperature();
      arr1[0] = SEND_START;   
      arr1[1] = h;                             
      arr1[2] = t;                             
      arr1[3] = SEND_STOP;   
      Serial.println("send");
      // отправляем данные 
      m24l01.write(&arr1, sizeof(arr1));   
      delay(100);
      millissenddata=millis();
   }
}

Листинг 4.

#include <SPI.h>                                     
#include <nRF24L01.h>                                         
#include <RF24.h>
// Создаём объект 
RF24 m24l01(7, 8);                  
// для получения  данных  
int  arr1[4]; 
// идентификатор канала
#define ID 0xF0F0F0F0E2LL

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C dislpl(0x27,16,2);

void setup() {
    Serial.begin(9600);                                       
    m24l01.begin();                                          
    m24l01.setChannel(0x55);                            
    m24l01.setDataRate(RF24_250KBPS);                   
    m24l01.setPALevel(RF24_PA_HIGH);                 
    m24l01.openReadingPipe(1, ID);  
    // режим приема 
    m24l01.startListening  ();                             
    dislpl.init();
    // заголовки на дисплей
    dislpl.backlight();
    dislpl.setCursor(0,0);
    dislpl.print("H=");
    dislpl.setCursor(0,1);
    dislpl.print("T=");

}       
void loop() {
      if(m24l01.available()) { 
        m24l01.read(&arr1, sizeof(arr1));                  
        // Показания на дисплей
        dislpl.setCursor(2,0);
        dislpl.print(arr1[1]);
        dislpl.setCursor(2,1);
        dislpl.print(arr1[2]);
      }   
 }

И результат работы (рис. 11)


Рисунок 11.

Пример
использования №1

Так как основной областью применения
радиомодулей NRF24L01 являются
различные системы удалённого мониторинга, создадим небольшой проект, суть
которого передавать по радиоканалу температуру и влажность с датчика DHT11.

Рисунок №8 – проект удалённого контроля температуры и
влажности

Arduino1 будет один раз в 2 секунды считывать показания датчика DHT11 и отправлять
данные по радиоканалу на Arduino2,
которая выведет их на дисплей. В данном проекте использован символьный
ЖКИ-дисплей с конвертером I2C,
что позволяет использовать всего 2
провода для его подключения.

Программирование nrf24l01 для arduino

Использовать эти модули с Arduino очень просто благодаря доступной готовой библиотеке, созданной maniacbug на GitHub. Нажмите на ссылку, чтобы загрузить библиотеку в виде zip-каталога, и добавьте её в Arduino IDE с помощью Скетч (Sketch) → Подключить библиотеку (Include Library)

→ Добавить ZIP библиотеку (Add .ZIP library). После добавления библиотеки мы можем начать программирование для проекта. Мы должны написать две программы, одна для передающей части, а другая для приемной части. Однако, как я уже говорил ранее, каждый модуль может работать как и передатчик, и приемник.

Обе программы приведены в конце страницы, в коде передатчика будет закомментирован код приемника, а в программе приемника будет закомментирован код передатчика. Вы можете использовать его, если хотите, чтобы в вашем проекте модуль работал в обоих режимах. Работа программы описана ниже.

Как и во всех программах, мы начинаем с включения заголовочных файлов. Поскольку nRF использует протокол SPI, мы включили заголовочный файл SPI, а также библиотеку, которую только что загрузили. Библиотека servo используется для управления серводвигателем.

#include <SPI.h> 
#include "RF24.h"
#include <Servo.h>

https://www.youtube.com/watch?v=iT2Yts0WS2w

Далее идет важная строка, в которой мы указываем выводы CE и CS. На нашей принципиальной схеме CE подключен к выводу 7, а CS – к выводу 8.

RF24 myRadio (7, 8);

Все переменные, которые связаны с библиотекой RF, должны быть объявлены как составная структура. В данной программе переменная msg используется для отправки и получения данных от RF модуля.

struct package
{
  int msg;
};
typedef struct package Package;
Package data;

Каждый RF модуль имеет уникальный адрес, используя который можно отправлять данные на соответствующее устройство. Поскольку у нас здесь только одна пара, мы устанавливаем адрес, равный нулю, как на передатчике, так и приемнике, но если у вас несколько модулей, вы можете установить ID на любую уникальную строку, состоящую из шести цифр.

Работа с беспроводным приемопередающим модулем nrf24l01

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

  1. Большинство модулей nRF24L01 на рынке являются поддельными. Самые дешевые, которые мы можем найти на Ebay и Amazon, являются худшими (не волнуйтесь, с помощью нескольких ухищрений мы можем заставить их работать).
  2. Основная проблема – источник питания, а не ваш код. Большинство примеров кода в интернете работают правильно.
  3. Обратите внимание, что модули, которые промаркированы как NRF24L01 , на самом деле это Si24Ri (да, это китайский продукт).
  4. Клоны и поддельные модули будут потреблять больше энергии, поэтому разрабатывайте свою схему питания не на основе технического описания nRF24L01 , поскольку Si24Ri будет иметь высокое потребление тока, около 250 мА.
  5. Остерегайтесь пульсаций напряжения и скачков тока, эти модули очень чувствительны и могут легко выйти из строя (я пока поджарил 2 модуля).
  6. Добавление пары конденсаторов (10 мкФ и 0,1 мкФ) между Vcc и Gnd модуля помогает очистить питание, и это работает с большинством модулей.

Тем не менее, если у вас есть проблемы, напишите в комментариях.

Ссылки по теме

  1. Обзор радио модуля NRF24L01
  2. nRF24L01 : побеждаем модуль.
  3. nRF24L01 и Ардуино: побеждаем модуль (видео)
  4. SE8R01. Подделка под NRF24L01 (видео)
  5. Обзор радио модуля NRF24L01 PA LNA

Шаг 1

Загрузить в контроллер платы Ардуино скетч сканера эфира, который можно найти среди примеров Arduino IDE: Файл -> Примеры -> RF24 -> scanner. Ниже под спойлером есть этот скетч с несущественным изменением. В нем изменено время между стартом и остановкой сканирования одного канала с 128 мксек на 512 мксек.

Увеличение времени позволило за один цикл сканирования всего диапазона выявлять больше источников помех и сигналов. Это равнозначно замене результата измерений в канале на сумму четырех соседних результатов в этом канале до изменения времени сканирования. При этом, время прохода всего прослушиваемого диапазона сканером увеличилось несущественно: примерно с 8 до 10 сек.

В разных скетчах адрес канала в командах приводится в разных форматах: в одних — …(0x6f), в других — …(112). Перевод с одного формата в другой станет понятным с примера перевода. Например, для (0x1а) — это: (1 1)*16 а = (1 1)*16 10 = 42. Отсчет каналов начинается с частоты 2,4 ГГц, далее идет увеличение частоты на 1 МГц с увеличением номера канала на 1.

скетч сканера эфира
/*
Победа над nRF24L01: на три шага ближе, сканер эфира
https://habr.com/ru/post/476716/
*/

/*
  Copyright (C) 2023 J. Coliz <[email protected]>

  This program is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License
  version 2 as published by the Free Software Foundation.
*/

/**
   Channel scanner

   Example to detect interference on the various channels available.
   This is a good diagnostic tool to check whether you're picking a
   good channel for your application.

   Inspired by cpixip.
   See http://arduino.cc/forum/index.php/topic,54795.0.html
*/

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"

//
// Hardware configuration
//

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10

RF24 radio(9, 10); //Arduino UNO

//
// Channel info
//

const uint8_t num_channels = 128;
uint8_t values[num_channels];

//
// Setup
//

void setup(void)
{
  //
  // Print preamble
  //

  Serial.begin(9600);
  Serial.println("Scanner Air On");
  printf_begin();

  //
  // Setup and configure rf radio
  //

  radio.begin();
  radio.setAutoAck(false);

  // Get into standby mode
  radio.startListening();
  radio.printDetails();  
  delay(5000);              

  // Print out header, high then low digit
  int i = 0;
  while ( i < num_channels )
  {
    printf("%x", i >> 4);
      i;
  }
  printf("nr");
  i = 0;
  while ( i < num_channels )
  {
    printf("%x", i & 0xf);
      i;
  }
  printf("nr");
}

//
// Loop
//

const int num_reps = 100;

void loop(void)
{
  // Clear measurement values
  memset(values, 0, sizeof(values));

  // Scan all channels num_reps times
  int rep_counter = num_reps;
  while (rep_counter--)
  {
    int i = num_channels;
    while (i--)
    {
      // Select this channel
      radio.setChannel(i);

      // Listen for a little
      radio.startListening();
      delayMicroseconds(512);
      radio.stopListening();

      // Did we get a carrier?
      if ( radio.testCarrier() )
          values[i];
    }
  }

  // Print out channel measurements, clamped to a single hex digit
  int i = 0;
  while ( i < num_channels )
  {
    printf("%x", min(0xf, values[i] & 0xf));
      i;
  }
  printf("nr");
}

Далее подключаем модуль nRF24L01 к плате Ардуино или любому прототипу, собранному, допустим, на контроллере ATMEGA328P. Я собрал два образца на платах для прототипирования на контроллере ATMEGA328P по схеме контроллер резонатор. Один образец подключаю к компу через плату Arduino UNO, а второй — через конвертор USB/TTL.

Мощность стабилизатора платы Arduino UNO вполне приемлема для подключения дополнительной импульсной нагрузки такой, как nRF24L01 c адаптером 5В/3,3В для этого модуля или без адаптера.

На мониторе последовательного порта Arduino IDE увидите нечто похожее:

Если вы увидели похожую картинку — тест на работоспособность (исправность) радиомодуля и правильность его подключения пройден успешно. Замените радиомодуль другим, с которым планируете работать дальше.

Обратите внимание на чистый диапазон, начиная с канала 4а. У меня он остается чистым даже, если на расстоянии нескольких метров работает старая СВЧ-печь — мощный источник помех в этом диапазоне. А в общем-то, в Интернете рекомендуют выбирать каналы для своих проектов выше «60».

Если на каналах — шум, но радиомодуль определяется (смотрим преамбулу на мониторе Arduino IDE, подробно тут) — это однозначно копия. Не отчаивайтесь — ее тоже можно запустить.

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

Шаг 2

https://www.youtube.com/watch?v=oxWFtfgN_0s

По схеме, аналогичной первой, собираем второй радиоузел. Это будет передатчик. В его контроллер загружаем скетч передатчика (под спойлером).

Передатчик без пауз в работе передает сигнал на канале 6f (112).

Подаем питание на сканер эфира и передатчик. Присмотритесь что творится на канале 6f и соседних с ним каналах. Сканер эфира при включенном передатчике рано или поздно прорисует единички или другие одноразрядные числа в шестнадцатиричном исчислении в области 6f, на который запрограммирован передатчик. Наберитесь терпения на 1 — 2 минуты, особенно при работе со сканером из примеров.

https://www.youtube.com/watch?v=yUvjZtxJ7h8

Увидев сигнал от передатчика делаем следующий шаг.

Оцените статью
Радиокоптер.ру
Добавить комментарий