Hacer que dos o más placas Arduino puedan comunicarse entre sí de forma inalámbrica a distancia abre un montón de posibilidades, como la monitorización remota de los datos de los sensores, el control de robots, la automatización del hogar y la lista continúa. Y cuando se trata de tener soluciones de RF de 2 vías baratas pero fiables, nadie hace un mejor trabajo que el módulo transceptor nRF24L01+ de Nordic Semiconductor.
El módulo transceptor nRF24L01+ (plus) a menudo se puede obtener en línea por menos de dos dólares, lo que lo convierte en una de las opciones de comunicación de datos más baratas que se pueden obtener. Y lo mejor de todo es que estos módulos son súper pequeños, lo que le permite incorporar una interfaz inalámbrica en casi cualquier proyecto.
- Resumen del hardware
- Frecuencia de radio
- ¿Qué es la banda ISM de 2,4 GHz?
- Consumo de energía
- Interfaz SPI
- Módulo nRF24L01+ Vs módulo nRF24L01+ PA/LNA
- ¿Qué es el PA LNA?
- ¿Cómo funciona el módulo transceptor nRF24L01+?
- Frecuencia de canal RF
- NRF24L01+ Multiceiver Network
- Protocolo ShockBurst mejorado
- Manejo automático de paquetes del nRF24L01+
- Distribución de pines del módulo transceptor nRF24L01+
- Cableado – Conexión del módulo transceptor nRF24L01+ a Arduino UNO
- Librería Arduino RF24 para el módulo nRF24L01+
- Código Arduino – Para el transmisor
- Código Arduino – Para el Receptor
- Mejorando el rango del módulo transceptor nRF24L01+
- Reducir el ruido de la fuente de alimentación
- Cambie la frecuencia de su canal
- Tasa de datos más baja
- ¿Qué significa la sensibilidad del receptor (Rx)?
- Mayor potencia de salida
Resumen del hardware
Frecuencia de radio
El módulo transceptor nRF24L01+ está diseñado para operar en la banda de frecuencia ISM de 2,4 GHz en todo el mundo y utiliza 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 ellos 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 Arduino o a cualquier microcontrolador lógico de 5V sin necesidad de utilizar ningún convertidor de nivel lógico.
El módulo admite potencia de salida programable a saber, 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 menor que un solo LED. Y lo mejor de todo es que consume 26 µA en modo de espera y 900 nA en modo de apagado. Por eso es el dispositivo inalámbrico de referencia para aplicaciones de bajo consumo.
Interfaz SPI
El módulo transceptor nRF24L01+ se comunica a través de una interfaz periférica en serie (SPI) de 4 pines con una velocidad de datos máxima 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) se pueden configurar 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 puede utilizar un máximo de dos esclavos SPI, es decir, dos módulos transceptores nRF24L01+.
Aquí están las especificaciones completas:
Rango de frecuencias | 2.4 GHz ISM Band |
Tasa de datos aérea máxima | 2 Mb/s |
Formato de modulación | GFSK |
Potencia de salida máx. Potencia de salida | 0 dBm |
Tensión de alimentación de funcionamiento | 1,9 V a 3,6 V |
Corriente de funcionamiento máx. Corriente de funcionamiento | 13,5mA |
Corriente mín. Corriente (modo de espera) | 26µA |
Entradas lógicas | Tolerante a 5V |
Rango de comunicación | 800+ m (línea de vista) |
Módulo nRF24L01+ Vs módulo nRF24L01+ PA/LNA
Hay una variedad de módulos disponibles basados en el chip nRF24L01+. A continuación se muestran las versiones más populares.
La primera versión utiliza una antena incorporada. Esto permite una versión más compacta del breakout. Sin embargo, la antena más pequeña también significa un menor rango de transmisión. Con esta versión, podrás comunicarte a una distancia de 100 metros. Por supuesto, eso es al aire libre en un espacio abierto. Su alcance en interiores, especialmente a través de las paredes, se verá ligeramente debilitado.
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 el PA, LNA, y el circuito de conmutación de transmisión-recepción. Este chip extensor de rango junto con una antena de pato ayuda al módulo a lograr un rango de transmisión significativamente mayor, de unos 1000m.
¿Qué es el PA LNA?
El PA significa Amplificador de Potencia. Simplemente aumenta la potencia de la señal que se transmite desde el chip nRF24L01+. Por su parte, LNA significa Amplificador de Bajo Ruido. La función del LNA es tomar la
señal extremadamente débil e incierta de la antena (normalmente del orden de microvoltios o menos de -100 dBm) y amplificarla a un nivel más útil (normalmente de unos 0.5 a 1V)
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 duplexor, que separa las dos señales y evita que la salida relativamente potente del PA sobrecargue la sensible entrada del LNA. Para más información consulta este artículo en digikey.com
Salvo esta diferencia, ambos módulos son compatibles. Es decir, si construyes tu proyecto con uno puedes desconectarlo y utilizar otro sin necesidad de hacer ningún cambio en el sistema.
¿Cómo funciona el módulo transceptor nRF24L01+?
Frecuencia de canal RF
El módulo transceptor nRF24L01+ transmite y recibe datos en una determinada frecuencia llamada Canal. Además, para que dos o más módulos transceptores se comuniquen entre sí, deben estar en el mismo canal. Este canal puede ser cualquier frecuencia de la banda ISM de 2,4 GHz o, para ser más precisos, puede estar entre 2,400 y 2,525 GHz (2400 a 2525 MHz).
Cada canal ocupa un ancho de banda inferior a 1MHz. Esto nos da 125 canales posibles con un espacio 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 funcionen independientemente en un solo lugar.
El canal ocupa un ancho de banda de menos de 1MHz a 250kbps y 1Mbps de velocidad de datos en el aire. Sin embargo, a una velocidad de datos aéreos de 2Mbps, se ocupa un ancho de banda de 2MHz (más amplio que la resolución del ajuste de la frecuencia del canal de RF). Por lo tanto, para garantizar 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(Selected) = 2400 + CH(Selected)
Por ejemplo, si selecciona 108 como su canal para la transmisión de datos, la frecuencia del canal de RF de su canal sería de 2508MHz (2400 + 108)
NRF24L01+ Multiceiver Network
El nRF24L01+ proporciona una función llamada Multiceiver. Es una abreviatura de Multiple Transmitters Single Receiver. En la que cada canal de RF se divide lógicamente en 6 canales de datos paralelos llamados Data Pipes. En otras palabras, una tubería de datos es un canal lógico en el canal de RF físico. Cada tubo de datos tiene su propia dirección física (Data Pipe Address) y puede ser configurado. Esto puede ilustrarse como se muestra a continuación.
Para simplificar el diagrama anterior, imagine que el receptor primario actúa como un receptor concentrador que recoge información de 6 nodos transmisores diferentes simultáneamente. El receptor concentrador puede dejar de escuchar en cualquier momento y actúa como transmisor. Pero esto sólo puede hacerse de una tubería/nodo a la vez.
Protocolo ShockBurst mejorado
El módulo transceptor nRF24L01+ utiliza una estructura de paquetes conocida como ShockBurst mejorado. Esta sencilla estructura de paquetes se divide en 5 campos diferentes, que se ilustran a continuación.
La estructura ShockBurst original consistía únicamente en los campos Preámbulo, Dirección, Carga útil y Comprobación de redundancia cíclica (CRC). El ShockBurst mejorado aportó una mayor funcionalidad para mejorar las comunicaciones utilizando un nuevo campo de control de paquetes (PCF).
Esta nueva estructura es estupenda 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 un ID 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 más importante, cada mensaje puede solicitar el envío de un acuse de recibo cuando es recibido por otro dispositivo.
Manejo automático de paquetes del nRF24L01+
Ahora, analicemos tres escenarios para comprender mejor cómo dos módulos nRF24L01+ realizan transacciones entre sí.
Transacción con acuse de recibo e interrupciónEste es un ejemplo de escenario positivo. Aquí el transmisor comienza una comunicación enviando un paquete de datos al receptor. Una vez transmitido todo el paquete, espera (alrededor de 130 µs) la recepción del paquete de acuse de recibo (paquete ACK). 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 paquete de datos perdidoSe trata de un escenario negativo en el que se necesita una retransmisión debido a la pérdida del paquete transmitido. Después de transmitir el paquete, el transmisor espera a recibir el paquete ACK. Si el transmisor no lo recibe dentro del tiempo de remisión automática (ARD), el paquete se retransmite. Cuando el receptor recibe el paquete retransmitido, se transmite el paquete ACK que a su vez genera una interrupción en el transmisor.
Transacción con acuse de recibo perdidoSe trata de nuevo de 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, una vez transcurrido el tiempo de remisión automática, vuelve a transmitir el paquete. Ahora, cuando el receptor recibe el paquete que contiene el mismo ID de paquete que el anterior, lo descarta y envía el paquete ACK de nuevo.
Todo este manejo de paquetes se realiza automáticamente por el chip nRF24L01+ sin la participación del microcontrolador.
Distribución de pines del módulo transceptor nRF24L01+
Veamos la distribución de pines de ambas versiones del módulo transceptor nRF24L01+.
GND es el pin de tierra. Suele marcarse encerrando el pin en un cuadrado para que pueda usarse como referencia para identificar los otros pines.
VCC suministra energía al módulo. Esto puede ser en cualquier lugar 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ás tu módulo nRF24L01+
CE (Chip Enable) es un pin activo-HIGH. Cuando se selecciona, el nRF24L01 transmitirá o recibirá, dependiendo del modo en el que se encuentre en ese momento.
CSN (Chip Select Not) 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 (Serial Clock) acepta los pulsos de reloj proporcionados por el maestro del bus SPI.
MOSI (Master Out Slave In) es la entrada SPI al 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.
Cableado – Conexión del módulo transceptor nRF24L01+ a Arduino UNO
Ahora que tenemos una comprensión completa de cómo funciona el módulo transceptor nRF24L01+, podemos empezar a conectarlo a nuestro Arduino.
Para empezar, conecte el pin VCC en el módulo a 3,3V en el Arduino y el pin GND a tierra. Los pines CSN y CE se pueden conectar a cualquier pin digital del Arduino. En nuestro caso, se conectan 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 una gran cantidad de transferencia de datos, darán el mejor rendimiento cuando se conectan hasta los pines SPI de hardware en un microcontrolador. Los pines SPI de hardware son mucho más rápidos que «golpear con bits» el código de la interfaz utilizando otro conjunto de pines.
Tenga en 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). Consulte 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 esté utilizando una placa Arduino diferente a la mencionada anteriormente, es aconsejable consultar la documentación oficial de Arduino antes de continuar.
¡Recuerda! Tienes que hacer dos de estos circuitos. Uno actúa como transmisor y el otro como receptor. El cableado para ambos es idéntico.
Una vez que tengas todo conectado, ¡estás listo para empezar!
Librería Arduino RF24 para el módulo nRF24L01+
La interconexión con el módulo transceptor nRF24L01+ es un montón de trabajo, pero por suerte para nosotros, hay una serie de bibliotecas disponibles. Una de las bibliotecas más populares es RF24. Esta biblioteca existe desde hace varios años. Es sencilla de usar para los principiantes, pero ofrece mucho para los usuarios avanzados. En nuestros experimentos, vamos a utilizar la misma biblioteca.
Puedes descargar la última versión de la biblioteca en la bifurcación del repositorio GitHub de RF24 o, simplemente haz clic en este botón para descargar el zip:
Para instalarla, abre el IDE de Arduino, ve a Sketch >Incluir biblioteca >Añadir biblioteca .ZIP, y luego selecciona el archivo RF24-master que acabas de descargar. Si necesitas más detalles sobre la instalación de una librería, visita este tutorial de Instalación de una librería Arduino.
Código Arduino – Para el transmisor
En nuestro experimento sólo enviaremos un mensaje tradicional de ‘Hola Mundo’ desde el transmisor al receptor.
Aquí está el sketch que usaremos para nuestro transmisor:
//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>//create an RF24 objectRF24 radio(9, 8); // CE, CSN//address through which two modules communicate.const byte address = "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 sketch comienza incluyendo las librerías. La librería SPI.h se encarga de 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>
Luego, 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 objectRF24 radio(9, 8); // CE, CSN
A continuación tenemos que crear una matriz 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 = "00001";
Podemos cambiar el valor de esta dirección a cualquier cadena de 5 letras como «nodo1». La dirección es necesaria si tienes varios módulos en una red. Gracias a la dirección, puedes elegir un módulo concreto con el que te interesa comunicarte, por lo 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: necesitamos inicializar el objeto radio usando radio.begin()
y usando la función radio.openWritingPipe()
establecemos la dirección del emisor.
//set the addressradio.openWritingPipe(address);
Por último, utilizaremos la función radio.stopListening()
que establece el módulo como transmisor.
//Set module as transmitterradio.stopListening();
En la sección de bucle: creamos un array de caracteres al que asignamos el mensaje «Hola Mundo». Mediante 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, se pueden enviar hasta 32 bytes a la vez. Porque ese es el tamaño máximo de un solo paquete que el nRF24L01+ puede manejar. Si necesita una confirmación de que el receptor recibió los 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 Arduino – Para el Receptor
Aquí está el sketch que usaremos para nuestro receptor
//Include Libraries#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>//create an RF24 objectRF24 radio(9, 8); // CE, CSN//address through which two modules communicate.const byte address = "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 = {0}; radio.read(&text, sizeof(text)); Serial.println(text); }}
Este programa se parece bastante al programa del transmisor excepto por algunos cambios.
Al principio de la función setup iniciamos la comunicación serial. A continuación usando 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 del stream. Se pueden crear hasta 6 streams que respondan a diferentes direcciones. Nosotros creamos sólo la dirección para el stream número 0. El segundo argumento es la dirección a la que reaccionará el stream para recoger los datos.
El siguiente paso es configurar 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 los datos enviados a la dirección especificada.
//Set module as receiver radio.startListening();
En la función de bucle: El sketch comprueba si ha llegado algún dato a la dirección mediante 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 = {0}; radio.read(&text, sizeof(text)); Serial.println(text); }
Si se reciben los datos, entonces crea un array de 32 caracteres rellenado con ceros (posteriormente el programa lo rellenará con los datos recibidos). Para leer los datos utilizamos el método radio.read (& text, sizeof (text)). Esto almacenará los datos recibidos en nuestro array de caracteres.
Al final sólo imprimimos el mensaje recibido en el monitor de serie. Si lo has hecho todo bien y no hay errores en las conexiones, deberías ver algo así en tu monitor serie.
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. Por lo tanto, vamos a discutir lo que podemos hacer para obtener un mejor alcance para nuestro módulo.
Reducir el ruido de la fuente de alimentación
Un circuito de RF 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 alcance que puede obtener.
A menos que la fuente de alimentación sea una batería independiente, es muy probable que haya ruido asociado a 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 alimentación tan cerca físicamente del módulo nRF24L01+ como sea posible.
Una forma más sencilla de superarlo es utilizar un Módulo Adaptador para el nRF24L01 muy económico.
El módulo adaptador tiene un conector hembra de 8 pines que le permite enchufar su módulo nRF24L01. Puede acomodar tanto el módulo que comentamos anteriormente, el que tiene 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 alimentación.
El módulo adaptador tiene su propio regulador de voltaje de 3,3 voltios y un conjunto de condensadores de filtro, por lo que puede alimentarlo con una fuente de alimentación de 5 voltios.
Cambie la frecuencia de su canal
Otra fuente potencial de ruido para un circuito de RF es el entorno exterior, especialmente si tiene redes vecinas configuradas en el mismo canal o interferencias de otros aparatos electrónicos.
Para evitar que estas señales causen problemas, le sugerimos que utilice 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.
Tasa de datos más baja
El nRF24L01+ ofrece la mayor sensibilidad de recepción 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, sabrás 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 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, la reducción de la velocidad de datos puede mejorar significativamente el alcance que 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 máxima potencia de salida también puede mejorar el rango de comunicación. El nRF24L01+ le permite elegir una de las potencias de salida: 0 dBm, -6 dBm, -12 dBm o -18 dBm. La selección de una potencia de salida de 0 dBm envía una señal más fuerte a través del aire.