Módulo Transceptor RF NRF24L01 Comunicación – Arduino

NRF24L01 es un módulo RF inalámbrico de baja potencia de 2,4 GHz de Nordic Semiconductors. Puede operar con velocidades de transmisión desde 250 kbps hasta 2 Mbps. Si se opera en un espacio abierto con una tasa de baudios más baja, puede alcanzar hasta 300 pies. Por lo tanto, se utiliza en aplicaciones de corto alcance como automatización del hogar, juguetes, controladores de juegos y más.

El módulo NRF24L01 puede transmitir y recibir datos. Utiliza el protocolo SPI para comunicarse con microcontroladores. Por lo tanto, puede usar el módulo con Arduino en los pines de comunicación SPI. Veremos cómo conectar este módulo con un Arduino y controlar un LED desde otro Arduino.

Con un espaciado de 1 Mhz en el rango operativo de 2400 Mhz – 2525 Mhz (2,40 Ghz – 2,525 GHz), puede brindar la posibilidad de tener una red de 125 módems que funcionen de forma independiente en la misma área.

Cada canal puede tener hasta 6 direcciones y puede comunicarse con hasta 6 otras unidades al mismo tiempo.

Características:

  • Voltaje de funcionamiento: 9 V a 3,6 V.
  • Voltaje de suministro: 3V
  • Voltaje de clavija: tolerante a 5 V (no se necesitan convertidores de nivel)
  • IC de transceptor RF GFSK de 2,4 GHz de un solo chip de bajo costo
  • Alcance operativo (espacio abierto): 300 pies (puede aumentar hasta 3000 pies usando una antena externa)

En este tutorial, enviaremos y recibiremos datos mediante la configuración de dos módulos NRF24L01. Una configuración es para el lado del transmisor y otra para el lado del receptor. Enviamos comandos como cadena «ON» (cualquier mensaje que desee enviar) en el lado del transmisor, el lado del receptor imprimiremos el mismo mensaje en el monitor serie que se envió desde el otro lado.

Componentes necesarios:

  • Arduino Uno – 2 Nos. (también puede usar Nano)
  • Módulo RF inalámbrico NRF24L01 – 2 núms.
  • Cables de puente

Bibliotecas:

Biblioteca RF24: https://github.com/tmrh20/RF24/

