Tener dos o más Arduinos capaces de comunicarse entre sí de forma inalámbrica abre un mundo de posibilidades, como monitorear de forma remota los datos de los sensores, controlar robots, domótica, etc.

El módulo nRF24L01+ está disponible en nuestro sitio web, y es una de las opciones de comunicación de datos más asequibles disponibles.

Descripción general del hardware

Frecuencia de radio

El módulo nRF24L01+ está diseñado para funcionar en la banda de frecuencia ISM mundial de 2,4 GHz y utiliza  la modulación GFSK  para la transmisión de datos. La velocidad de transferencia de datos es configurable y se puede establecer en 250 kbps, 1 Mbps o 2 Mbps.

La banda de 2,4 GHz es una de las bandas industriales, científicas y médicas (ISM) reservadas internacionalmente para dispositivos de baja potencia sin licencia. Dispositivos como teléfonos inalámbricos, dispositivos Bluetooth, dispositivos Near Field Communication (NFC) y redes informáticas inalámbricas (WiFi) utilizan frecuencias ISM.

Poder de funcionamiento

El voltaje de funcionamiento del módulo oscila entre 1,9 y 3,9 V. Tenga en cuenta que alimentar el módulo con 5 V probablemente dañará su módulo nRF24L01+.

A pesar de que el módulo funciona de 1,9 V a 3,6 V, los pines lógicos son tolerantes a 5 voltios, por lo que no necesita un traductor de nivel lógico.

La potencia de salida del módulo se puede programar para que sea 0 dBm, -6 dBm, -12 dBm o -18 dBm. A 0 dBm, el módulo consume solo 12 mA durante la transmisión, que es menos que el consumo de un solo LED.

Y lo mejor es que consume solo 26 µA en modo de espera y 900 nA en modo apagado. Es por eso que es el dispositivo inalámbrico ideal para aplicaciones de bajo consumo.

Interfaz SPI

El nRF24L01+ se comunica a través de una SPI (interfaz periférica en serie) de 4 pines con una velocidad de datos máxima de 10 Mbps.

Todos los parámetros, incluidos el canal de frecuencia (125 canales seleccionables), la potencia de salida (0 dBm, -6 dBm, -12 dBm o -18 dBm) y la velocidad de datos (250 kbps, 1 Mbps o 2 Mbps), se pueden configurar a través de la interfaz SPI.

El bus SPI utiliza el concepto de maestro y esclavo. En la mayoría de nuestros proyectos, Arduino sirve como maestro y el módulo nRF24L01+ como esclavo.

A diferencia del bus I2C, el bus SPI tiene un número limitado de esclavos. Por lo tanto, puede usar hasta dos esclavos SPI (dos módulos nRF24L01+) en un solo Arduino.

Si quieres saber en detalle como funciona el bus SPI, te recomendamos leer el siguiente tutorial Protocolo SPI (Serial Peripheral Interface)

 

Especificaciones técnicas

Para obtener más información, consulta la hoja de datos a continuación nRF24L01+ Hoja de datos

Módulo nRF24L01+ -vs- Módulo PA/LNA nRF24L01+

El chip nRF24L01+ se usa en una variedad de módulos, los dos más comunes se enumeran a continuación.

El primero utiliza una antena integrada, lo que le permite ser más compacto. Sin embargo, una antena más pequeña significa un rango de transmisión más corto. Podrás comunicarte a una distancia de 100 metros usando este módulo. Por supuesto, eso está afuera a la intemperie. Su alcance se vuelve un poco más débil dentro de la casa, especialmente debido a las paredes.

Módulo inalámbrico nRF24L01+

El segundo tiene conector SMA y antena de pato, pero esa no es la única diferencia. Incluye un  chip extensor de rango RFX2401C  que combina PA, LNA y circuitos de conmutación de transmisión y recepción. Esto permite que el módulo logre un rango de transmisión significativamente mayor de hasta 1000 metros.

Módulo transceptor inalámbrico nRF24L01+ PA LNA con antena externa

Excepto por esta diferencia, ambos módulos son compatibles. Si creas tu proyecto con uno, puedes simplemente desconectarlo y usar el otro sin realizar ningún cambio en el sistema.

¿Qué son exactamente PA y LNA?

