Cómo funciona el módulo inalámbrico nRF24L01 y su interfaz con Arduino

Tutorial del módulo de RF nRF24L01

El hecho de que dos o más placas Arduino sean capaces de comunicarse entre sí de forma inalámbrica a distancia abre muchas posibilidades como la monitorización remota de los datos de los sensores, el control de los robots, la automatización del hogar y la lista continúa. Y cuando se trata de tener soluciones de radiofrecuencia bidireccionales baratas pero fiables, nadie hace mejor trabajo que el módulo transceptor nRF24L01.

El módulo transceptor nRF24L01 a menudo se puede obtener en línea por menos de dos euros, lo que lo convierte en una de las opciones de comunicación de datos más baratas que se pueden conseguir. Y lo mejor de todo es que estos módulos son súper pequeños, permitiéndote incorporar una interfaz inalámbrica en casi cualquier proyecto.

Descripción del nRF24L01

Radiofrecuencia

El módulo transceptor nRF24L01 está diseñado para operar 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 puede ser de 250kbps, 1Mbps y 2Mbps.

¿Qué es la banda ISM de 2,4 GHz?

La banda de 2,4 GHz es una de las bandas industriales, científicas y médicas (ISM) reservadas internacionalmente para el uso de dispositivos de baja potencia sin licencia. Algunos ejemplos son los teléfonos inalámbricos, los dispositivos Bluetooth, los dispositivos de comunicación de campo cercano (NFC) y las redes informáticas inalámbricas (WiFi), todos los cuales utilizan las frecuencias ISM.

Consumo de energía

El voltaje de funcionamiento del módulo es de 1,9 a 3,6V, pero la buena noticia es que los pines lógicos son tolerantes a 5 voltios, por lo que podemos conectarlo fácilmente a un microcontrolador lógico Arduino o a cualquier otro de 5V sin usar ningún convertidor de nivel lógico.

El módulo soporta una potencia de salida programable de 0 dBm, -6 dBm, -12 dBm o -18 dBm y consume increíblemente alrededor de 12 mA durante la transmisión a 0 dBm, que es incluso más bajo que un solo LED. Y lo mejor de todo es que consume 26 µA en el modo de espera y 900 nA en el modo de apagado. Por eso es el dispositivo inalámbrico para aplicaciones de baja potencia.
Interfaz SPI

El módulo transceptor nRF24L01 se comunica a través de una Interfaz Periférica Serial (SPI) de 4 pines con una velocidad máxima de datos de 10Mbps. Todos los parámetros como 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 (250kbps, 1Mbps o 2Mbps) pueden configurarse a través de la interfaz SPI.

El bus SPI utiliza un concepto de Maestro y Esclavo, en la mayoría de las aplicaciones comunes nuestro Arduino es el Maestro y el módulo transceptor nRF24L01 es el Esclavo. A diferencia del bus I2C, el número de esclavos en el bus SPI es limitado, en el Arduino Uno se puede utilizar un máximo de dos esclavos SPI, es decir, dos módulos transceptores nRF24L01.

Características:

  • Rango de frecuencia 2.4 GHz Banda ISM
  • Tasa máxima de datos aéreos 2 Mb/s
  • Formato de modulación GFSK
  • Max. Potencia de salida 0 dBm
  • Tensión de alimentación de funcionamiento 1,9 V a 3,6 V
  • Max. Corriente de operación 13.5mA
  • Min. Corriente (Modo de espera) 26µA
  • Entradas lógicas 5V Tolerante
  • Alcance de la comunicación 800+ m (línea de visión)

nRF24L01 módulo Vs nRF24L01 módulo PA/LNA

Hay una variedad de módulos disponibles basados en el chip nRF24L01. A continuación se muestran las versiones más populares.

nRF24L01 Wireless Module - Cómo funciona el módulo inalámbrico nRF24L01 y su interfaz con Arduino

