nRF24L01 – Cómo funciona, interfaz Arduino, circuitos, códigos

Si estás interesado en adentrarte en el mundo de la comunicación inalámbrica, el módulo nRF24L01 es una excelente opción. En este artículo, te explicaremos cómo funciona este dispositivo, cómo puedes conectarlo a tu Arduino, algunos circuitos útiles y códigos que te ayudarán a sacarle el máximo provecho. ¡Sigue leyendo para descubrir todas las posibilidades que ofrece el nRF24L01!

En este tutorial aprenderemos cómo Comunicación inalámbrica entre dos placas Arduino con el nRF24L01 Módulos transceptores. El módulo nRF24L01 es una opción muy popular para la comunicación inalámbrica cuando se utiliza Arduino.

He utilizado este módulo para numerosos proyectos Arduino y puedes consultar algunos de ellos aquí:

  • Transmisor RC Arduino de bricolaje
  • Avión RC Arduino | 100% bricolaje
  • Aerodeslizador RC basado en Arduino DIY
  • Proyecto Arduino para una estación meteorológica inalámbrica.

Puede ver el vídeo a continuación o leer el tutorial escrito a continuación. Contiene todo lo que necesitamos saber sobre el módulo transceptor nRF24L01, como la distribución de pines del módulo, el principio de funcionamiento, el cableado y varios ejemplos de código.

descripción general

Para explicar la comunicación inalámbrica, hagamos dos ejemplos: en el primero, enviamos un mensaje simple de «Hola mundo» de un Arduino a otro. En el segundo ejemplo tenemos comunicación bidireccional entre las placas Arduino, donde usamos el joystick en el primer Arduino para controlar el servomotor en el segundo Arduino y viceversa usando el botón pulsador en el segundo Arduino para controlar el LED encendido. el primer arduino.

nRF24L01 – Cómo funciona, interfaz Arduino, circuitos, códigos

Módulo transceptor nRF24L01

Echemos un vistazo más de cerca al módulo transceptor NRF24L01. Utiliza la banda de 2,4 GHz y puede funcionar a velocidades de baudios de 250 kbps a 2 Mbps. Cuando se utiliza en exteriores y con una velocidad de transmisión más baja, su alcance puede ser de hasta 100 metros.

nRF24L01 – Cómo funciona, interfaz Arduino, circuitos, códigos

Aquí>

Rango de frecuencia Banda ISM de 2,4 – 2,5 GHz
Tasas de transferencia de datos 250 Kbit/s / 1 Mbit/s / 2 Mbit/s
Potencia de salida máx. 0dBm
Tensión de funcionamiento 1,9 a 3,6 V
Corriente de funcionamiento máx. 12,3 mA
Energía de reserva 22 µA
Entradas lógicas Tolerante a 5V
Rango de comunicación 100m (espacio abierto)

Cómo funciona

El módulo puede utilizar 125 canales diferentes, lo que ofrece la posibilidad de ejecutar una red de 125 módems que funcionan de forma independiente en un solo lugar. Cada canal puede tener hasta 6 direcciones, o cada unidad puede comunicarse con hasta otras 6 unidades simultáneamente.

nRF24L01 – Cómo funciona, interfaz Arduino, circuitos, códigos

El>

nRF24L01 – Cómo funciona, interfaz Arduino, circuitos, códigos

Tres>

Variantes de módulo

Existen varias variantes del módulo NRF24L01. La versión más popular es la versión con antena integrada. Esto hace que el módulo sea más compacto, pero el alcance de transmisión se reduce a unos 100 metros.

nRF24L01 – Cómo funciona, interfaz Arduino, circuitos, códigos

La>

Además de la antena de pato, la tercera variante que se muestra aquí tiene un chip RFX2401C, que incluye: PENSILVANIA (amplificador de potencia) y LNA (Amplificador de bajo ruido). Esto amplifica la señal NRF24L01 y permite un rango de transmisión aún mejor de hasta 1000 metros en campos abiertos.

Configuración de pines del módulo nRF24L01

A continuación se ofrece una descripción detallada del pinout del NRF24L01 y del módulo PA/LNA NRF24L01+.

nRF24L01 – Cómo funciona, interfaz Arduino, circuitos, códigos

Ambos>

Cómo conectar nRF24L01 a Arduino

Entonces necesitamos conectar los módulos NRF24L01 a las placas Arduino.