PA significa amplificador de potencia. Simplemente amplifica la señal que transmite el chip nRF24L01+. LNA significa amplificador de bajo ruido, y su función es amplificar una señal extremadamente débil recibida de la antena (generalmente por debajo de microvoltios o -100 dBm) a un nivel más útil (generalmente alrededor de 0,5 a 1 V).

Diagrama de bloques nRF24L01+ PA/LNA

El amplificador de bajo ruido (LNA) de la ruta de recepción y el amplificador de potencia (PA) de la ruta de transmisión se conectan a la antena a través de un dúplex, que aísla las dos señales y evita que la salida PA relativamente potente sobrecargue la entrada LNA sensible. Lee este  artículo en digikey.com  para obtener más información.

¿Cómo funciona el módulo nRF24L01+?

Frecuencia del canal RF

El módulo nRF24L01+ transmite y recibe datos en una frecuencia específica conocida como canal. Para que dos o más módulos se comuniquen entre sí, deben estar en el mismo canal. Este canal puede tener cualquier frecuencia en la banda ISM de 2.4 GHz, o más precisamente, cualquier frecuencia entre 2.400 y 2.525 GHz (2400 a 2525 MHz).

Cada canal ocupa menos de 1 MHz de ancho de banda. Esto nos da 125 canales posibles con un espaciado de 1 MHz.

Esto significa que el nRF24L01+ puede funcionar en 125 canales diferentes, lo que le permite crear una red de 125 módems que funcionan de forma independiente en una ubicación.

A velocidades de datos aéreos de 250 kbps y 1 Mbps, cada canal ocupa menos de 1 MHz de ancho de banda, por lo que hay una brecha de 1 MHz entre los dos canales. Sin embargo, para una tasa de datos de aire de 2 Mbps, se requieren 2 MHz de ancho de banda (mayor que la resolución de la configuración de frecuencia del canal de RF). Por lo tanto, en el modo de 2 Mbps, mantenga una brecha de 2 MHz entre los dos canales para garantizar que los canales no se superpongan y reducir la diafonía.

La frecuencia del canal RF de su canal seleccionado se calcula utilizando la siguiente fórmula:

Freq (Seleccionado) = 2400 + CH (Seleccionado)

Por ejemplo, si elige el canal 108 para la transmisión de datos, la frecuencia del canal RF será de 2508 MHz (2400 + 108).

Red multireceptor nRF24L01+

El nRF24L01+ incluye una característica conocida como Multiceiver. Significa transmisor múltiple receptor único.

En una red de múltiples receptores, cada canal de RF se divide lógicamente en seis canales de datos paralelos conocidos como conductos de datos. En otras palabras, la tubería de datos es uno de los seis canales lógicos dentro de un solo canal de RF físico. Cada canal de datos tiene su propia dirección única, conocida como dirección de canal de datos. Solo una tubería de datos puede recibir un paquete a la vez.

Una red multireceptor se muestra a continuación.

nRF24L01+ Red multireceptor: varios transmisores, un solo receptor

Para comprender una red multireceptor, imagine que el receptor principal actúa como un receptor concentrador, recopilando datos de seis nodos transmisores diferentes al mismo tiempo. El concentrador receptor puede pasar de escuchar a transmitir en cualquier momento.

Protocolo ShockBurst mejorado

El nRF24L01+ utiliza una estructura de paquetes conocida como Enhanced ShockBurst . Tiene cinco campos:

nRF24L01+ Estructura de paquetes ShockBurst mejorada.

La estructura shockburst original solo tenía preámbulo, dirección, carga útil y los campos de verificación de redundancia cíclica (CRC). Al introducir el campo de control de paquetes (PCF), Enhanced Shockburst agregó funcionalidad para comunicaciones más avanzadas.

Esta nueva estructura es excelente por varias razones.

Admite cargas útiles de longitud variable con un especificador de longitud de carga útil, lo que permite que las cargas útiles oscilen entre 1 y 32 bytes.

  • A cada paquete enviado se le asigna una ID de paquete, que permite al receptor determinar si el mensaje es nuevo o ha sido retransmitido.
  • Cada mensaje contiene un campo que solicita al receptor que envíe un acuse de recibo.

     

nRF24L01+ Manejo automático de paquetes

Repasemos tres escenarios para comprender mejor cómo interactúan entre sí los dos módulos nRF24L01+.

  • Transacción con acuse de recibo: 