La primera versión utiliza una antena de a bordo. Esto permite una versión más compacta de la fuga. Sin embargo, la antena más pequeña también significa un menor rango de transmisión. Con esta versión, podrá comunicarse a una distancia de 100 metros. Por supuesto que es al aire libre en un espacio abierto. Su alcance en el interior, especialmente a través de las paredes, se verá ligeramente debilitado.

nRF24L01 PA LNA Wireless Transceiver Module with External Antenna - Cómo funciona el módulo inalámbrico nRF24L01 y su interfaz con Arduino

La segunda versión viene con un conector SMA y una antena de pato, pero esa no es la verdadera diferencia. La verdadera diferencia es que viene con un chip especial RFX2401C que integra los circuitos de conmutación de PA, LNA y transmisión-recepción. Este chip extensor de alcance junto con una antena de pato ayuda al módulo a lograr un rango de transmisión significativamente mayor, de unos 1000m.

¿Qué es PA LNA?

PA son las siglas de Power Amplifier (Amplificador de potencia). Simplemente aumenta la potencia de la señal que se transmite desde el chip nRF24L01. Mientras que LNA significa Amplificador de Bajo Ruido. La función del LNA es tomar unaseñal extremadamente débil e incierta de la antena (normalmente del orden de los microvoltios o por debajo de -100 dBm) y la amplifica a un nivel más útil (normalmente alrededor de 0,5 a 1V)

El amplificador de bajo ruido (LNA) de la trayectoria de recepción y el amplificador de potencia (PA) de la trayectoria de transmisión se conectan a la antena a través de un duplexor, que separa las dos señales e impide que la salida de PA relativamente potente sobrecargue la entrada del LNA sensible. Para obtener más información, consulte este artículo en digikey.com

Excepto por esta diferencia, ambos módulos son compatibles con el sistema de entrega. Lo que significa que si construyes tu proyecto con uno puedes simplemente desconectarlo y usar otro sin necesidad de hacer ningún cambio en el sistema.

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

Frecuencia del canal de RF

El módulo transceptor nRF24L01 transmite y recibe datos en una cierta frecuencia llamada Canal. También para que dos o más módulos transceptores se comuniquen entre sí, necesitan estar en el mismo canal. Este canal puede ser cualquier frecuencia en la banda ISM de 2,4 GHz o, para ser más precisos, puede estar entre 2.400 y 2.525 GHz (2400 y 2525 MHz).

Cada canal ocupa un ancho de banda de menos de 1MHz. Esto nos da 125 posibles canales con un espaciamiento de 1MHz. Por lo tanto, el módulo puede utilizar 125 canales diferentes que dan la posibilidad de tener una red de 125 módems que funcionan independientemente en un solo lugar.

El canal ocupa un ancho de banda de menos de 1MHz a una velocidad de datos en el aire de 250kbps y 1Mbps. Sin embargo, a una velocidad de datos en el aire de 2Mbps, el ancho de banda de 2MHz está ocupado (más amplio que la resolución del ajuste de frecuencia del canal de RF). Por lo tanto, para asegurar que los canales no se superpongan y reducir la diafonía en el modo de 2Mbps, es necesario mantener un espacio de 2MHz entre dos canales.

La frecuencia del canal RF de su canal seleccionado se establece de acuerdo con la siguiente fórmula:

Freq(Seleccionado) = 2400 + CH(Seleccionado)

Por ejemplo, si seleccionas 108 como tu canal para la transmisión de datos, la frecuencia del canal de RF de su canal sería 2508MHz (2400 + 108)

nRF24L01 Red Multiconductora

El nRF24L01 proporciona una característica llamada Multiceiver. Es una abreviatura de múltiples transmisores y un solo receptor. En el que cada canal de RF se divide lógicamente en 6 canales de datos paralelos llamados Tubos de Datos. En otras palabras, un tubo de datos es un canal lógico en el canal físico de RF. Cada tubo de datos tiene su propia dirección física (Data Pipe Address) y puede ser configurado.

