Comunicación inalámbrica con Arduino y nRF24L01

Comunicación inalámbrica con Arduino y nRF24L01

En este tutorial, aprenderás todos los detalles esenciales sobre el módulo transceptor nRF24L01 y cómo utilizarlo para comunicarse de forma inalámbrica con las placas Arduino. 

Veremos cómo funciona el transceptor nRF24L01 y cómo conectarlo a Arduino con diagramas de pines y código de ejemplo para que lo utilices.

Después de este tutorial, podrás desarrollar la comunicación inalámbrica entre dos placas Arduino utilizando los módulos transceptores nRF24L01.

Componentes de hardware

Arduino Uno Rev3x1Amazon
Arduino Mega (opcional)x1Amazon
Módulo nRF24L01x1Amazon
LEDx1Amazon
Interruptor de botónx1Amazon
Resistencia de 220Ωx1Amazon
Tablero de pruebasx1Amazon
Cables de puentex10Amazon
Cable USB tipo A/Bx1Amazon

Software

Arduino IDEArduino IDE

Makerguides.com participa en el Programa de Asociados de Amazon Services LLC, un programa de publicidad de afiliados diseñado para proporcionar un medio para que los sitios ganen honorarios de publicidad mediante la publicidad y los enlaces a productos en Amazon.com.


Introducción al nRF24L01

Utilizando el módulo transceptor nRF24L01, dos o más placas de microcontroladores que no tienen instalaciones inalámbricas pueden comunicarse entre sí de forma inalámbrica a distancia.

El nRF24L01 funciona en la banda ISM de 2,4 GHz y se utiliza para la comunicación inalámbrica.

¿Qué es el módulo transceptor nRF24L01?

El módulo RF transceptor inalámbrico NRF24L01 es barato, y es un módulo de tipo Half-Duplex, lo que significa que puede enviar o recibir datos a la vez.

Este módulo puede cubrir 100 metros (200 pies) siempre que funcione con eficacia.

Aunque el voltaje de funcionamiento del módulo va de 1,9V a 3,6V, tiene pines tolerantes a 5V para que puedas conectarlos directamente al Arduino.

Si desea más detalles técnicos, consulte la hoja de datos del nRF24L01.

Especificaciones y características del módulo transceptor nRF24L01:

Las especificaciones y características del NRF24L01 se indican a continuación.

  • La frecuencia es de 2,4GHz ISM.
  • La corriente nominal es de 50mA.
  • 250mA es la corriente máxima de funcionamiento. 
  • Puede funcionar con velocidades en baudios desde 250Kbps hasta 2 Mbps.
  • El módulo consiste en un transceptor GFSK de un solo chip con hardware de capa de enlace OSI.
  • Proporciona auto ACK, retransmisiones, dirección y cálculo de CRC.
  • Proporciona un tiempo de conmutación corto, lo que permite el salto de frecuencia.
  • Tiene en el chip regulador de voltaje
  • Cuenta con el protocolo Enhanced ShockBurst™
  • Gestión automática de paquetes
  • 6 tubos de datos MultiCeiver™
  • Utiliza un cristal ultra ± 60 PPM de 16MHz

Pinout del módulo transceptor nRF24L01

El módulo transceptor nRF24L01 tiene 8 pines disponibles, que se utilizan para enviar o recibir datos.

nRF24L01 Pinout
nRF24L01 Pinout
PinDescripción
GNDEste pin es el de tierra.
VCCEste pin suministra energía al módulo. Puede ser de 1,9 a 3,9 voltios.
CE (Chip Enable) Este pin es un pin activo-ALTO. Cuando se selecciona, el nRF24L01 transmitirá o recibirá, dependiendo de su modo actual. 
CSNEste pin es un pin activo-bajo y normalmente se mantiene ALTO. Cuando este pin se pone bajo, el nRF24L01 comienza a escuchar en su puerto SPI los datos y los procesa en consecuencia.
SCK (reloj serie)El único maestro del bus SPI que proporciona pulsos de reloj.
MOSI (Master Out Slave In)Este pin es la entrada SPI del nRF24L01.
MISO (Master In Slave Out)Este pin es la salida SPI del módulo nRF24L01.
IRQ (Interrupción) Este pin es un pin de interrupción que puede alertar al maestro cuando hay nuevos datos disponibles para procesar.

Cómo funciona el módulo RF del transceptor nRF24L01

El módulo nRF24L01 Transceiver RF tiene un rango de direcciones de 125 para comunicarse con los otros 6 módulos y permite que varias unidades inalámbricas se comuniquen simultáneamente en un lugar determinado.

Cada canal ocupa un ancho de banda inferior a 1MHz.

Cómo funciona el módulo RF del transceptor nRF24L01