Este es un ejemplo de un escenario positivo. En este caso, el transmisor inicia la comunicación enviando un paquete de datos al receptor. Después de transmitir el paquete, el transmisor espera aproximadamente 130 µs para que llegue el acuse de recibo (ACK). El receptor envía el ACK después de recibir con éxito el paquete. Una vez que el transmisor recibe el ACK, la transacción finaliza.

  • Transacción con un paquete de datos perdido:

Este es un escenario negativo en el que se requiere retransmisión debido a la pérdida de paquetes. El transmisor espera el ACK después de transmitir el paquete.

Si el transmisor no lo recibe dentro del tiempo de retardo de retransmisión automática (ARD), el paquete se retransmite. Cuando el receptor recibe el paquete retransmitido, envía el ACK, que finaliza la transacción.

 

    • Transacción con acuse de recibo perdido:

Este es otro escenario negativo en el que se requiere retransmisión por pérdida del ACK. Debido a que el transmisor no recibió el ACK, cree que el paquete se perdió (aunque el receptor recibió el paquete en el primer intento).

Como resultado, el transmisor retransmite el paquete después del tiempo de espera de retardo  Auto-Retransmisión. Cuando el receptor recibe un paquete con el mismo ID que el anterior, lo descarta y vuelve a enviar el ACK. Una vez que el transmisor recibe el ACK, la transacción finaliza.

El chip nRF24L01+ maneja todo el proceso de manejo de paquetes sin la participación del microcontrolador.

Asignación de pines del módulo nRF24L01+

Echemos un vistazo a los pines de ambos módulos nRF24L01+.

GND : es el pin de tierra. Tiene una marca cuadrada para distinguirlo de los otros pines.

VCC : suministra energía al módulo. Puede variar de 1,9 a 3,9 voltios. Puedes conectarlo a la salida de 3.3V de tu Arduino. Tenga en cuenta que conectar esto al pin de 5 V probablemente dañará su módulo nRF24L01+.

CE (habilitación de chip) : es un pin activo alto. Cuando está habilitado, el nRF24L01 transmitirá o recibirá, según el modo.

CSN (no seleccionar chip) : es un pin activo bajo que normalmente se mantiene ALTO. Cuando este pin baja, el nRF24L01 comienza a escuchar datos en su puerto SPI y los procesa en consecuencia.

SCK (reloj serie) : acepta pulsos de reloj del bus maestro SPI.

MOSI (Salida maestra Entrada esclava) : es la entrada SPI para el nRF24L01.

MISO (Master In Slave Out) : es la salida SPI del nRF24L01.

IRQ : es un pin de interrupción que puede notificar al maestro cuando hay nuevos datos para procesar.

Cableado de un módulo nRF24L01+ a un Arduino

Ahora que sabemos todo sobre cómo funciona el módulo nRF24L01+, podemos comenzar a conectarlo a nuestro Arduino.

Para comenzar, conecte el pin VCC del módulo al 3.3V de Arduino y el pin GND a tierra. Los pines CSN y CE se pueden conectar a cualquier pin digital en un Arduino; en nuestro caso, están conectados a los pines digitales #8 y #9.

Conectemos los pines SPI. Tenga en cuenta que cada placa Arduino tiene un conjunto único de pines SPI que deben conectarse en consecuencia. Para placas Arduino como UNO/Nano V3.0, estos pines son digitales 13 (SCK), 12 (MISO), 11 (MOSI) y 10 (SS).

Si está utilizando una placa Arduino diferente, consulte la documentación oficial para conocer  las ubicaciones de los pines SPI  antes de continuar.

Cableado del módulo transceptor inalámbrico nRF24L01+ a Arduino UNO

Cableado del módulo inalámbrico nRF24L01+ PA LNA a Arduino UNO

Recuerda, necesitas hacer dos de esos circuitos. Uno actuará como transmisor y el otro como receptor. Ambos tienen el mismo cableado.

Una vez que haya conectado todo, ¡ya está listo para comenzar!

Instalación de la librería

Hay muchas librerías disponibles para el módulo nRF24L01+, pero una de las más populares es  RF24 . Esta librería existe desde hace mucho tiempo. Es fácil de usar para principiantes y ofrece mucho para usuarios avanzados. Usaremos esta librería en nuestros ejemplos.

Para instalar la librería, vaya a  Sketch > Incluir biblioteca > Administrar bibliotecas…  Espere a que el Administrador de librería descargue el índice de la librería y actualice la lista de librería instaladas.