Para simplificar la explicación anterior, imagínate el receptor primario actuando como un receptor central que recoge información de 6 nodos transmisores diferentes simultáneamente. El receptor central puede dejar de escuchar en cualquier momento y actúa como un transmisor. Pero esto sólo puede hacerse de un tubo/nodo a la vez.

Protocolo mejorado de ShockBurst

El módulo transceptor nRF24L01 utiliza una estructura de paquetes conocida como Enhanced ShockBurst. Esta simple estructura de paquetes se divide en 5 campos diferentes, que se ilustran a continuación.

La estructura original de ShockBurst consistía sólo en los campos de Preámbulo, Dirección, Carga útil y el Chequeo de Redundancia Cíclica (CRC). ShockBurst mejorado trajo consigo una mayor funcionalidad para mejorar las comunicaciones utilizando un campo de control de paquetes (PCF) recientemente introducido.

Esta nueva estructura es genial por varias razones. En primer lugar, permite cargas útiles de longitud variable con un especificador de longitud de carga útil, lo que significa que las cargas útiles pueden variar de 1 a 32 bytes.

En segundo lugar, proporciona a cada paquete enviado una identificación de paquete, que permite al dispositivo receptor determinar si un mensaje es nuevo o si ha sido retransmitido (y por lo tanto puede ser ignorado).

Por último, y lo que es más importante, cada mensaje puede pedir que se envíe un acuse de recibo cuando lo reciba otro dispositivo.

nRF24L01 Manejo automático de paquetes

Ahora, discutamos tres escenarios para entender mejor cómo dos módulos de nRF24L01 se mueven entre sí.

  • Transacción con reconocimiento e interrupción. Este es un ejemplo de escenario positivo. Aquí el transmisor inicia una comunicación enviando un paquete de datos al receptor. Una vez transmitido el paquete completo, espera (alrededor de 130 µs) al paquete de reconocimiento (paquete ACK) para recibirlo. Cuando el receptor recibe el paquete, envía el paquete ACK al transmisor. Al recibir el paquete ACK, el transmisor afirma la señal de interrupción (IRQ) para indicar que los nuevos datos están disponibles.
  • Transacción con pérdida de paquete de datos. Este es un escenario negativo en el que se necesita una retransmisión debido a la pérdida del paquete transmitido. Después de que el paquete es transmitido, el transmisor espera que el paquete ACK sea recibido. Si el transmisor no lo recibe dentro del tiempo de retraso de retransmisión automática (ARD), el paquete se retransmite. Cuando el paquete retransmitido es recibido por el receptor, se transmite el paquete ACK que a su vez genera una interrupción en el transmisor.
  • Transacción con reconocimiento perdido. Este es de nuevo un escenario negativo en el que se necesita una retransmisión debido a la pérdida del paquete ACK. Aquí, incluso si el receptor recibe el paquete en el primer intento, debido a la pérdida del paquete ACK, el transmisor piensa que el receptor no ha recibido el paquete en absoluto. Por lo tanto, después de que el tiempo de retardo de autotransmisión haya terminado, retransmite el paquete. Ahora, cuando el receptor recibe el paquete que contiene el mismo ID de paquete que el anterior, lo descarta y vuelve a enviar el paquete ACK.

Todo este manejo de paquetes es hecho automáticamente por el chip nRF24L01 sin la participación del microcontrolador.

Pinout de nRF24L01 Módulo Transceptor

Echemos un vistazo al datasheet de las dos versiones del módulo transceptor nRF24L01