El módulo nRF24L01 utiliza el protocolo de comunicación esclavo SPI(Serial Peripheral Interface) con una velocidad máxima de datos de 10Mbps.

Estos pines SPI dependen de los microcontroladores.

-> Lea nuestra guía sobre lo que puede construir con Adruino.

Aplicaciones del módulo transceptor inalámbrico NRF24L01:

  • Aplicaciones del sistema de control inalámbrico
  • Redes de malla
  • Control remoto de drones
  • Control y supervisión de robots
  • Sensores remotos de temperatura, presión, alarmas, etc.
  • Telemetría
  • Equipamiento deportivo inteligente
  • Industrias del juguete
  • Aplicaciones en la automoción
  • Sistemas de seguridad y alarma
  • Sistemas de automatización del hogar
  • Teclado y ratón inalámbricos, Joysticks

¿Cómo conectar el nRF24L01 a Arduino?

Aquí, estoy usando una placa Arduino Uno utilizada como transmisor y una placa Arduino Mega utilizada como receptor.

Ahora, sigue los siguientes pasos para conectar el módulo transceptor nRF24L01 y otros componentes con la placa Arduino.

Diagrama de cableado del módulo nRF24L01 con Arduino Uno como transmisor

Paso 1: Conecte el Arduino Uno al nRF24L01 como se indica en la tabla.

Arduino UnonRF24L01
MISO (12)MISO (6)
MOSI (11)MOSI (7)
SCK (13)SCK (5)
Pin digital 9CE (3)
Clavija digital 10CSN (4)
+3.3VVCC (2)
GNDGND (1)

Paso 2: Conecta el pulsador en el centro de la protoboard. Conecta un lado a la tierra y el otro al pin digital 2 de Arduino Uno.

Paso 3: Conecte el primer terminal del POT a GND y el tercer terminal del POT a +5V VCC en la placa Arduino Uno. 

Conecta el 2º terminal del POT al pin A0 de la placa Arduino Uno. Lee la salida del terminal 2 del potenciómetro.

Asegúrate de que todos los terrenos son comunes.

de POT a +5V VCC en la placa Arduino Uno

-> Lee nuestro artículo sobre ¿Es fácil aprender Arduino?

Diagrama de cableado del módulo nRF24L01 con Arduino Mega como receptor

Paso 1: Conecte el Arduino Mega al nRF24L01 como se indica en la tabla.

Arduino MegaO Arduino UnonRF24L01
MISO (50)MISO (12)MISO (6)
MOSI (51)MOSI (11)MOSI (7)
SCK (52)SCK (13)SCK (5)
Pin digital 9Pin digital 9CE (3)
Clavija digital 10Clavija digital 10CSN (4)
+3.3V+3.3VVCC (2)
GNDGNDGND (1)

Paso 2: Conecta el cátodo del LED (-) a la tierra, y el ánodo (+) del LED a la resistencia de 220 Ohm al pin digital 3 de la placa Arduino Mega.

Conectar el cátodo del LED
resistencia al pin digital 3 de la placa Arduino Mega
Placa Arduino Mega

Instalación de la biblioteca Arduino necesaria para el nRF24L01

Para utilizar el módulo nRF24L01 con el IDE de Arduino, puede utilizar una biblioteca ya construida de RF24.h.

Siga los siguientes pasos para instalar la biblioteca RF24.h en el IDE de Arduino.

Paso 1: Ve a Herramientas > Gestionar Bibliotecas para abrir el gestor de bibliotecas en Arduino IDE.

gestor de bibliotecas en el IDE de Arduino

Paso 2: Ahora, en el cuadro de búsqueda, escriba "RF24" y seleccione la biblioteca RF24.h, instale la última versión y utilícela.

RF24
instalar la última versión

Código Arduino para nRF24L01 (transmisor con potenciómetro)

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN   9
#define CSN_PIN 10
#define pot_pin A0

RF24 radio(CE_PIN, CSN_PIN);

const byte addresses [][6] = {"00001", "00002"};  //Setting the two addresses. One for transmitting and one for receiving
int button_pin = 2;

volatile int button_state = 0;
volatile int last_button_state = 0;
volatile int pot_flag = 0;

String str;
char pass[] = "A1B1";
char rx[5];
char pass_key[4] = {};

void setup() {
  pinMode(button_pin, INPUT_PULLUP);
  pinMode(pot_pin, INPUT);
  Serial.begin(9600);
  Serial.println("System Init");
  radio.begin();                           //Starting the radio communication
  radio.openWritingPipe(addresses[1]);     //Setting the address at send the data
  radio.openReadingPipe(1, addresses[0]);  //Setting the address at received the data
  radio.setPALevel(RF24_PA_MIN); //You can set it as minimum or maximum depending on the distance between the transmitter and receiver.
}

