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

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.

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

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.

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.

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
#include
#include

//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
#include
#include

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
#include
#include

//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.

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.

Última actualización el 2020-04-15 / Enlaces de afiliados / Imágenes de la API para Afiliados

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

0
    0
    Tu Carrito
    Tu carrito esta vacíoVolver a la tienda
    Enviar Whatsapp
    Hola 👋
    ¿En qué podemos ayudarte?