Pinout nrf24l01 modulo - Cómo funciona el módulo inalámbrico nRF24L01 y su interfaz con Arduino

  • GND es la clavija de tierra. Normalmente se marca encajando la clavija en un cuadrado para que pueda usarse como referencia para identificar las otras clavijas.
  • El VCC suministra la energía para el módulo. Puede ser de 1,9 a 3,9 voltios. Puedes conectarlo a la salida de 3.3V de tu Arduino. Recuerda que si lo conectas a un pin de 5V probablemente destruirá tu módulo nRF24L01.
  • El CE (Chip Enable) es un pin activo-Alto. Cuando se selecciona, el nRF24L01 transmitirá o recibirá, dependiendo del modo en el que se encuentre.
  • CSN (Chip Select Not) es una clavija activa-BAJA y normalmente se mantiene ALTA. Cuando esta clavija se mantiene baja, el nRF24L01 comienza a escuchar en su puerto SPI los datos y los procesa en consecuencia.
  • SCK (Serial Clock) acepta los pulsos de reloj proporcionados por el maestro del bus SPI.
  • MOSI (Master Out Slave In) es la entrada SPI del nRF24L01.
  • MISO (Master In Slave Out) es la salida SPI del nRF24L01.
  • IRQ es un pin de interrupción que puede alertar al maestro cuando hay nuevos datos disponibles para procesar.

Cómo conectar el módulo transceptor nRF24L01 a Arduino UNO

Ahora que sabemos cómo funciona el módulo transceptor nRF24L01, podemos empezar a conectarlo a nuestro Arduino.

Para empezar, conecta la clavija VCC del módulo a 3.3V en el Arduino y la clavija GND a tierra. Los pines CSN y CE pueden ser conectados a cualquier pin digital del Arduino. En nuestro caso, está conectado al pin digital #8 y #9 respectivamente. Ahora nos quedamos con los pines que se utilizan para la comunicación SPI.

Como el módulo transceptor nRF24L01 requiere mucha transferencia de datos, darán el mejor rendimiento cuando se conecten a los pines SPI de hardware en un microcontrolador. Los pines SPI de hardware son mucho más rápidos que “bit-banging” el código de la interfaz usando otro conjunto de pines.

Tenen cuenta que cada placa Arduino tiene diferentes pines SPI que deben ser conectados en consecuencia. Para las placas Arduino como la UNO/Nano V3.0 esos pines son los digitales 13 (SCK), 12 (MISO) y 11 (MOSI).

Si tienes un Mega, los pines son diferentes. Deberás usar los digitales 50 (MISO), 51 (MOSI), 52 (SCK) y 53 (SS). Consulta la siguiente tabla para una rápida comprensión.

MOSI MISO SCK
Arduino Uno 11 12 13
Arduino Nano 11 12 13
Arduino Mega 51 50 52

En caso de que utilices un tablero Arduino diferente al mencionado anteriormente, es aconsejable comprobar la documentación oficial de Arduino antes de proceder.

como conectar arduino uno a modulo nRF24L01 - Cómo funciona el módulo inalámbrico nRF24L01 y su interfaz con ArduinoUna vez que tengas todo conectado, estás listo para empezar.

Librería de Arduino RF24 para el módulo nRF24L01.

Interactuar con el módulo transceptor nRF24L01 es un montón de trabajo, pero por suerte para nosotros, hay varias bibliotecas disponibles. Una de las librerías más populares es la RF24. Esta librería existe desde hace varios años. Es simple de usar para los principiantes, pero aún así ofrece mucho para los usuarios avanzados. En nuestros ejemplos, usaremos la misma biblioteca. Puedes descargar la última versión de la librería en el repositorio RF24 en GitHub.

Para instalarla, abre el IDE de Arduino, vae a Sketch > Include Library > Add .ZIP Library, y luego selecciona el archivo RF24 que acabas de descargar. Si necesita más detalles sobre la instalación de una librería, visita este tutorial de Instalación de una librería de Arduino.

Código de Arduino Para el transmisor

En nuestro ejemplo sólo enviaremos un mensaje tradicional de “Hola Mundo” del transmisor al receptor.

Aquí está el esquema que usaremos para nuestro transmisor:

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//create an RF24 object
RF24 radio(9, 8); // CE, CSN