void loop()
{
  button_state = digitalRead(button_pin);
  if (button_state != last_button_state ) {
    if (button_state == LOW) {
      Serial.println("Enter your Password");
L1:      while (!Serial.available());
      {
        str = Serial.readString();
        for (int i = 0; i < str.length(); i++)
        {
          pass_key[i] = str[i];
        }
      }
      radio.stopListening();          //This sets the module as transmitter
      delay(10);
      if ((str.equals("A2B2")))
      {
        radio.write(&pass_key, sizeof(pass_key));        
        str[0] = '\0';
        pass_key[0] = '\0';
      }
      else
      {
        Serial.println("Please Enter Correct Password");
        str[0] = '\0';
        pass_key[0] = '\0';
        goto L1;
      }
    }
  }
  last_button_state = button_state;

  radio.startListening();                            //This sets the module as receiver

  if (radio.available()) {
    radio.read(&rx, sizeof(rx));
    delay(5);
    if ((strcmp(rx , pass) == 0) || ( pot_flag == 1))
    {
      Serial.println("Password Authentication Done !");
      while (1) {
        pot_flag = 1;
        int data = analogRead(pot_pin);
        radio.stopListening();
        radio.write(&data, sizeof(data));    // Sending data over NRF24L01
        Serial.print("Transmitting Data : ");
        Serial.println(data);     // Printing POT value on serial monitor
        delay(1000);
      }
    }
  }
}

Cómo funciona el código del transmisor nRF24L01

Paso 1: En primer lugar, he incluido la biblioteca necesaria y he definido las variables necesarias.

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN   9
#define CSN_PIN 10
#define pot_pin A0

Paso 2: RF24 radio(CE_PIN, CSN_PIN);

Este objeto radio representa un módem conectado al Arduino. Los argumentos CE_PIN y CSN_PIN son PINs digitales.

Step 3: const byte addresses [][6] = {“00001”, “00002”};

A continuación, crea una matriz de bytes que represente la dirección, y crea dos tuberías o direcciones para la comunicación bidireccional.

Paso 4: void setup()

En la función void setup, utilizando la función pinMode(), el botón se utiliza como INPUT_PULLUP y el potenciómetro se establece como INPUT.

Serial.begin(); función que establece la tasa de baudios a una frecuencia de 9600.

radio.begin(); Esta función activa e inicializa el módem.

radio.openWritingPipe(addresses[1]); función, establece la dirección del transmisor.

radio.openReadingPipe(1, addresses[0]); la función establece la misma dirección que el receptor y permite la comunicación entre emisor y receptor.

La función radio.setPALevel() establece el nivel del amplificador de potencia. Yo lo pongo al mínimo ya que mis módulos están muy cerca.

Paso 5: void loop()

En el bucle de vacío,

función radio.stopListening() que establece el módulo como transmisor.

función radio.startListening() que establece el módulo como receptor.

radio.write(&tx, sizeof(tx)) se utiliza para enviar ese mensaje al receptor.

Serial.readString() lee los caracteres del búfer serie en una cadena. 

Función Strcmp y Str.equals se utiliza para comparar las dos cadenas de contraseñas para que la MCU pueda identificar si la contraseña introducida es correcta o no.

La función digitalRead() lee el estado lógico de un pin.

La función radio.available( ), comprueba si hay datos para recibir.

Recuerde, antes de ser enviado los datos por la radio, la primera llamada a la función radio.stopListening( ), y leer cualquier dato primera llamada a la función radio.startListening() .

En primer lugar, espera a que el estado del botón esté por debajo y luego pide una contraseña, que es una contraseña predefinida del lado del receptor, "A2B2". Introduje la contraseña utilizando el terminal de serie.

Si la contraseña introducida es correcta, el LED del lado del receptor parpadeará cinco veces.

El mensaje de impresión en el terminal de serie es "¡Autentificación de la contraseña realizada! ", y si no, vuelve a pedir la contraseña correcta.

radio.startListening();             
 if (radio.available()) {
    radio.read(&rx, sizeof(rx));
    delay(5);
    if ((strcmp(rx , pass) == 0) || ( pot_flag == 1))
    {
      Serial.println("Password Authentication Done !");
      while (1) {
        pot_flag = 1;
        int data = analogRead(pot_pin);
        radio.stopListening();
        radio.write(&data, sizeof(data));    
        Serial.print("Transmitting Data : ");
        Serial.println(data);     
        delay(1000);
      }
    }
  }
}

Si la contraseña recibida y la contraseña introducida coinciden, mediante el potenciómetro se puede variar el brillo del LED.

Lo más interesante es que el LED está conectado al lado del receptor.

Envía el valor del potenciómetro al lado del receptor y el valor se imprime en el terminal de serie.

Código Arduino para nRF24L01 (Receptor con LED)

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN   9
#define CSN_PIN  10
#define led_pin 3