Filtra tu búsqueda ingresando ‘ rf24 ‘. Busque la librería por TmRh20. Haz clic en esa entrada y luego elije Instalar.

Código de ejemplo de Arduino: para transmisor

Los siguientes ejemplos demuestran cómo configurar un enlace unidireccional simple entre un transmisor y un receptor. El transmisor simplemente envía un mensaje tradicional de “Hola mundo” al receptor, que lo muestra en la ventana del monitor en serie.

Este es el código que usaremos para nuestro transmisor.

//Incluir librerias
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//crear un objeto RF24
RF24 radio(9, 8);  // CE, CSN

//Dirección por la cual los módulos se comunican
const byte address[6] = "00001";

void setup()
{
  radio.begin();
  
  //Ajusta la dirección 
  radio.openWritingPipe(address);
  
  //ajusta el módulo como transmisor
  radio.stopListening();
}
void loop()
{
  //enviar mensaje al receptor
  const char text[] = "Hello World";
  radio.write(&text, sizeof(text));
  
  delay(1000);
}

Explicación del código

El ejemplo comienza incluyendo las librerías necesarias. La librería SPI.h maneja la comunicación SPI, mientras que las librería nRF24L01.h y RF24.h controlan el módulo.

//Incluye las librerías
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

A continuación, creamos un objeto RF24. El constructor de este objeto acepta dos números de pin como argumentos, a los que se conectan las señales CE y CSN.

//crear un objeto RF24
RF24 radio(9, 8);  // CE, CSN
A continuación, creamos una matriz de bytes para almacenar la dirección de tubería utilizada por los dos módulos nRF24L01+ para comunicarse.
//dirección por la cual los módulos se comunican
const byte address[6] = "00001";

La dirección de canalización no tiene que ser “00001”, pero puede ser cualquier cadena de 5 caracteres como “nodo1”. Simplemente asegúrese de que tanto el transmisor como el receptor utilicen la misma dirección.

Con una dirección de tubería, puede elegir un módulo específico en su red y comunicarse con él. Esto es útil si su red contiene múltiples módulos.

En la sección de configuración, usamos la begin()función para inicializar el objeto de radio, seguida de la función openWritingPipe() para configurar la dirección del transmisor.

radio.begin();

//ajusta la dirección
radio.openWritingPipe(address);

Finalmente, usamos la función stopListening() para configurar el módulo como un transmisor.

//ajusta el módulo como transmisor

radio.stopListening();

En la sección de loop, primero creamos una matriz de caracteres y almacenamos el mensaje “Hola mundo” en ella.

Usamos la función write() para enviar el mensaje al receptor. Esta función toma dos argumentos: el mensaje a enviar y el número de bytes que contiene.

const char text[] = "Hello World";
radio.write(&text, sizeof(text));

Es importante tener en cuenta que puede enviar mensajes de hasta 32 bytes de longitud, ya que este es el tamaño máximo de paquete que puede manejar el nRF24L01+.

La función write() devuelve un valor bool, que puede usar para verificar si el receptor recibió correctamente los datos. Cuando los datos llegan al receptor, devuelve VERDADERO; de lo contrario, devuelve FALSO.

Además, es importante tener en cuenta que la función write() detiene el programa hasta que recibe un reconocimiento o agota todos los intentos de retransmisión.

Código de ejemplo de Arduino: para receptor

Este es el código que usaremos para nuestro receptor.

//Incluir librerías
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//crear un objeto RF24
RF24 radio(9, 8);  // CE, CSN

//Dirección por las cuales se comunicarán los módulos
const byte address[6] = "00001";

void setup()
{
  while (!Serial);
    Serial.begin(9600);
  
  radio.begin();
  
  //ajusta la dirección
  radio.openReadingPipe(0, address);
  
  //ajusta el módulo como receptor
  radio.startListening();
}

void loop()
{
  //lee los datos si están disponibles en el bufer
  if (radio.available())
  {
    char text[32] = {0};
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }
}

Explicación del código

Excepto por algunos cambios, este código es muy similar al código del transmisor.

Al comienzo de la función de configuración, iniciamos la comunicación en serie. Luego, usando la función openReadingPipe(), configuramos la misma dirección de tubería que el transmisor. Esto permite que el transmisor y el receptor se comuniquen entre sí.