//address through which two modules communicate.
const byte address[6] = "00001";

void setup()
{
radio.begin();

//set the address
radio.openWritingPipe(address);

//Set module as transmitter
radio.stopListening();
}
void loop()
{
//Send message to receiver
const char text[] = "Hello World";
radio.write(&text, sizeof(text));

delay(1000);
}

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

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

A continuación, necesitamos crear un objeto RF24. El objeto toma dos números de pin como parámetros a los que se conectan las señales CE y CSN.

//create an RF24 object
RF24 radio(9, 8); // CE, CSN

A continuación tenemos que crear una matriz, array de bytes que representará la dirección de la tubería a través de la cual se comunican dos módulos nRF24L01.

//address through which two modules communicate.
const byte address[6] = "00001";

Podemos cambiar el valor de esta dirección a cualquier cadena de 5 letras como “node1”. La dirección es necesaria si se tienen algunos módulos en una red. Gracias a la dirección, puede elegir un módulo en particular al que esté interesado en comunicarse, así que en nuestro caso tendremos la misma dirección tanto para el emisor como para el receptor.

A continuación, en la función de configuración: tenemos que inicializar el objeto de radio usando radio.begin() y usando la función radio.openWritingPipe() establecemos la dirección del transmisor.

//set the address
radio.openWritingPipe(address);

Finalmente, usaremos la función radio.stopListening() que establece el módulo como transmisor.

//Set module as transmitter
radio.stopListening();

En la sección de bucle: creamos un conjunto de personajes a los que asignamos el mensaje “Hola Mundo”. Usando la función radio.write() enviaremos ese mensaje al receptor. El primer argumento aquí es el mensaje que queremos enviar. El segundo argumento es el número de bytes presentes en ese mensaje.

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

A través de este método, puede enviar hasta 32 bytes a la vez. Porque ese es el tamaño máximo que puede manejar un solo paquete nRF24L01. Si necesitas una confirmación de que el receptor recibió datos, el método radio.write() devuelve un valor bool. Si devuelve TRUE, los datos llegaron al receptor. Si devuelve FALSE, los datos se han perdido.

La función radio.write() bloquea el programa hasta que recibe el acuse de recibo o se agotan todos los intentos de retransmisión.

Código de Arduino para el receptor

Aquí está el código que usaremos para nuestro receptor

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//create an RF24 object
RF24 radio(9, 8); // CE, CSN

//address through which two modules communicate.
const byte address[6] = "00001";

void setup()
{
while (!Serial);
Serial.begin(9600);

radio.begin();

//set the address
radio.openReadingPipe(0, address);

//Set module as receiver
radio.startListening();
}

void loop()
{
//Read the data if available in buffer
if (radio.available())
{
char text[32] = {0};
radio.read(&text, sizeof(text));
Serial.println(text);
}
}

Este programa es bastante similar al del transmisor, excepto por algunos cambios.

Al principio de la función de configuración, iniciamos la comunicación en serie. A continuación, utilizando la función radio.setReadingPipe() establecemos la misma dirección que el transmisor y de esa manera habilitamos la comunicación entre el transmisor y el receptor.

//set the address
radio.openReadingPipe(0, address);

El primer argumento es el número de la corriente. Puedes crear hasta 6 corrientes que respondan a diferentes direcciones. Hemos creado sólo la dirección para el número de la corriente 0. El segundo argumento es la dirección a la que la corriente reaccionará para recoger los datos.

El siguiente paso es establecer el módulo como receptor y empezar a recibir datos. Para ello utilizamos la función radio.startListening(). A partir de ese momento el módem espera a que los datos sean enviados a la dirección especificada.

//Set module as receiver
radio.startListening();

En la función de bucle, loop, el código comprueba si algún dato ha llegado a la dirección usando el método radio.available(). Este método devuelve el valor TRUE si tenemos algún dato disponible en el buffer.

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