RF24 radio(CE_PIN, CSN_PIN);

const byte addresses [][6] = {"00001", "00002"};    //Setting the two addresses. One for transmitting and one for receiving

String str;
char pass[] = "A2B2";

char rx[5];
char pass_key[4] = {};
volatile int pot_flag = 0;
int rx_int = 0;

void setup() {
  pinMode(led_pin, OUTPUT);
  digitalWrite(led_pin, LOW);
  Serial.begin(9600);
  Serial.println("System Init");
  radio.begin();                            //Starting the radio communication
  radio.openWritingPipe(addresses[0]);      //Setting the address at send the data
  radio.openReadingPipe(1, addresses[1]);   //Setting the address at received the data
  radio.setPALevel(RF24_PA_MIN);            //You can set it as minimum or maximum depending on the distance between the transmitter and receiver.
}

void loop() {
  radio.startListening();                    //This sets the module as receiver
  if (radio.available())
  {
    {
      rx[0] = 0;
      radio.read(&rx, sizeof(rx));
    }
    if (strcmp(rx , pass) == 0)
    {
      Serial.println("Password Authentication Done !");
      Serial.println("LED BLINK");
      for (int i = 0; i < 5; i++) {
        digitalWrite(led_pin, HIGH);
        delay(100);
        digitalWrite(led_pin, LOW);
        delay(100);
      }
      radio.stopListening();                           //This sets the module as transmitter
      delay(10);
      Serial.println("Enter your Password");
L1:      while (!Serial.available());
      {
        str = Serial.readString();
        for (int i = 0; i < str.length(); i++)
        {
          pass_key[i] = str[i];
        }
      }
      if ((str.equals("A1B1")))
      {
        radio.write(&pass_key, sizeof(pass_key));
        pot_flag = 1;
        str[0] = '\0';
        pass_key[0] = '\0';
      }
      else
      {
        Serial.println("Please Enter Correct Password");
        str[0] = '\0';
        pass_key[0] = '\0';
        goto L1;
      }
    }

    if (pot_flag == 1)
    {
      radio.startListening();
      while (1)
      {
        rx_int = 0;
        radio.read(&rx_int, sizeof(rx_int));
   Serial.print("Received Data : ");
   Serial.println(rx_int);      // Print received value on Serial Monitor
   analogWrite(led_pin , rx_int); // Write received value to pin 3 where LED is connected
   delay(1000);
      }
    }
  }
}

Cómo funciona el código del receptor nRF24L01

Paso 1: En primer lugar, incluyo la biblioteca necesaria y defino la variable.

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN   9
#define CSN_PIN  10
#define led_pin 3

Paso 2: void setup()

En la función de configuración, el LED se establece como modo OUTPUT utilizando la función pinMode(). Y se inicializa el terminal serie y la radio.

Paso 3: void loop()

En el bucle void(), si la radio está disponible, recibe los datos transmitidos y los compara con una contraseña.

Si la contraseña coincide con el terminal de serie, imprimirá "¡Autentificación de la contraseña realizada! " El LED parpadeará cinco veces.

Las funciones de la radio son las mismas que he explicado en la sección del lado del transmisor.

Ahora, le pedirá la contraseña del transmisor para enviarla al transmisor. Si su contraseña es correcta, entonces se iniciará la comunicación.

De lo contrario, le pedirá una contraseña válida.

Comunicación inalámbrica entre dos nRF24L01

Salida del transmisor en el terminal de serie

Salida del transmisor en el terminal de serie

Salida del receptor en el terminal de serie

Salida del receptor en el terminal de serie

->Consulta nuestra guía de los 12 mejores cursos online de Arduino

¿Puede el nRF24L01 conectarse al WiFi?

No es posible conectarse a WiFi en el módulo nRF24L01. Aunque el nRF24L01 se utiliza para la comunicación inalámbrica, la capa PHY en el nRF24L01+ y el wifi son diferentes.

Vídeo de presentación y explicación

Si necesitas una guía del video, sigue este enlace a un video tutorial que hice.

Conclusión

Después de este tutorial, puedes establecer una comunicación inalámbrica entre dos módulos nRF24L01 utilizando placas Arduino.

Además, puedes controlar el brillo del LED del lado del receptor desde el potenciómetro del lado del transmisor.

Espero que hayas encontrado este tutorial informativo. Si lo has hecho, ¡compártelo con un amigo al que le guste la electrónica y hacer cosas!

Me encantaría saber qué proyecto tienes pensado construir o has hecho ya con el Arduino.

Si tienes alguna pregunta o sugerencia o crees que faltan cosas en este tutorial, por favor, comenta abajo.

Tenga en cuenta que los comentarios son retenidos por la moderación para evitar el spam.