NRF24L01 - Arduino

NRF24L01 - Arduino





Радиомодули nRF24L01+ позволяют передавать данные на частоте 2,4ГГц.



Общие характеристики для всех модулей:

Напряжение питания — от 1,9 до 3,6v, рекомендуемое 3,3v.
Входы толерантны к напряжению до 5v, то есть можно подключать к микроконтроллеру, работающему от 5v.
Взаимодействует с микроконтроллером по шине SPI.
Возможные скорости обмена данными — 250kbps, 1Mbps и 2Mbps.
Количество каналов — 126, с шагом 1мгц. Если установлена скорость передачи 2MBPS, то используется ширина двух каналов.
Энергопотребление около 0,9мкА в режиме power-down, до 11,3мА при передаче, и до 13,5мА при приёме.

Стоимость колеблется от 50 до 200р.




Версии модулей

nRF24L01+

Дальность до 100м на открытом пространстве и до 30м в помещении (дальность указана для минимальной скорости передачи данных — 250kbps).
Размер 29мм на 15мм.






Версия мини. Наследует характеристики предыдущего модуля.
Размер 18мм на 12мм.






С внешней антенной.
Дальность до 200м на открытом пространстве и до 50м в помещении.






С внешней антенной и усилителем.
Дальность до 1000м на открытом пространстве.
Размер 45мм на 16мм.




Для модулей кроме мини, существует «переходник» со стабилизатором на 3.3v.






Так же стоит отметить существование модуля nRF24LE1, способного работать автономно (без ардуины). Однако для работы с этим модулем необходим программатор и соответствующие навыки.






Подключение к ардуине


Arduino Nano, UNO

SCKD13
MOSID11
MISOD12
CSND10
CE/SSD9


Arduino MEGA

SCKD52
MOSID51
MISOD50
CSND53
CE/SSD49

  Для СЕ и CSN можно использовать любые пины (меняется в скетче RF24 radio(9,10);).






  Для улучшения качества связи, рекомендуется припаять конденсатор ~100мкф между плюсом и минусом модуля.




Программирование


Пример №1

Итак, нам понадобится библиотека RF24, две ардуины, два модуля и один светодиод.


Первая ардуина будет по очереди отправлять два числа — 255 и 155:


#include <SPI.h>
#include <RF24.h>
RF24 radio(9, 10); // можно использовать любые
const uint32_t pipe = 123456789; // адрес
byte massiv[1];

void setup()
{
  Serial.begin(57600);
  radio.begin();
  radio.setDataRate(RF24_250KBPS); // скорость обмена данными RF24_1MBPS или RF24_2MBPS
  radio.openWritingPipe(pipe); // открыть канал на отправку
}


void loop()   
{
  massiv[0] = 255;
  radio.write(massiv, 1);
  delay(500);
  massiv[0] = 155;
  radio.write(massiv, 1);
  delay(500);
}




Вторая ардуина будет принимать числа (255 и 155) и включать/выключать светодиод подключенный к D6:


#include <SPI.h>
#include <RF24.h>
RF24 radio(9, 10);
const uint32_t pipe = 123456789;

byte massiv[4];

void setup()   
{
  pinMode(6, OUTPUT);
  Serial.begin(57600);
  radio.begin();
  radio.setDataRate(RF24_250KBPS); // RF24_1MBPS или RF24_2MBPS
  radio.openReadingPipe(1,pipe); // открыть канал на приём
  radio.startListening(); // приём
}


void loop()  
{
  if(radio.available())
    {
      radio.read(massiv, 1);
      if(massiv[0] == 255)
        {
          Serial.println(massiv[0]); 
          digitalWrite(6, HIGH);
        }

      if(massiv[0] == 155)
        {
          Serial.println(massiv[0]); 
          digitalWrite(6, LOW);
        }        
     }
}




Пример №2

Первая ардуина будет посылать значения температуры и влажности второй ардуине. Потребуется библиотека stDHT.

Отправка:


#include <SPI.h>
#include <RF24.h>
RF24 radio(9, 10); 
#include "stDHT.h"
DHT sens(DHT22);

const uint32_t pipe = 123456789; 
byte massiv[2];

void setup()
{
  Serial.begin(57600);
  radio.begin();
  radio.setDataRate(RF24_250KBPS); 
  radio.openWritingPipe(pipe);
}


void loop()   
{
  int t = sens.readTemperature(2); // чтение датчика на пине 2
  int h = sens.readHumidity(2); 
  massiv[0] = t;
  massiv[1] = h;
  radio.write(massiv, 2);
  delay(2000);
}



Приём:


#include <SPI.h>
#include <RF24.h>
RF24 radio(9, 10);
const uint32_t pipe = 123456789;

byte massiv[2];

void setup()   
{
  pinMode(6, OUTPUT);
  Serial.begin(57600);
  radio.begin();
  radio.setDataRate(RF24_250KBPS); 
  radio.openReadingPipe(1,pipe);
  radio.startListening();
}


void loop()  
{
  if(radio.available())
    {
      radio.read(massiv, 2);
      int t = massiv[0];
      int h = massiv[1]; 
      Serial.println(t);
      Serial.println(h);
    }
}


Здесь показаны простые примеры, «чтоб заработало», а вот для вдумчивого изучения рекомендую обратится к примерам из библиотеки.



  • 0
  • 39490

Комментарии (5)

0
В приёмной части ардуин нужно в строки со словами «println» исправить на «print», иначе не будет компилироваться.
0
Не вводите людей в заблуждение.
0
Я ни на чем не настаиваю, приведенные примеры скетчей для приемника выдает такие ошибки в окне компиллятора:
" collect2.exe: error: ld returned 5 exit status
Ошибка компиляции. "
После исправления компилляция без ошибок.
0
Это проблемы горе-ОС, решение здесь.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.