nRF24L01 – Cómo funciona, interfaz Arduino, circuitos, códigos

Como>

arduino SCK MISO MOSI SS
NACIONES UNIDAS 13 12 11 10
nano 13 12 11 10
Mega 52 50 51 53
Pines SPI en varias placas Arduino

Puede obtener los componentes necesarios para este tutorial de Arduino a través de los siguientes enlaces:

  • Módulo transceptor NRF24L01……… Amazon/Banggood/Aliexpress
  • Placa Arduino……………………………… Amazon/Banggood/Aliexpress
  • Cables de puente y placa de pruebas………… Amazon/Banggood/Aliexpress

Divulgación: estos son enlaces de afiliados. Como asociado de Amazon, gano con compras que califican.

Código Arduino y nRF24L01

Una vez que hemos conectado los módulos NRF24L01 a las placas Arduino, podemos comenzar a crear los códigos del transmisor y del receptor.

Primero debemos descargar e instalar el biblioteca RF24 lo que facilita la programación. También podemos instalar esta biblioteca directamente desde Arduino IDE Library Manager. Simplemente busque «rf24» y busque e instale los de «TMRh20, Avamander».

Aquí están los dos códigos para la comunicación inalámbrica y su descripción se encuentra a continuación.

Código del transmisor

/*
* Arduino Wireless Communication Tutorial
*     Example 1 - Transmitter Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

#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[] = "Hello World";
  radio.write(&text, sizeof(text));
  delay(1000);
}Code language: Arduino (arduino)

Código de destinatario

/*
* Arduino Wireless Communication Tutorial
*       Example 1 - Receiver Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

#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);
  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);
  }
}Code language: Arduino (arduino)

Descripción del código

Por lo tanto, debemos incluir el SPI básico y las bibliotecas RF24 recién instaladas y crear un objeto RF24. Los dos argumentos aquí son los pines CSN y CE.

RF24 radio(7, 8); // CE, CSNCode language: Arduino (arduino)

A continuación, necesitamos crear una matriz de bytes que represente la dirección o la llamada tubería a través de la cual se comunican los dos módulos.

const byte address[6] = "00001";Code language: Arduino (arduino)

Podemos cambiar el valor de esta dirección a cualquier cadena de 5 letras y así seleccionar con qué destinatario estamos hablando. En nuestro caso, tenemos la misma dirección para el destinatario y el remitente.

En la sección de configuración, necesitamos inicializar el objeto de radio y usar la función radio.openWritingPipe() para configurar la dirección del receptor al que enviaremos datos, que es la cadena de 5 dígitos que configuramos anteriormente.

radio.openWritingPipe(address);Code language: Arduino (arduino)

Por otro lado, en el receptor configuramos la misma dirección mediante la función radio.setReadingPipe(), permitiendo así la comunicación entre los dos módulos.

radio.openReadingPipe(0, address);Code language: Arduino (arduino)

Luego usamos la función radio.setPALevel() para configurar el nivel del amplificador de potencia. En nuestro caso lo puse al mínimo porque mis módulos están muy cerca uno del otro.

radio.setPALevel(RF24_PA_MIN);Code language: Arduino (arduino)

Tenga en cuenta que cuando se utiliza un nivel superior, se recomienda utilizar un condensador de derivación entre GND y 3,3 V de los módulos para que tengan un voltaje más estable durante el funcionamiento.

A continuación tenemos la función radio.stopListening() que configura el módulo como remitente y por otro lado tenemos la función radio.startListening() que configura el módulo como receptor.

// at the Transmitter
radio.stopListening();Code language: Arduino (arduino)
// at the Receiver
radio.startListening();Code language: Arduino (arduino)

En la sección de bucle, creamos una matriz de caracteres en el remitente al que asignamos el mensaje «Hola mundo». Usando la función radio.write(), enviamos este mensaje al destinatario. El primer argumento aquí es la variable que queremos enviar.

void loop() {
 const char text[] = "Hello World";
 radio.write(&text, sizeof(text));
 delay(1000);
}Code language: Arduino (arduino)

Al usar el “&” antes del nombre de la variable, en realidad estamos especificando una indicación de la variable que almacenará los datos a enviar, y con el segundo argumento estamos especificando la cantidad de bytes que queremos tomar de esa variable. En este caso, la función sizeof() obtiene todos los bytes de la cadena «texto». Al final del programa añadimos un retraso de 1 segundo.

Usando la función radio.write() podemos enviar un máximo de 32 bytes a la vez.

Por otro lado, en el receptor, en la sección loop comprobamos si hay datos para recibir mediante la función radio.available(). Si este es el caso, primero creamos una matriz de 32 elementos llamada «texto» en la que almacenamos los datos entrantes.

void loop() {
  if (radio.available()) {
    char text[32] = "";
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }
}Code language: Arduino (arduino)

Usando la función radion.read(), leemos y guardamos los datos en la variable «Texto». Al final simplemente imprimimos el texto en el monitor serie. Entonces, una vez que carguemos ambos programas, podemos ejecutar el monitor serial en el receptor y notaremos que el mensaje “Hello World” se imprime cada segundo.

Solución de problemas

Cabe resaltar que Ruido de la fuente de alimentación Es uno de los problemas más comunes que se encuentran al intentar establecer una comunicación exitosa con los módulos NRF24L01. En general, los circuitos de RF o las señales de radiofrecuencia son sensibles al ruido de la fuente de alimentación. Por lo tanto, siempre es una buena idea instalar un condensador de desacoplamiento en la línea de alimentación. El condensador puede estar entre 10uF y 100uF.

nRF24L01 – Cómo funciona, interfaz Arduino, circuitos, códigos

Otro>

Comunicación inalámbrica bidireccional con dos NRF24L01 y Arduino

Veamos el segundo ejemplo, una comunicación inalámbrica bidireccional entre dos placas Arduino. Aquí están los esquemas:

nRF24L01 – Cómo funciona, interfaz Arduino, circuitos, códigos

Puede>

  • Módulo transceptor NRF24L01………… Amazon / Banggood / AliExpress
  • Placa Arduino……………………………………. Amazon / Banggood / AliExpress
  • Módulo de palanca de mando ………………………………. Amazon / Banggood / AliExpress
  • Servo motor ……………………………………. Amazon / Banggood / AliExpress
  • Presionar el botón…………………………………….. Amazon / Banggood / AliExpress
  • CONDUJO………………………………………………… Amazon / Banggood / AliExpress

Divulgación: estos son enlaces de afiliados. Como asociado de Amazon, gano con compras que califican.

nRF24L01 – Cómo funciona, interfaz Arduino, circuitos, códigos

Ver también
Cómo crear una red inalámbrica Arduino con múltiples módulos NRF24L01

código fuente nRF24L01

Aquí están los dos códigos y su descripción a continuación.

Código del transmisor

/*
* Arduino Wireless Communication Tutorial
*     Example 2 - Transmitter Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

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

#define led 12

RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
boolean buttonState = 0;

void setup() {
  pinMode(12, OUTPUT);
  radio.begin();
  radio.openWritingPipe(addresses[1]); // 00002
  radio.openReadingPipe(1, addresses[0]); // 00001
  radio.setPALevel(RF24_PA_MIN);
}

void loop() {
  delay(5);

  radio.stopListening();
  int potValue = analogRead(A0);
  int angleValue = map(potValue, 0, 1023, 0, 180);
  radio.write(&angleValue, sizeof(angleValue));

  delay(5);
  radio.startListening();
  while (!radio.available());
  radio.read(&buttonState, sizeof(buttonState));
  if (buttonState == HIGH) {
    digitalWrite(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  }
}Code language: Arduino (arduino)

Código de destinatario

/*
* Arduino Wireless Communication Tutorial
*     Example 2 - Receiver Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

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

#define button 4

RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
Servo myServo;
boolean buttonState = 0;

void setup() {
  pinMode(button, INPUT);
  myServo.attach(5);
  radio.begin();
  radio.openWritingPipe(addresses[0]); // 00001
  radio.openReadingPipe(1, addresses[1]); // 00002
  radio.setPALevel(RF24_PA_MIN);
}

void loop() {
  delay(5);
  radio.startListening();
  if ( radio.available()) {
    while (radio.available()) {
      int angleV = 0;
      radio.read(&angleV, sizeof(angleV));
      myServo.write(angleV);
    }
    delay(5);
    radio.stopListening();
    buttonState = digitalRead(button);
    radio.write(&buttonState, sizeof(buttonState));
  }
}Code language: Arduino (arduino)

La diferencia con el ejemplo anterior es que necesitamos crear dos tuberías o direcciones para la comunicación bidireccional.

const byte addresses[][6] = {"00001", "00002"};Code language: Arduino (arduino)

En la sección de configuración, debemos definir ambas tuberías y tener en cuenta que la dirección de escritura en el primer Arduino debe ser la dirección de lectura en el segundo Arduino y viceversa, la dirección de lectura en el primer Arduino debe ser la dirección de escritura en el segundo Arduino.

// at the Transmitter
radio.openWritingPipe(addresses[1]); // 00001
radio.openReadingPipe(1, addresses[0]); // 00002Code language: Arduino (arduino)
// at the Receiver
radio.openWritingPipe(addresses[0]); // 00002
radio.openReadingPipe(1, addresses[1]); // 00001Code language: Arduino (arduino)

En la sección de bucle, configuramos el primer Arduino como transmisor usando la función radio.stopListening(), leemos y asignamos el valor del joystick de 0 a 180 y enviamos los datos al receptor usando la función radio.write() .

radio.stopListening();
int potValue = analogRead(A0);
int angleValue = map(potValue, 0, 1023, 0, 180);
radio.write(&angleValue, sizeof(angleValue));Code language: Arduino (arduino)

Por otro lado, usando la función radio.startListening(), configuramos el segundo Arduino como receptor y comprobamos si hay datos disponibles. Cuando hay datos disponibles, los leemos, los almacenamos en la variable ánguloV y luego usamos ese valor para girar el servomotor.

radio.startListening();
  if ( radio.available()) {
    while (radio.available()) {
      int angleV = 0;
      radio.read(&angleV, sizeof(angleV));
      myServo.write(angleV);
    }Code language: Arduino (arduino)

A continuación, en el transmisor, configuramos el primer Arduino como receptor y usamos un bucle » while » vacío para esperar a que el segundo Arduino envíe datos, es decir, los datos del estado del botón, ya sea presionado o no. Cuando se presiona el botón, el LED se enciende. Entonces este proceso se repite constantemente y ambas placas Arduino envían y reciben datos constantemente.

Ejemplo 3: envío de múltiples variables en un solo paquete

Veamos otro código de ejemplo con los módulos NRF24L01. Salvo la forma de estructurar y enviar la fecha, todo sigue igual que en los ejemplos anteriores.

Código del transmisor

/*
  Arduino Wireless Communication Tutorial
      Example 1 - Transmitter Code

  by Dejan Nedelkovski, www.HowToMechatronics.com

  Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

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

RF24 radio(7, 8); // CE, CSN

const byte address[6] = "00001";

// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
  byte a = 0;
  byte b = 125;
  byte c = 255;
  int d = 1024;
  float e = 3.141592;
  String f = "Test";
};

Data_Package data; // Create a variable with the above structure

void setup() {
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

void loop() {
  // Send the whole data from the structure to the receiver
  radio.write(&data, sizeof(Data_Package));
  delay(500);
}Code language: Arduino (arduino)

Entonces podemos crear una estructura que en realidad sea una colección de diferentes tipos de variables.

// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
  byte a = 0;
  byte b = 125;
  byte c = 255;
  int d = 1024;
  float e = 3.141592;
  String f = "Test";
};

Data_Package data; // Create a variable with the above structureCode language: Arduino (arduino)

Recordemos que el tamaño máximo de los datos de esta estructura puede ser de 32 bytes. Aquí vemos que he insertado tres variables de tipo Byte, una variable Integer (4 bytes), una variable Float (4 bytes) y una cadena de cuatro caracteres (4 bytes). Eso es un total de 15 bytes.

Código de destinatario

/*
  Arduino Wireless Communication Tutorial
        Example 1 - Receiver Code

  by Dejan Nedelkovski, www.HowToMechatronics.com

  Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

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

RF24 radio(7, 8); // CE, CSN

const byte address[6] = "00001";

// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
  byte a = 0;
  byte b = 125;
  byte c = 255;
  int d = 1024;
  float e = 3.141592;
  String f = "Test";
};

Data_Package data; //Create a variable with the above structure

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}

void loop() {
  // Check whether there is data to be received
  if (radio.available()) {
    radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure
  }
  Serial.print("a: ");
  Serial.print(data.a);
  Serial.print(" b: ");
  Serial.print(data.b);
  Serial.print(" c: ");
  Serial.print(data.c);
  Serial.print(" d: ");
  Serial.print(data.d);
  Serial.print(" e: ");
  Serial.print(data.e);
  Serial.print(" f: ");
  Serial.println(data.f);
}Code language: Arduino (arduino)

En el lado receptor, necesitamos definir los mismos datos estructurales para poder recibir los datos entrantes. Para probar si la comunicación inalámbrica funciona correctamente, imprimí cada variable en el monitor serie.

nRF24L01 – Cómo funciona, interfaz Arduino, circuitos, códigos

Diploma

El módulo NRF24L01 es una excelente opción si necesita comunicación inalámbrica para su proyecto Arduino. Ya he usado este módulo en muchos de mis proyectos Arduino.

Aquí enumero todos mis proyectos en los que he utilizado estos módulos.

  • Control inalámbrico de un coche robot Arduino con módulos transceptores HC-05 Bluetooth, NRF24L01 y HC-12
  • Proyecto Arduino para una estación meteorológica inalámbrica.
  • Transmisor RC Arduino de bricolaje
  • Robot hexápodo hormiga Arduino
  • Aerodeslizador RC basado en Arduino DIY
  • Robot con ruedas Arduino Mecanum
  • Receptor DIY Arduino RC para modelos RC y proyectos Arduino
  • Avión RC Arduino | 100% bricolaje

Cada uno de estos proyectos/tutoriales contiene una explicación detallada de cómo utilizar el módulo NRF24L01, incluidos esquemas, implementación de código mejorada para una mejor comunicación, etc.

Mi proyecto favorito es este transmisor Arduino RC personalizado. En realidad, es un controlador RC de 14 canales que se puede utilizar para controlar prácticamente cualquier proyecto Arduino.

nRF24L01 – Cómo funciona, interfaz Arduino, circuitos, códigos
Ejemplo>

Eso es todo por este tutorial. Espero que lo hayas disfrutado y hayas aprendido algo nuevo. Como siempre, no dude en hacer sus preguntas en la sección de comentarios a continuación.

Categorías tutoriales de arduino
Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded

El nRF24L01 es un módulo transceptor popular para la comunicación inalámbrica cuando se utiliza con Arduino. En este tutorial, aprenderemos cómo establecer comunicación inalámbrica entre dos placas Arduino utilizando estos módulos. Exploraremos cómo funciona el módulo nRF24L01, la interfaz con Arduino, los circuitos necesarios y varios ejemplos de códigos.

### ¿Cómo funciona el nRF24L01?

El módulo nRF24L01 opera en el rango de frecuencia de 2.4 GHz y puede comunicarse a velocidades de hasta 2 Mbps. Tiene un rango de transmisión de hasta 100 metros en espacios abiertos. Con hasta 125 canales disponibles, es posible tener una red de hasta 125 modems trabajando de forma independiente en un solo lugar.

### Interfaz con Arduino

Para conectar el nRF24L01 a Arduino, es necesario tener en cuenta que cada placa Arduino tiene pines SPI diferentes. Además, se pueden utilizar pines digitales para CSN y CE, y un pin de interrupción si se requiere. Es importante destacar que los pines lógicos de 5V de Arduino son compatibles con el módulo, lo que facilita la conexión.

### Circuitos y códigos

En el tutorial, se proporcionan varios códigos de ejemplo para transmitir y recibir datos de forma inalámbrica entre dos placas Arduino. Desde el clásico «Hola Mundo» hasta una comunicación bidireccional utilizando un joystick y un servo motor. Además, se muestra cómo enviar múltiples variables en un solo paquete mediante una estructura de datos.

### Ejemplos de proyectos

Se mencionan varios proyectos en los que se ha utilizado el nRF24L01, como el control inalámbrico de robots y vehículos, estaciones meteorológicas inalámbricas y transmisores/receptores RC. Cada proyecto incluye esquemas, detalles de conexión, códigos mejorados y una explicación detallada de cómo implementar el módulo de forma efectiva.

En resumen, el nRF24L01 es una excelente opción para la comunicación inalámbrica en proyectos de Arduino. Su versatilidad y bajo consumo de energía lo hacen ideal para una variedad de aplicaciones. Si estás buscando añadir capacidades inalámbricas a tus proyectos de Arduino, el nRF24L01 es definitivamente una excelente opción. ¡Espero que este tutorial te haya resultado útil y te haya inspirado a explorar más posibilidades con este módulo!

1 comentario en «nRF24L01 – Cómo funciona, interfaz Arduino, circuitos, códigos»

Deja un comentario