Si se reciben los datos, entonces se crea una matriz de 32 caracteres llena de ceros (más tarde el programa la llenará con los datos recibidos). Para leer los datos utilizamos el método radio.read (& text, sizeof (texto)). Esto almacenará los datos recibidos en nuestra matriz de caracteres.

Al final sólo imprimimos el mensaje recibido en el monitor de serie. Si hiciste todo bien y no hay errores en las conexiones, deberías ver algo como esto en tu monitor en serie.

puerto serie con hello world - Cómo funciona el módulo inalámbrico nRF24L01 y su interfaz con Arduino

Mejorando el rango del módulo transceptor nRF24L01.

Un parámetro clave para un sistema de comunicación inalámbrica es el rango de comunicación. En muchos casos es el factor decisivo para elegir una solución de RF. Entonces, discutamos lo que podemos hacer para obtener un mejor rango para nuestro módulo.

Reducir el ruido de la fuente de alimentación

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

A menos que la fuente de alimentación sea una batería autónoma, hay una buena posibilidad de que haya ruido asociado con la generación de la energía. Para evitar que este ruido entre en el sistema, se aconseja colocar un condensador de filtro de 10 µf a través de la línea de la fuente de alimentación, tan cerca físicamente como sea posible del módulo nRF24L01.

Una forma más fácil de superar esto es usar un módulo adaptador muy económico para el nRF24L01.

adaptador módulo nRF24L01 - Cómo funciona el módulo inalámbrico nRF24L01 y su interfaz con Arduino

El módulo adaptador tiene un conector hembra de 8 pines para permitirle conectar su módulo nRF24L01. Puede acomodar tanto el módulo que discutimos anteriormente, el que tiene una antena integrada y otro con antena externa (PA/LNA). También tiene un conector macho de 6 pines para las conexiones SPI e Interrupción y un conector de 2 pines para la entrada de energía.

El módulo adaptador tiene su propio regulador de voltaje de 3,3 voltios y un juego de condensadores de filtro, por lo que puede alimentarse con una fuente de alimentación de 5 voltios.

Cambia la frecuencia de tu canal

Otra fuente potencial de ruido para un circuito de radiofrecuencia es el ambiente exterior, especialmente si tiene redes vecinas establecidas en el mismo canal o interferencias de otros aparatos electrónicos.

Para evitar que estas señales causen problemas, sugerimos usar los 25 canales más altos de su módulo nRF24L01. La razón es que el WiFi utiliza la mayoría de los canales inferiores.

Velocidad de datos más baja

El nRF24L01 ofrece la mayor sensibilidad del receptor a una velocidad de 250Kbps que es de -94dBm. Sin embargo, a una velocidad de datos de 2MBps, la sensibilidad del receptor cae a -82dBm. Si hablas este idioma, sabes que el receptor a 250Kbps es casi 10 veces más sensible que a 2Mbps. Eso significa que el receptor puede decodificar una señal que es 10 veces más débil.

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

La sensibilidad del receptor es el nivel de potencia más bajo al que el receptor puede detectar una señal de RF. Cuanto mayor sea el valor absoluto del número negativo, mejor será la sensibilidad del receptor. Por ejemplo, una sensibilidad de receptor de -94 dBm es mejor que una sensibilidad de receptor de -82 dBm por 12 dB.

Por lo tanto, si se reduce la velocidad de transmisión de datos, se puede mejorar significativamente el alcance que se puede lograr. Además, para la mayoría de nuestros proyectos, una velocidad de 250Kbps es más que suficiente.

Mayor potencia de salida

Ajustar la potencia de salida máxima también puede mejorar el rango de comunicación. El nRF24L01 te permite elegir una de las potencias de salida, a saber, 0 dBm, -6 dBm, -12 dBm o -18 dBm. Al seleccionar la potencia de salida de 0 dBm se envía una señal más fuerte por el aire.

Pin It on Pinterest

Shares