El primer argumento de la función openReadingPipe() especifica qué tubería abrir para lectura. Debido a que se pueden abrir hasta seis tubos para leer al mismo tiempo, el rango posible es 0-5. En nuestro caso, la tubería 0 se abrió para lectura. El segundo argumento es la dirección de 40 bits de la tubería a abrir.

//ajusta la dirección 
  radio.openReadingPipe(0, address);

A continuación, configuramos el módulo como receptor y comenzamos a recibir datos. Usamos la función startListening() para lograr esto.

//ajusta el módulo como receptor
  radio.startListening();

El método available() se utiliza en la sección de loop para comprobar si hay datos disponibles para leer. Este método devuelve VERDADERO si los datos están disponibles, FALSO de lo contrario.

if (radio.available())
  {
    char text[32] = {0};
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }

Cuando los datos están disponibles, se crea una matriz de 32 caracteres llenos de ceros para almacenarlos. Luego, los datos se leen del búfer y se almacenan en nuestra matriz de caracteres utilizando el método read(&text, sizeof(text)).

Finalmente, el mensaje recibido se imprime en el monitor serie. Si todo está bien, su monitor serial debería verse así.

Salida de transceptor nRF24L01+ en monitor serie

Formas de mejorar el alcance del módulo nRF24L01+

Un parámetro clave para un sistema de comunicación inalámbrica es el rango de comunicación. Este suele ser el factor decisivo al seleccionar una solución de RF. Así que hablemos de lo que podemos hacer para mejorar el alcance de nuestro módulo.

Reducir el ruido de la fuente de alimentación

Un circuito que genera una señal de radiofrecuencia (RF) es extremadamente sensible al ruido de la fuente de alimentación. El ruido de la fuente de alimentación, si no se controla, puede reducir significativamente el rango que puede alcanzar.

A menos que la fuente de energía sea una batería independiente, es muy probable que la salida de energía sea ruidosa. Para evitar que este ruido entre en el sistema, se recomienda colocar un condensador de filtro de 10 µf en la línea de alimentación lo más cerca posible del módulo nRF24L01+.

La forma más sencilla de reducir el ruido de la fuente de alimentación es usar un adaptador de bajo costo para el módulo nRF24L01+.

Adaptador nRF24L01+

Este adaptador tiene un conector hembra de 8 pines donde puedes enchufar tu módulo nRF24L01+. Puede alojar ambas versiones del módulo nRF24L01+, una con antena integrada y otra con antena externa (PA/LNA).

También tiene un conector de 2 pines para entrada de alimentación y un conector macho de 6 pines para conexiones SPI e interrupción.

Dado que el adaptador tiene un regulador de voltaje de 3,3 V incorporado y condensadores de filtro, puede alimentarlo de manera segura con una fuente de alimentación de 5 V.

Cambiar la frecuencia del canal

El entorno externo también puede ser una fuente de ruido para los circuitos de RF, especialmente si las redes vecinas están configuradas en el mismo canal.

Debido a que Wi-Fi usa principalmente canales de baja frecuencia, se recomienda que use los 25 canales más altos de su nRF24L01+ para evitar la interferencia de estas señales.

Use una tasa de datos más baja

A 250 Kbps, el nRF24L01+ tiene la sensibilidad de receptor más alta de -94 dBm. Sin embargo, a una velocidad de datos de 2 MBps, la sensibilidad del receptor cae a -82 dBm. Es decir, a 250 kbps, el receptor es aproximadamente diez veces más sensible que a 2 Mbps, lo que le permite decodificar señales diez veces más débiles.

Como resultado, reducir la velocidad de datos puede mejorar significativamente el rango que puede lograr. Además, una velocidad de 250 kbps es suficiente para la mayoría de nuestros proyectos.

¿Qué significa la sensibilidad del receptor (Rx)?

La sensibilidad del receptor es el nivel de potencia mínimo al que el receptor puede detectar una señal de RF. Cuanto mayor sea el valor absoluto de un número negativo, mayor será la sensibilidad del receptor. Una sensibilidad de receptor de −94dBm, por ejemplo, supera a una sensibilidad de receptor de −82dBm por 12dB.

Uso de mayor potencia de salida

Establecer la potencia de salida máxima también puede ayudar a ampliar el rango de comunicación. El nRF24L01+ admite una variedad de niveles de potencia de salida, incluidos 0dBm, -6dBm, -12dBm y -18dBm. Elegir una potencia de salida de 0dBm envía señales más fuertes al aire, pero consume más energía.