Cuando dos o más Arduinos pueden comunicarse entre sí de forma inalámbrica, se abre un mundo de posibilidades, como por ejemplo: Por ejemplo, monitoreo remoto de datos de sensores, control de robots, domótica, etc.
Y cuando se trata de una solución de RF bidireccional rentable pero confiable, no hay nada mejor Semiconductores nórdicos Módulo transceptor nRF24L01+.
El módulo nRF24L01+ está disponible 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 asequibles del mercado.
Descripción general del hardware
Frecuencia de radio
El módulo nRF24L01+ está diseñado y utiliza la banda de frecuencia ISM global de 2,4 GHz. Modulación GFSK para la transmisión de datos. La velocidad de transferencia de datos es configurable y se puede establecer en 250 Kbit/s, 1 Mbit/s o 2 Mbit/s.
La banda de 2,4 GHz es una de ellas. Bandas Industriales, Científicas y Médicas (ISM). reservado internacionalmente para dispositivos sin licencia y de bajo consumo. Dispositivos como teléfonos inalámbricos, dispositivos Bluetooth, dispositivos de comunicación de campo cercano (NFC) y redes informáticas inalámbricas (WiFi) utilizan frecuencias ISM.
Actuación
El voltaje de funcionamiento del módulo está entre 1,9 y 3,9 V. Tenga en cuenta que alimentar el módulo a 5 V probablemente dañará su módulo nRF24L01+.
Aunque el módulo funciona de 1,9 V a 3,6 V, los pines lógicos toleran 5 voltios, por lo que no necesita un traductor de nivel lógico.
La potencia de salida del módulo se puede programar en 0 dBm, -6 dBm, -12 dBm o -18 dBm. A 0 dBm, el módulo sólo consume 12 mA durante la transmisión, lo que es menos que el consumo de un solo LED.
Y lo mejor es que sólo consume 26 µA en modo de espera y sólo 900 nA en modo apagado. Por eso es el dispositivo inalámbrico preferido para aplicaciones de bajo consumo.
interfaz SPI
El nRF24L01+ se comunica a través de una SPI (interfaz periférica serie) de 4 pines con una velocidad de datos máxima de 10 Mbit/s.
Todos los parámetros, incluido 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 kbit/s, 1 Mbit/s o 2 Mbit/s), Se puede ajustar a través de la interfaz SPI y se puede configurar.
El bus SPI utiliza el concepto de maestro y esclavo. En la mayoría de nuestros proyectos, Arduino actúa como maestro y el módulo nRF24L01+ actúa como esclavo.
A diferencia del bus I2C, el bus SPI tiene un número limitado de esclavos. Por lo tanto, puede utilizar hasta dos esclavos SPI (dos módulos nRF24L01+) en un solo Arduino.
Especificaciones técnicas
Aquí están las especificaciones:
Rango de frecuencia | Banda ISM de 2,4 GHz |
Velocidad máxima de datos aéreos | 2Mbps |
Formato de modulación | GFSK |
Potencia de salida máx. | 0dBm |
Tensión de alimentación de funcionamiento | 1,9 V a 3,6 V |
Corriente de funcionamiento máx. | 13,5 mA |
Mínimo. Energía (modo de espera) | 26 µA |
Entradas lógicas | Tolerante a 5V |
Rango de comunicación | 800+ m (línea de visión) |
Puede encontrar más información en la siguiente hoja de datos.
Módulo nRF24L01+ -vs- Módulo nRF24L01+ PA/LNA
El chip nRF24L01+ se utiliza en una variedad de módulos, los dos más comunes se enumeran a continuación.
El primero utiliza una antena integrada, lo que lo hace más compacto. Sin embargo, una antena más pequeña significa un rango de transmisión más corto. Este módulo le permite comunicarse a una distancia de 100 metros. Por supuesto, esto está a la vista. Dentro de la casa, el alcance se vuelve algo más débil, especialmente a través de las paredes.
El segundo tiene un conector SMA y una antena de pato, pero esa no es la única diferencia. contiene uno Chip extensor de rango RFX2401C que combina PA, LNA y circuitos de transmisión/recepción. Esto significa que el módulo alcanza un alcance de transmisión significativamente mayor, de hasta 1000 metros.
Excepto por esta diferencia, ambos módulos son compatibles directamente. Si construye su proyecto con uno, simplemente puede desconectarlo y usar el otro sin realizar ningún cambio en el sistema.
¿Qué son exactamente PA y LNA?
PA significa Amplificador de poder. Simplemente amplifica la señal transmitida por el chip nRF24L01+. LNA significa Amplificador de bajo ruidoy su función es amplificar una señal extremadamente débil recibida por la antena (generalmente por debajo de microvoltios o -100 dBm) a un nivel más útil (generalmente alrededor de 0,5 a 1 V).
El amplificador de bajo ruido (LNA) de la ruta de recepción y el amplificador de potencia (PA) de la ruta de transmisión están conectados a la antena a través de un duplexor, que aísla las dos señales y evita que la salida PA relativamente potente sobrecargue la entrada sensible del LNA. Lee esto Artículo en digikey.com para más información.
¿Cómo funciona el módulo nRF24L01+?
Frecuencia del canal de RF
El módulo nRF24L01+ envía y recibe datos a una frecuencia específica, llamada canal. Para que dos o más módulos se comuniquen entre sí, deben estar en el mismo canal. Este canal puede ser cualquier frecuencia en la banda ISM de 2,4 GHz, más específicamente cualquier frecuencia entre 2.400 y 2.525 GHz (2400 a 2525 MHz).
Cada canal requiere menos de 1 MHz de ancho de banda. Esto da 125 canales posibles separados por 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 kbit/s y 1 Mbit/s, cada canal utiliza 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 velocidad de datos aéreos de 2 Mbps, se requiere un ancho de banda de 2 MHz (mayor que la resolución del ajuste de frecuencia del canal de RF). Por lo tanto, en el modo de 2 Mbps, mantenga una distancia de 2 MHz entre los dos canales para garantizar que los canales no se superpongan y se reduzca la diafonía.
La frecuencia del canal de RF del canal seleccionado se calcula utilizando la siguiente fórmula:
frecuencia(Seleccionado) = 2400 + CH(Seleccionado)
Por ejemplo, si elige el canal 108 para la transmisión de datos, la frecuencia del canal RF es 2508 MHz (2400 + 108).
Red multireceptor nRF24L01+
El nRF24L01+ tiene una característica llamada multireceptor. Es MultiPle remitente único reRecipiente.
En una red multireceptor, cada canal de RF se divide lógicamente en seis canales de datos paralelos, denominados Líneas de datos. En otras palabras, la línea de datos es uno de los seis canales lógicos dentro de un único canal físico de RF. Cada canal de datos tiene su propia dirección única, denominada dirección de canal de datos. Sólo un canal de datos puede recibir un paquete a la vez.
A continuación se muestra una red multireceptor.
Para comprender una red multireceptor, imagine que el receptor principal actúa como un receptor central y recopila simultáneamente datos de seis nodos transmisores diferentes. El receptor central puede pasar de escuchar a transmitir en cualquier momento.
Protocolo avanzado ShockBurst
El nRF24L01+ utiliza una estructura de paquete llamada Explosión de choque mejorada. Tiene cinco campos:
La estructura Shockburst original contenía solo los campos Preámbulo, Dirección, Carga útil y Verificación de redundancia cíclica (CRC). Al introducir el Panel de control de paquetes (PCF)Funcionalidad Shockburst mejorada para comunicaciones avanzadas.
Esta nueva estructura es excelente por varias razones.
- Admite cargas útiles de longitud variable con un especificador de longitud de carga útil, por lo que las cargas útiles pueden oscilar entre 1 y 32 bytes.
- A cada paquete enviado se le asigna una ID de paquete que permite al destinatario determinar si el mensaje es nuevo o ha sido retransmitido.
- Cada mensaje contiene un campo que solicita al destinatario que envíe una confirmación.
nRF24L01+ Procesamiento automático de paquetes
Veamos tres escenarios para comprender mejor cómo interactúan entre sí los dos módulos nRF24L01+.
-
Transacción con confirmación:
Este es un ejemplo de un escenario positivo. En este caso, el remitente inicia la comunicación enviando un paquete de datos al receptor. Después de transmitir el paquete, el remitente espera aproximadamente 130 µs hasta que llegue el acuse de recibo (ACK). El destinatario envía el ACK después de recibir exitosamente el paquete. Una vez que el remitente recibe la confirmación, la transacción finaliza.
-
Transacción de paquete de datos perdido:
Este es un escenario negativo en el que se requiere la retransmisión debido a la pérdida de paquetes. El remitente espera confirmación después de transmitir el paquete.
Si el remitente no lo recibe dentro del tiempo ARD (Auto-Retransmit-Delay), el paquete será retransmitido. Cuando el destinatario recibe el paquete retransmitido, envía el acuse de recibo que finaliza la transacción.
-
Transacción con confirmación perdida:
Este es otro escenario negativo en el que se requiere la retransmisión debido a la pérdida de ACK. Dado que el remitente no recibió el acuse de recibo, se supone que el paquete se perdió (aunque el receptor recibió el paquete en el primer intento).
Como resultado, el remitente retransmite el paquete después del tiempo de espera del retraso de retransmisión automática. Cuando el receptor recibe un paquete con el mismo ID que el anterior, lo descarta y reenvía el ACK. Una vez que el remitente recibe la confirmación, la transacción finaliza.
El chip nRF24L01+ maneja todo el proceso de procesamiento de paquetes sin la participación del microcontrolador.
Asignación de pines del módulo nRF24L01+
Echemos un vistazo a la distribución de pines de ambos módulos nRF24L01+.
Tierra es el pin de tierra. Para distinguirlo de los demás pines, tiene una marca cuadrada.
VCC suministra energía al módulo. Puede estar entre 1,9 y 3,9 voltios. Puedes conectarlo a la salida de 3.3V de tu Arduino. Tenga en cuenta que la conexión al pin de 5 V probablemente dañará su módulo nRF24L01+.
CE (habilitación de chip) es un pin alto activo. Cuando se activa, el nRF24L01 transmite o recibe 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 a procesarlos en consecuencia.
SCK (reloj serie) Acepta pulsos de reloj del bus maestro SPI.
MOSI (Master Out Slave In) es la entrada SPI para el nRF24L01.
MISO (Maestro en esclavo fuera) es la salida SPI del nRF24L01.
IRQ Es un pin de interrupción que puede notificar al maestro cuando es necesario procesar nuevos datos.
Cableado de un módulo nRF24L01+ a un Arduino
Ahora que ya sabemos todo sobre cómo funciona el módulo nRF24L01+, podemos empezar a conectarlo a nuestro Arduino.
Primero, conecte el pin VCC del módulo a los 3,3 V del Arduino y el pin GND a tierra. Los pines CSN y CE se pueden conectar a cualquier pin digital de 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. En placas Arduino como UNO/Nano V3.0, estos pines son digitales 13 (SCK), 12 (MISO), 11 (MOSI) y 10 (SS).
Si estás utilizando otra placa Arduino, lee la documentación oficial. Posiciones de los pines SPI Antes de continuar.
La siguiente tabla enumera las conexiones de pines:
Módulo nRF24L01+ | arduino | |
Tierra | Tierra | |
VCC | 3,3 V | |
CE | 9 | |
CSN | octavo | |
SCK | 13 | |
MOSI | 11 | |
MISO | 12 |
Las siguientes imágenes muestran cómo se conecta el módulo nRF24L01+ al Arduino.
Recuerde que necesita crear dos de esos circuitos. Uno actúa como transmisor y el otro como receptor. Ambos tienen el mismo cableado.
Una vez que tengas todo conectado, ¡estarás listo para comenzar!
Instalación de biblioteca
Hay muchas bibliotecas disponibles para el módulo nRF24L01+, pero una de las más populares es RF24. Esta biblioteca existe desde hace mucho tiempo. Es fácil de usar para principiantes, pero ofrece mucho para usuarios avanzados. Usaremos esta biblioteca en nuestros ejemplos.
Para instalar la biblioteca, navegue hasta Bosquejo > Incluir biblioteca > Administrar bibliotecas… Espere a que el administrador de la biblioteca descargue el índice de la biblioteca y actualice la lista de bibliotecas instaladas.
Filtra tu búsqueda escribiendo “rf24'. Busque la biblioteca de TmRh20. Haga clic en esta entrada y luego seleccione «Instalar».
Código de muestra Arduino: para transmisores
Los siguientes ejemplos muestran cómo configurar una conexión unidireccional simple entre un transmisor y un receptor. El remitente simplemente envía un mensaje tradicional de «Hola mundo» al receptor, que lo muestra en la ventana Serial Monitor.
Este es el código 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);
}
Explicación del código
El boceto comienza con la integración de las bibliotecas necesarias. La biblioteca SPI.h maneja la comunicación SPI, mientras que las bibliotecas nRF24L01.h y RF24.h controlan el módulo.
//Include Libraries
#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 están conectadas las señales CE y CSN.
//create an RF24 object
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 la comunicación.
//address through which two modules communicate.
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». Solo asegúrese de que tanto el remitente como el destinatario utilicen la misma dirección.
Una dirección de canalización le permite seleccionar y comunicarse con un módulo específico en su red. Esto es útil si su red contiene varios módulos.
En la sección de configuración utilizamos el begin()
Función para inicializar el objeto de radio, seguido del openWritingPipe()
Función para configurar la dirección del remitente.
radio.begin();
//set the address
radio.openWritingPipe(address);
Finalmente utilizamos el stopListening()
Función para configurar el módulo como transmisor.
//Set module as transmitter
radio.stopListening();
En la sección de bucle, primero creamos una matriz de caracteres y almacenamos el mensaje «Hola mundo» en ella.
Usamos eso write()
Función para enviar el mensaje al destinatario. 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+.
El write()
La función devuelve un valor bool que puede utilizar para comprobar si el destinatario recibió correctamente los datos. Cuando los datos llegan al destinatario, se devuelve VERDADERO. de lo contrario se devuelve FALSO.
También es importante señalar que el write()
La función detiene el programa hasta que recibe una confirmación o se han agotado todos los intentos de retransmisión.
Código de muestra Arduino – Para receptores
Este es 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);
}
}
Explicación del código
Salvo 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. Entonces usa eso openReadingPipe()
función configuramos la misma dirección de canalización que el remitente. Esto permite que el remitente y el receptor se comuniquen entre sí.
El openReadingPipe()
El primer argumento de la función especifica qué canal abrir para lectura. Dado que se pueden abrir hasta seis tubos para lectura 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.
//set the address
radio.openReadingPipe(0, address);
Luego configuramos el módulo como receptor y comenzamos a recibir datos. Usamos eso startListening()
función para lograrlo.
//Set module as receiver
radio.startListening();
El available()
El método se utiliza en la sección de bucle para comprobar si los datos están disponibles para leer. Este método devuelve VERDADERO si hay datos disponibles, FALSO en caso contrario.
if (radio.available())
{
char text[32] = {0};
radio.read(&text, sizeof(text));
Serial.println(text);
}
Cuando hay datos disponibles, se crea una matriz de 32 caracteres rellenos con ceros para almacenarlos. Luego, los datos se leen del búfer y se almacenan en nuestra matriz de caracteres usando read(&text, sizeof(text))
Método.
Finalmente, el mensaje recibido se imprime en el monitor serie. Si todo está bien, su monitor serie debería verse así.
Formas de mejorar el alcance del módulo nRF24L01+
Un parámetro clave para un sistema de comunicación inalámbrica es el alcance de comunicación. Este suele ser el factor decisivo a la hora de seleccionar una solución de RF. Entonces, 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 a las perturbaciones en el suministro de energía. El ruido de la fuente de alimentación, si no se controla, puede reducir significativamente el alcance alcanzable.
A menos que la fuente de energía sea una batería independiente, es muy probable que la salida de energía sea alta. Para evitar que este ruido ingrese al sistema, se recomienda colocar un capacitor de filtro de 10 µF a través de 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 utilizar un adaptador económico para el módulo nRF24L01+.
Este adaptador tiene un zócalo de 8 pines al que puede conectar su módulo nRF24L01+. Admite ambas versiones del módulo nRF24L01+, una con antena integrada y otra con antena externa (PA/LNA).
También cuenta con un conector de 2 pines para entrada de alimentación y un conector de 6 pines para SPI y conexiones de interrupción.
Dado que el adaptador tiene un regulador de voltaje de 3,3 V incorporado y condensadores de filtro, puede alimentarlo de forma segura con una fuente de alimentación de 5 V.
Cambiar frecuencia de canal
El entorno externo también puede ser una fuente de ruido para los circuitos de RF, especialmente cuando las redes vecinas están sintonizadas en el mismo canal.
Dado que WiFi utiliza principalmente canales de baja frecuencia, se recomienda utilizar los 25 canales más altos de su nRF24L01+ para evitar interferencias de estas señales.
Utilice una velocidad de datos más baja
A 250 Kbit/s, el nRF24L01+ tiene la sensibilidad de receptor más alta de -94 dBm. Sin embargo, a una velocidad de datos de 2 Mbit/s, la sensibilidad del receptor cae a -82 dBm. Esto significa que a 250 kbit/s el receptor es aproximadamente diez veces más sensible que a 2 Mbit/s y, por lo tanto, puede decodificar señales diez veces más débiles.
Esto significa que reducir la velocidad de datos puede mejorar significativamente el alcance alcanzable. 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. Por ejemplo, una sensibilidad del receptor de -94 dBm supera a una sensibilidad del receptor de -82 dBm en 12 dB.
Usando mayor potencia de salida
Configurar 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 que incluyen 0 dBm, -6 dBm, -12 dBm y -18 dBm. Elegir una potencia de salida de 0 dBm enviará señales más fuertes al aire pero utilizará más energía.
¡Excelente explicación! Me ha quedado mucho más claro cómo utilizar el módulo nRF24L01+ con Arduino. ¡Gracias por compartir tus conocimientos!
Interesante, gracias por explicar de manera sencilla y clara el funcionamiento de estos módulos. ¡A seguir aprendiendo y experimentando con Arduino!