Подключение радиочастотного модуля nRF24L01 к микроконтроллеру PIC


В эпоху интернета вещей (Internet of Things, IoT) беспроводная связь с каждым годом становится все более популярной. В наши дни электронные устройства могут "разговаривать" друг с другом с помощью какого либо облачного сервиса или локальной сети. Для задач локальной (на небольшие расстояния) беспроводной связи наибольшее распространение получили различные радиочастотные модули (RF Module), например, Bluetooth Low Energy, Zigbee, ESP Wi-Fi модули, радиочастотные модули 433MHz, Lora, nRF и т.д.

В данном проекте мы будем использовать модуль nRF24L01, который представляет собой микросхему радиочастотного приемопередатчика от компании Nordic Semiconductor. Данный модуль работает в диапазоне 2.4GHz ISM, который на западе разрешен для безлицензионного использования в науке, промышленности и медицине, и поддерживает скорости передачи от 250 кБит/с до 2 Мбит/с. Данные скорости передачи являются разрешенными во многих странах.

Внешний вид проекта подключения радиочастотного модуля nRF24L01 к микроконтроллеру PIC

На чипе nRF24L01 выпускается достаточно много различных типов модулей, как со встроенными антеннами с дальностью связи до 100 м, так и с внешними антеннами с дальностью связи до 1000 м. В данном проекте мы с помощью данных радиомодулей будем осуществлять связь между платой Arduino и микроконтроллером PIC18F622K.

Ранее на нашем сайте мы рассматривали и другие проекты с использованием радиочастотных модулей nRF24L01:

Принципы работы радиочастотного модуля nRF24L01

nRF24L01 представляет собой расположенный на одном чипе радиочастотный приемопередающий модуль с низким энергопотреблением. Поскольку модуль приемопередающий, то его можно сконфигурировать для работы как в режиме передачи, так и в режиме приема. Но возможна работа только в режиме полудуплекса, по этой причине в один момент времени мы можем либо передавать, либо принимать данные. Распиновка модуля nRF24L01 представлена на следующем рисунке.

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

Модуль отличается очень низким энергопотреблением, поэтому он хорошо подходит для проектов интернета вещей. С другими устройствами модуль взаимодействует по интерфейсу SPI, поэтому его легко подключить к любому современному микроконтроллеру. Модуль поддерживает достаточно высокие передачи данных (для модулей этого типа) от 250 кБит/с до 2 Мбит/с и дальность связи от 100 до 1000 метров (в зависимости от используемой антенны).

nRF24L01 – это очень дешевый модуль, способный работать в диапазоне 2.4GHz ISM, использующий GFSK модуляцию (гауссова модуляция с минимальным сдвигом). Модуль поставляется в двух вариантах: дешевый – без внешней антенны и усилителя и более дорогой – с внешней антенной и усилителем (PA+LNA), который усиливает сигнал модуля до уровня 3dBm.

Модули nRF24L01 могут запитываться от напряжения от 1.9V и 3.6V и потребляют в режиме функционирования ток всего 13.5mA, а в режиме глубоко сна потребляемый ими ток составляет 26uA. Интересен и тот факт, что контакты SPI данного модуля толерантны (терпимо относятся) к напряжению 5V, поэтому их можно непосредственно подключать к контактам платы Arduino без всякого преобразования уровней.

Необходимые компоненты

  1. Микроконтроллер PIC18F46K22 (купить на AliExpress).
  2. Плата Arduino Uno (купить на AliExpress) или Arduino Nano (купить на AliExpress).
  3. Радиочастотный модуль nRF24L01 – 2 шт. (купить на AliExpress).
  4. Программатор PICkit 3 (купить на AliExpress).
  5. Кварцевый генератор 20 МГц (купить на AliExpress).
  6. Конденсаторы 33 пФ (2 шт.) (купить на AliExpress).
  7. Резисторы 4,7 кОм, 100 Ом (купить на AliExpress).
  8. Развязывающие конденсаторы 10 и 0,1 мкФ для модулей nRF24L01 – 2 шт.
  9. Светодиод (купить на AliExpress).
  10. Кнопка.
  11. Макетная плата.
  12. Соединительные провода.
  13. Адаптер 12V.
  14. MPLAB-X IDE и компилятор xc8.
  15. Arduino IDE.

Схема проекта

Схема подключения радиочастотного модуля nRF24L01 к микроконтроллеру PIC18F46K22 представлена на следующем рисунке.

Схема подключения радиочастотного модуля nRF24L01 к микроконтроллеру PIC18F46K22Примечание: модули nRF24L01 достаточно сильно чувствительны к шумам по питанию, поэтому для снижения уровня этих шумов вместе с данными модулями целесообразно использовать развязывающие конденсаторы. Можно использовать конденсаторы емкостью 10 и 0,1 мкФ – в нашем проекте мы их припаяли непосредственно к контактам модуля. Контакт 3.3V платы Arduino не всегда может обеспечить достаточным питанием модуль nRF24L01, в связи с чем для питания модуля целесообразно использовать внешний источник питания.