Detalles de los pines del módulo NRF24L01:

  • TIERRA – Tierra
  • VCC – Fuente de alimentación 3,3 V (1,9 V a 3,6 V)
  • CE – Habilitar chip
  • CSN – Selección de chip No
  • SCK: reloj serie para bus SPI
  • MOSI – Salida maestra Entrada esclava
  • MISO – Maestro en Esclavo Fuera
  • IRQ – Pin de interrupción (activo bajo)
  • Solo el módulo consume de 1,9 V a 3,6 V, pero los pines pueden tolerar hasta 5 V.

    Diagrama de circuito:

    Si está utilizando Arduino Uno, Pro Mini, Nano o Pro Micro, entonces los pines SPI son los mismos que los del siguiente diagrama de circuito. Si está utilizando Arduino Mega, verifique los pines SPI que están asignados de manera diferente según su diseño de hardware. Consulte la página de referencia de la biblioteca SPI para conocer los diferentes pines SPI en diferentes tipos de placa aquí. Además, las placas Arduino tienen un encabezado ICSP separado para ser compatible con Sheilds.

    Lado del transmisor:

    El circuito para el lado del transmisor y el lado del receptor es el mismo para este ejemplo.

    Código – Lado del transmisor:

    #include <SPI.h>  #include <nRF24L01.h>  #include <RF24.h>    RF24 radio(7, 8); // CE, CSN  const byte address[6] = "00001";    void setup() {  radio.begin();  radio.openWritingPipe(address);  radio.setPALevel(RF24_PA_MIN);         radio.stopListening();  }    void loop() {  const char text[] = "ON";  radio.write(&text, sizeof(text));  delay(500);  }  

    Lado del receptor:

    El diagrama del circuito es el mismo para el lado del receptor también. Estaremos imprimiendo los datos enviados desde el Transmisor al Receptor en el Monitor Serie.

    Código – Lado del receptor:

    #include <SPI.h>  #include <nRF24L01.h>  #include <RF24.h>    RF24 radio(7, 8); // CE, CSN    const byte address[6] = "00001";    void setup() {    Serial.begin(9600);    pinMode(4,OUTPUT);    radio.begin();    radio.openReadingPipe(0, address);    radio.setPALevel(RF24_PA_MIN);    radio.startListening();  }    void loop() {    if (radio.available()) {      char text[32] = "";      radio.read(&text, sizeof(text));      Serial.println(text);  }  

    Descripción:

    El NRF24l01 puede actuar como transmisor y receptor. En el código anterior en el lado del transmisor, enviamos el texto ‘ON’ y lo mismo se mostrará en el lado del receptor a través de Serial Monitor y enciende el LED conectado en el pin 4.

    El NRF24l01 se puede identificar por su dirección. Se menciona en una cadena de números. Nosotros usamos

    const byte address[6] = "00001";

    Usamos ‘00001’ como la dirección aquí. Puede asignar cualquier cadena de números para configurar la dirección.

    Los datos se envían a través de un canal de lectura/escritura en el NRF24l01. Es un búfer temporal que contiene los datos que se enviarán o recibirán.

    Transmisor: escritura de datos en la tubería

    radio.openWritingPipe(address);

    Receptor: lectura de datos de la tubería

    radio.openReadingPipe(0, address);

    Esta es la configuración simple de transmisión y recepción para el módulo NRF. Alternativamente, puede enviar datos del sensor desde el lado del transmisor y, de acuerdo con los valores del sensor, puede realizar algunas acciones en el lado del receptor.

    Sistema de vigilancia de bebés con NRF24L01

    Haremos un pequeño proyecto usando los Módulos NRF24L01. En este proyecto, conectamos un sensor de sonido en el lado del transmisor. Del lado del receptor, la mamá tiene un reloj que tiene un motor de vibración. Puede usar ese reloj y volver a sus otras actividades diarias en casa. Cada vez que el bebé comienza a llorar, la mamá recibe una alerta en su reloj (El lado del receptor). Para que ella regrese y cuide a su hijo.

    El circuito será más similar a nuestro ejemplo anterior. Además, conectaremos un sensor de sonido en el lado del transmisor y un motor de vibración en el lado del receptor.

    Lado del transmisor:

    El sensor de sonido se encenderá cada vez que detecte un sonido de tono alto. Esto permanece por sólo una fracción de segundo. Necesitamos un retraso para mantener el valor al menos durante 500 ms. Para que pueda enviar, habrá estabilidad en el lado del receptor.

    Diagrama de circuito – Transmisor:

    Código – Lado del transmisor:

    #include <SPI.h>                            //SPI Library #include "nRF24L01.h" #include "RF24.h"                          //RF24 Library  RF24 radio(7,8);            //(CE,CSN)Creating an object  const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };  unsigned long Command ;  void setup()     {      Serial.begin(57600);      pinMode(A2,INPUT);      radio.begin();                             radio.setRetries(15,15);                   radio.openReadingPipe(1,pipes[1]);      radio.startListening();      radio.printDetails();      radio.openWritingPipe(pipes[0]);          radio.openReadingPipe(1,pipes[1]);      radio.stopListening();               //switch the modem to data transmission mode     }     void loop(void)     {      radio.stopListening();      int soundSense = analogRead(A2);   //Reading Sound Sensor Data      Serial.println(soundSense);        //Printing Sound data on serial monitor.      if (soundSense <800){              //If value is less than 800 set command as 1      Command=1;      delay(1000);      //Delay to hold the trigger for at least 1 Sec      Serial.println("Data Sent");    //For our reference     }      else        {          Command=2;                //Command 2 in Idle          //delay(500);        }      radio.write( &Command, sizeof(unsigned long) );      radio.startListening();      delay(100);    }

    Lado del receptor:

    En el lado del receptor, conectamos el motor de vibración en el pin 3. Usando un bucle If else activaremos el motor durante 3 segundos cuando se detecte sonido en el lado del transmisor. Puede aumentar el tiempo de vibración aumentando la demora en el bucle if.

    Diagrama de circuito – Receptor:

    Código – Lado del receptor:

    #include <SPI.h>                           #include "nRF24L01.h"  #include "RF24.h"                          RF24 radio(7,8);    // CE, CSN                       const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };  typedef enum { role_ping_out = 1, role_pong_back } role_e;  const char* role_friendly_name[] = { "invalid", "Ping out", "Pong back"};  role_e role = role_pong_back;  void setup(void)     {      Serial.begin(57600);      pinMode(3,OUTPUT);      radio.begin();                          radio.setRetries(15,15);      radio.openReadingPipe(1,pipes[1]);      radio.startListening();            //Starts Listening      radio.printDetails();      radio.openWritingPipe(pipes[1]);      radio.openReadingPipe(1,pipes[0]);      radio.startListening();     }    void loop(void)     {      if ( radio.available() )               //check data received         {            unsigned long data = 0;            radio.read( &data, sizeof(unsigned long) );    //Read data            Serial.println(data);               if (data==1)                     //Compare data                    {                      digitalWrite(3,HIGH);     //Turn ON Vibration Motor if 1                      Serial.println("It's High");                      delay(3000);                    }              else if (data == 2)                    {                      digitalWrite(3,LOW);      //Turn OFF Vibration motor                      Serial.println("It's Low");                      //delay(1000);                    }    delay(20);         }      }