IoT comunicación entre el microcontrolador Arduino haciendo uso de módulo nRF24L01

IoT comunicación entre el microcontrolador Arduino haciendo uso de módulo nRF24L01

Al momento de necesitar hacer una comunicación inalámbrica, ya sea para recopilar datos o mover algún servo que active un mecanismo, los circuitos integrados de radio frecuencia son una alternativa recomendable, más si se trata de cubrir distancias superiores a los 20 metros.

Nordic Semiconductor ofrece un transceptor RF de Ultra Baja Potencia denominado nRF24L01. Las principales características son:

  • Bajo costo
  • Funcionamiento en la banda ISM de 2,4 GHz (banda para Industria, Ciencia y Medicina)
  • Velocidad de datos en aire 256Kbps, 1Mbps y 2Mbps.
  • Acelerador de protocolo de hardware mejorado ShockBurst ™
  • Ultra bajo consumo de energía - meses o años de vida útil de la batería
  • Consumo de 11.3mA mientras trasmite y 13.5mA mientras recibe

Conectar NRF24L01 a Arduino Uno R3

Observemos el esquema de conexión y los pasos a seguir para lograr los resultados esperados:

Figura 1

Es importante aclarar que la alimentación se debe realizar a 3.3V.

Un capacitor de 10μA es necesario para atenuar el ruido, muchas veces la falta de este componente nos provoca cantidad de inconvenientes y pérdidas de tiempo hasta encontrar el motivo por el cual no transmite.

Vamos a realizar un ensayo de comunicación inalámbrica entre dos Arduinos Uno R3. Para esto se deben armar dos circuitos iguales donde uno va a auspiciar de emisor y el otro de receptor. Al armado en la figura 1 podemos agregarle un led que nos señalice que los circuitos están funcionando correctamente.



Circuito Emisor Circuito Receptor


El circuito está construido para que al momento de emitir el mensaje, el emisor, el LED titile durante unos segundos, y luego el receptor hará lo mismo al recibir el mensaje enviado.

Hardware, Software y comunicación inalámbrica.

Para armar el circuito es necesario contar con:

  • Placa Arduino Uno R3
  • Capacitor de 10μA
  • Resistencia de 220 Ohm
  • Protoboard
  • LED
  • Cables de conexión

El programa está desarrollado utilizando las librerías SPI y RF24, solo es a ejemplo de mostrar el funcionamiento del módulo NRF24L01.

Código EmisorCódigo Receptor

#include 
// #include "nRF24L01.h"
#include "RF24.h"

RF24 emi(7,8);

// const uint64_t pipes = 0xF0F0F0F0E1LL;

byte pipes[][6] = {"1Node"};
int PIN_LED=2;

void setup(void)
{
    pinMode(2, OUTPUT); 
    Serial.begin(9600);
    emi.begin();
  
    emi.setRetries(15,15);    
// Maximos reintentos 
     emi.openWritingPipe( pipes[0]);
    
   // emi.openWritingPipe(pipes[0]);
   // emi.openReadingPipe(1,pipes[1]);
    // emi.setChannel(108);
       emi.setDataRate(RF24_250KBPS );
}

void loop(void)
{
   // emi.stopListening();    
// Paramos la escucha para poder hablar
    unsigned long time = millis();
    Serial.print("Enviando  ");
    Serial.println(time);
    bool trn = emi.write( &time, sizeof(unsigned long) );
   
    Titila();

    if (trn)
           Serial.println("Transmitio...");
      else
        Serial.println("Fallo");
  
   // emi.startListening(); 
     
    delay(500);
}
 void Titila()
{
  Serial.println("Entra");
  for (int i = 0; i<=4; i++)
        {
          digitalWrite(PIN_LED, HIGH);
          delay(100);
          digitalWrite(PIN_LED, LOW);
          delay(100);
}
}
  

#include 
// #include "nRF24L01.h"
#include "RF24.h"

RF24 reci(7, 8);
byte cola[][6] = {"1Node"};
// const uint64_t cola = 0xF0F0F0F0E1LL;
int PIN_LED = 4;
void setup(void)
{
  pinMode(4, OUTPUT);
  Serial.begin(9600);

  reci.begin();
  reci.setRetries(15, 15);
  reci.startListening();
 // reci.openWritingPipe(cola[1]);
  reci.openReadingPipe(1, cola[0]);
  // reci.setChannel(108);
  reci.setDataRate(RF24_250KBPS);

}

void loop(void)
{

  if ( reci.available() )  
// Si hay datos disponibles
  {
    unsigned long respuesta;
    bool traer_datos = false;
   // while (!traer_datos)        
// Espera aqui hasta recibir algo
    if (reci.available())
    {

      reci.read( &respuesta, sizeof(unsigned long) );
      Titila();
      Serial.print("Dato Recibido =");
      Serial.println(respuesta);
      delay(20);  // Para dar tiempo al emisor
    }
  }
}

void Titila()
{
  Serial.println("Entra");
  for (int i = 0; i <= 4; i++)
  {
    digitalWrite(PIN_LED, HIGH);
    delay(100);
    digitalWrite(PIN_LED, LOW);
    delay(100);
  }
}

Hablemos de la comunicación.

La comunicación es el punto más importante, y si bien las características del módulo nRF24L01 son interesantes desde el punto de vista del control de errores y el acelerador (ShockBurst ™), también es importante al momento de evaluar un proyecto, la problemática del rango de alcance.

En ese sentido hay una opción del módulo que viene con un amplificador de potencia y antena externa.

Utilizando este módulo con amplificación de potencia, el alcance puede ser de hasta 1000 mts en condiciones de campo abierto, pero se logran alcances de 200 o 300 metros en condiciones de ciudad con una relativa visibilidad entre circuitos.<7p>

Otra opción del módulo es la que viene con antena incorporada.

Para este caso la distancia llega a unos 20 o 30 mts. Considerando el contexto ambiental, es decir, paredes u obstáculos que se presenten en el camino entre los dos circuitos.

Consideraciones a tener en cuenta.

  • Armar una fuente de alimentación independiente de 3.c V que entregue por lo menos 500 ma.
  • Es posible ajustar el amplificador de potencia a través de radio.    setPALevel (RF24_PA_MAX);
  • La velocidad de trasmisión se establece utilizando radio.    setDataRate (RF24_250KBPS);
  • Trabajar por encima de los canales de WiFi radio.    setChannel (108);