Внешний вид собранной конструкции проекта показан на следующих рисунках.

Внешний вид подключенных модулей nRF24L01 в нашем проекте

Внешний вид подключенного модуля nRF24L01 к микроконтроллеру PIC

Объяснение программ проекта

В данном проекте мы будем использовать библиотеку nRF24L01 library для платы Arduino для передачи и приема данных с помощью модуля nRF24L01. Для конфигурирования программы для микроконтроллера PIC18F46K22 мы будем использовать Microchip Code Configurator (MCC).

Примечание: для удобства мы импортировали библиотеку NRF из Arduino, ее можно скачать по следующей ссылке:

Ported Arduino Library for PIC18F622K Microcontroller

Объяснение кода программы для микроконтроллера PIC18F46K22

Первым делом в программе подключим используемые библиотеки.

Затем запишем два макроса для осуществления операций передачи (nRF24L01 Tx) и приема (Rx) в модуле. Нам необходимо будет изменять значение NRF24L01_TX_EX на 1 для операций передачи (Tx) и на 0 для операций приема (Rx).

Затем запрограммируем функцию для мигания светодиода. Периодичность мигания светодиода будет задаваться с помощью Timer0. Число, загружаемое в Timer0, мы подберем таким образом чтобы период мигания светодиода составлял 1 секунду. Данный светодиод будет у нас индикатором того, что наша система функционирует правильно.

В основной функции программы main() мы будем вызывать функцию SYSTEM_Initialize() для инициализации периферийных устройств (прерывания, контакты, Timer0, Uart, SPI1). Также в ней мы установим глобальное разрешение прерываний и разрешим прерывания от периферийных устройств.

После этого мы будем вызывать функцию TMR0_SetInterruptHandler() чтобы задать функцию обработки прерывания от таймера, и затем мы запустим в работу Timer0.

После всех этих инициализаций мы начнем работу с модулем nRF24L01. Сначала нам необходимо инициализировать nRF24, для этого мы вызовем функцию nrf24_rf_init(), установим режим работы nRF24L01 на передачу или прием (Tx или Rx) и радиочастотный канал (0-127). После успешной инициализации модуля выведем на экран его текущие настройки.

После инициализации nRF24 мы будем выполнять операции передачи и приема в цикле while.

В режиме передачи (In Tx mode): мы создадим буфер с помощью переменной целого типа, затем этот буфер мы будем передавать в качестве параметра в функцию nrf24_send_rf_data(), после чего будем инкрементировать значение переменной целого типа.

В режиме приема (In Rx mode): с помощью функции nrf24_is_rf_data_available() мы будем проверять принимает ли nRF24 какие либо данные или нет. После того, как данные на приеме будут все же обнаружены, мы будем вызывать функцию nrf24_read_rf_data() чтобы считать эти данные в буфер, после чего будем выводить на экран содержимое буфера.

Объяснение кода программы для платы Arduino

На стороне Arduino мы начнем код программы с подключения необходимых библиотек. Среди них будет библиотека для работы с радиочастотным модулем, библиотека для работы с интерфейсом SPI и библиотека printf. Также запишем два макроса для работы с модулем nRF24L01.

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

Затем в функции setup инициализируем последовательную связь для целей отладки и инициализируем радиочастотный модуль.

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

Далее, в функции loop, мы объявим массив длительностью 32 символа, в котором мы будем хранить передаваемое сообщение. Данный массив мы будем передавать другому радиочастотному модулю. После этого, с помощью функции sprint(), мы будем передавать по одному символу, также эти символы мы будем печатать в окно монитора последовательной связи для целей отладки. А в конце передачи мы будем добавлять задержку 250 мс чтобы сделать работу модуля более стабильной.

Тестирование работы проекта

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

Тестирование работы проекта

Лог отладки № 1 (Uno as Tx & PIC as Rx):

В этом случае мы в окне монитора последовательной связи Arduino IDE должны увидеть сообщение “Hello PIC18 10”. Если вы в PuTTY увидели это же самое сообщение, то значит передача данных прошла без ошибок. Эта ситуация показана на следующем рисунке.

Лог передачи данных от платы Arduino к микроконтроллеру PIC

Лог отладки № 2 (Uno as Rx & PIC as Tx):

В этом случае в PuTTY мы должны увидеть сообщение “Hello Arduino 10”, если после этого в окне монитора последовательной связи Arduino IDE увидели то же самое, значит передача данных прошла без ошибок. Эта ситуация показана на следующем рисунке.

Лог передачи данных от микроконтроллеру PIC к плате Arduino

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Видео, демонстрирующее работу проекта

Источник статьи

(Проголосуй первым!)
Загрузка...
1 237 просмотров

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *