Мой вариант подключения и проверки радиомодуля NRF24L01

21.09.2016 19:40

jazon



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


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

Не буду вдаваться в подробности какие виды этих радиомодулей бывают, об этом будет отдельная статья. Всё просто - вы купили радиомодули NRF24L01, теперь применим их, и проверим их работу. 

Для начала, уточню - работать мы будем с библиотекой RF24.h, эта библиотека довольно таки гибкая, содержит больше примеров и функционала чем библиотека Mirf.h(о ней тоже в отдельной статье). Так используем же её основные функции!!! Что нам понадобится? Всё то что указано в списке:

  1. Плата Arduino UNO            x2
  2. Радиомодуль NRF24L01    x2
  3. Светодиоды                        x4
  4. Резисторы 220 Ohm           x4
  5. Резисторы 10k                    x2
  6. Простые кнопки                  x2       
  7. Touch Sensor                       x2
  8. Соединительные провода

Touch Sensor - это емкостная кнопка(на принципиальной схеме это S2), реагирующая на касание пальцем, у меня были именно две такие, и поэтому я решил их использовать. Но если у вас таких нет можно взять обычные, придется немного переделать скетч и  схему подключений.  Сразу нужно привести распиновку модуля NRF24L01, модули эти как я уже писал бывают нескольких типов, но распиновка у всех одинаковая. Подробная распиновка на рисунке ниже, показывает, где какие контакты, далее будет приведена таблица подключения к Arduino UNO.


Важно!!! При подключении радиомодуля не перепутать контакты "Земля" и "Питание 3,3В", если это произошло то скорее всего радиомодуль выйдет из строя. Поэтому будьте внимательны, выполняя подключение!!!

В нижеследующей таблице указано подключение радиомодуля к Arduino UNO. Цвета проводов при подключении соответствуют цветам на картинке с принципиальной схемой.   

Arduino UNONRF24L01Цвет провода
3V3
Питание 3,3ВОранжевый
GND"Земля"Синий
9СЕЖелтый
10SCNЗеленый
13SCKФиолетовый
11MOSIКоричневый
12MISOОранжевый


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



Когда два идентичных прибора будут собраны, приходит время залить скетч в оба!!! После скетча я сделаю некоторое разъяснение как работает программа, ну а пока, сам скетч:


#include "SPI.h"
#include "RF24.h"

/*** Конфигурация подключений ***/
/*
 * RADIO_RF24[SCK]  = To ARD PIN 13 
 * RADIO_RF24[MISO] = To ARD PIN 12
 * RADIO_RF24[MOSI] = To ARD PIN 11
 * RADIO_RF24[SCN]  = To ARD PIN 10
 * RADIO_RF24[CE]   = To ARD PIN 9
 * Светодиод который будет включаться по команде с другого передатчика
 * LED1_ACTIVATE    = To ARD PIN 8    
 * Светодиод сигнализирующий о том что устройство включено в режиме передатчика
 * LED2_CH_TO_TX    = To ARD PIN 7      
 * SPARE_PIN        = TO ARD PIN 6
 * SPARE_PIN        = TO ARD PIN 5
 * Кнопка для переключения в режим передачи(нажата - передача, не нажата - приём)
 * BUTTON_EN_TX     = TO ARD PIN 4    
 * SPARE_PIN        = TO ARD PIN 3
 * Кнопка для включения на удаленном устройстве светодиода LED1_ACTIVATE
 * BUTTON_ACTIVATE  = TO ARD PIN 2    
 */

// Сначала создаём объект radio с подключенными пинами CN - 9, SCN - 10
RF24 radio(9, 10);

//Даём уникальное имя каналу приёма/передачи
const uint32_t CHANNEL_PIPE = 0xABCDABCD71LL;

//Указать размер буфера приёма/передачи для обмена радиоданными, буфер равен 2 байта
byte DATA_BUFFER[sizeof(int)];

//Переменная которая назначит роль для устройста
bool role = false;    // Используем для передачи[true] или для приёма[false]

//Пин для светодиода который будет включаться по команде с другого передатчика
const int LED1_ACTIVATE   = 8;  
//Пин для светодиода сигнализации о том что устройство включено в режиме передатчика  
const int LED2_CH_TO_TX   = 7;    
//Пин для кнопки переключения в режим передачи(нажата - передача, не нажата - приём)
const int BUTTON_EN_TX    = 4;    
//Пин для кнопки включения на удаленном устройстве светодиода LED1_ACTIVATE
const int BUTTON_ACTIVATE = 2;    

void setup() 
{
  //Назначить портам конфигурации входов/выходов
  pinMode(LED1_ACTIVATE, OUTPUT);
  pinMode(LED2_CH_TO_TX, OUTPUT);
  pinMode(BUTTON_EN_TX,   INPUT);
  pinMode(BUTTON_ACTIVATE,INPUT);

  //Начать работу с объектом radio
  radio.begin();
  //Установка скорости обмена данными, в нашем случае 250 кбит/с
  radio.setDataRate(RF24_250KBPS);    
  //Установка мощности передатчика, в нашем случае - максимальная
  radio.setPALevel(RF24_PA_MAX);   
  //Назначение номера каналу, 76-й канал(возможные варианты от 0 до 127)   
  radio.setChannel(76);      
  //Начинаем прослушивать канал         
  radio.startListening();             
}

void loop() 
{
  
/*** Режим передачи данных ***/
//Если роль(role) = true
//значит будем передавать
  if(role)                                                    
  {      
    //Прекратить слушать канал, фактически выключить приём                                                     
    radio.stopListening();         
    //Открыть канал с уникальным именем CHANNEL_PIPE для записи                                                     
    radio.openWritingPipe(CHANNEL_PIPE);                      
    //Далее инструкции для передачи данных  
    //Считать в массив DATA_BUFFER значение кнопки BUTTON_ACTIVATE
    DATA_BUFFER[0] = byte(digitalRead(BUTTON_ACTIVATE)); 
    //Передать массив в канал приёма/передачи     
    radio.write(DATA_BUFFER, 2);                               
  }
/*** Режим приёма данных ***/
//Если роль(role) = false
//значит будем принимать
  if(!role)                                               
  {       
    //Открыть канал с уникальным именем CHANNEL_PIPE для чтения из него данных                                                
    radio.openReadingPipe(1,CHANNEL_PIPE);                
    //Начинаем слушать, фактически - режим приёма  
    radio.startListening();                               
    //Если есть доступные данные 
    if(radio.available())                                 
    {
      //А они по условию есть      
      //И пока они есть                                                        
      while(radio.available())                              
      {     
        //Записать их в буфер приёма/передачи DATA_BUFFER                                                        
        radio.read(DATA_BUFFER, 2); 
        //Первый элемент массива DATA_BUFFER 
        //Если значение true                                                           
        if(bool(DATA_BUFFER[0]))                           
        {    
          //Включить светодиод LED1_ACTIVATE                                             
          digitalWrite(LED1_ACTIVATE, HIGH);              
        }
        //Если значение false
        else                                              
        {  
          //Выключить светодиод LED1_ACTIVATE                                         
          digitalWrite(LED1_ACTIVATE, LOW);               
        }
      } 
   }
 }
/*** Назначение режима Приём/Передача ***/ 

  //Состояние кнопки BUTTON_EN_TX определяет роль устройства
  //Кнопка нажата - режим передачи, не нажата - режим приёма
  if(!(digitalRead(BUTTON_EN_TX)))                        
  {             
    //Светодиод индикации, нажата ли кнопка BUTTON_EN_TX                                          
    digitalWrite(LED2_CH_TO_TX, HIGH);                           
    //Далее - назначение ролей
    if(role == false)                                     
    {
      role = true;
    }
  }
  else
  {
    digitalWrite(LED2_CH_TO_TX, LOW);

    if(role == true)
    {
      role = false;
    }
  }
}

Вкратце опишу, как работает собранное устройство. Когда включается устройство, то сразу после инициализации переходит в режим радиоприёма, то же самое касается и второго устройства. При нажатии и удержании в нажатом состоянии кнопки S1, включается светодиод LED2(Смотрите принципиальную схему выше), который означает переход устройства в режим передачи. Если, при нажатой кнопке S1, нажать на сенсорную кнопку S2, то на другом устройстве загорится светодиод LED1, сигнализирующий об успешном приёме данных с радиопередатчика.

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

И еще напоследок, испытание этих двух приборов в полевых условиях(плотная бетонная застройка жилого района), показала довольно таки неплохой результат - 150 метров уверенного приёма/передачи. Хотя на открытой местности, как заявляет производитель модулей NRF24L01,  сигнал должен покрывать расстояние в 1000 метров без проблем, да, я забыл сказать что мной были использованы модули с внешней антенной и встроенным усилителем. Тот модуль что показан на принципиальной схеме выше, уверенно покрывает расстояние в 20 метров.

Небольшая ложка дегтя - для тех кто захочет повторить схему. Модули NRF24L01 не очень дружат с платой Arduino Nano, всё из-за просадки напряжения в 3.3 вольт на плате Nano. Можно припаять полярный конденсатор номиналом 47mf * 25V  к разъёмам питания платы(об этом можно прочитать на многих форумах по электронике), но этот решение малоэффективно. Как вариант, использовать силовые шилды для Arduino Nano,  либо пользоваться платой Arduino Uno.



Расскажи о нас

Сообщение

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