nRF24L01 - Cómo funciona, interfaz Arduino, circuitos, códigos
En este tutorial aprenderemos a hacer comunicación inalámbrica entre dos placas Arduino usando el nRF24L01 módulos transceptores. El módulo nRF24L01 es una opción muy popular para la comunicación inalámbrica cuando se utiliza Arduino.
Ya he usado este módulo para numerosos proyectos de Arduino y puedes ver algunos de ellos aquí:
Puede ver el siguiente video o leer el tutorial escrito a continuación. Incluye todo lo que necesitamos saber sobre el módulo transceptor nRF24L01, como el pinout del módulo, el principio de funcionamiento, el cableado y varios ejemplos de código.
Para explicar la comunicación inalámbrica haremos dos ejemplos, el primero será enviar un mensaje simple de "Hola mundo" de un Arduino a otro, y en el segundo ejemplo tendremos una comunicación bidireccional entre las placas Arduino, donde usando con el Joystick en el primer Arduino controlaremos el servomotor en el segundo Arduino, y viceversa, utilizando el pulsador en el segundo Arduino controlaremos el LED en el primer Arduino.
Echemos un vistazo más de cerca al módulo transceptor NRF24L01. Utiliza la banda de 2,4 GHz y puede operar con velocidades de transmisión desde 250 kbps hasta 2 Mbps. Si se usa en espacios abiertos y con una tasa de baudios más baja, su alcance puede alcanzar hasta 100 metros.
Aquí están las especificaciones completas:
El módulo puede usar 125 canales diferentes, lo que brinda la posibilidad de tener una red de 125 módems que funcionan de forma independiente en un solo lugar. Cada canal puede tener hasta 6 direcciones, o cada unidad puede comunicarse con hasta 6 otras unidades al mismo tiempo.
El consumo de energía de este módulo es de alrededor de 12 mA durante la transmisión, que es incluso más bajo que un solo LED. El voltaje de funcionamiento del módulo es de 1,9 a 3,6 V, pero lo bueno es que los otros pines toleran una lógica de 5 V, por lo que podemos conectarlo fácilmente a un Arduino sin usar ningún convertidor de nivel lógico.
Tres de estos pines son para la comunicación SPI y deben conectarse a los pines SPI del Arduino, pero tenga en cuenta que cada placa Arduino tiene diferentes pines SPI. Los pines CSN y CE se pueden conectar a cualquier pin digital de la placa Arduino y se utilizan para configurar el módulo en modo de espera o activo, así como para cambiar entre modo de transmisión o comando. El último pin es un pin de interrupción que no tiene que usarse.
Hay varias variaciones de los módulos NRF24L01. El más popular es el que tiene antena integrada. Esto hace que el módulo sea más compacto, pero por otro lado, reduce el rango de transmisión a una distancia de unos 100 metros.
La segunda variación, en lugar de antena integrada, tiene un conector SMA y a la que podemos conectar una antena de pato para un mejor rango de transmisión.
La tercera variación que se muestra aquí, además de la antena de pato, tiene un chip RFX2401C que incluye PA (amplificador de potencia) y LNA (Amplificador de bajo ruido). Esto amplifica la señal NRF24L01 y permite un rango de transmisión aún mejor de hasta 1000 metros en espacios abiertos.
Aquí hay una vista detallada del pinout NRF24L01, así como del módulo NRF24L01+ PA/LNA.
Ambos módulos, el NRF24L01 y el NRF24L01+ PA/LNA tienen el mismo pinout, por lo que podemos conectarlos en nuestro circuito de la misma forma.
Así es como necesitamos conectar los módulos NRF24L01 a las placas Arduino.
Como ya mencioné, cada placa Arduino tiene diferentes pines SPI, así que tenlo en cuenta cuando conectes los módulos a tu placa Arduino.
Puede obtener los componentes necesarios para este tutorial de Arduino desde los siguientes enlaces:
Una vez que conectamos los módulos NRF24L01 a las placas Arduino, estamos listos para hacer los códigos tanto para el transmisor como para el receptor.
Primero necesitamos descargar e instalar la biblioteca RF24, lo que hace que la programación sea menos difícil. También podemos instalar esta biblioteca directamente desde Arduino IDE Library Manager. Simplemente busque "rf24" y busque e instale el de "TMRh20, Avamander".
Aquí están los dos códigos para la comunicación inalámbrica y debajo está la descripción de ellos.
Por lo tanto, debemos incluir el SPI básico y las bibliotecas RF24 recién instaladas y crear un objeto RF24. Los dos argumentos aquí son los pines CSN y CE.
A continuación, debemos crear una matriz de bytes que representará la dirección, o el llamado canal a través del cual se comunicarán los dos módulos.
Podemos cambiar el valor de esta dirección a cualquier cadena de 5 letras y esto permite elegir con qué receptor hablaremos, por lo que en nuestro caso tendremos la misma dirección tanto en el receptor como en el transmisor.
En la sección de configuración, debemos inicializar el objeto de radio y, mediante la función radio.openWritingPipe(), configuramos la dirección del receptor al que enviaremos los datos, la cadena de 5 letras que configuramos previamente.
Por otro lado, en el receptor, usando la función radio.setReadingPipe() configuramos la misma dirección y de esa forma habilitamos la comunicación entre los dos módulos.
Luego, usando la función radio.setPALevel(), establecemos el nivel del amplificador de potencia, en nuestro caso, lo configuraré al mínimo ya que mis módulos están muy cerca uno del otro.
Tenga en cuenta que si usa un nivel más alto, se recomienda usar condensadores de derivación a través de GND y 3,3 V de los módulos para que tengan un voltaje más estable mientras funcionan.
A continuación tenemos la función radio.stopListening() que establece el módulo como transmisor y, por otro lado, tenemos la función radio.startListening() que establece el módulo como receptor.
En la sección de bucle, en el transmisor, creamos una matriz de caracteres a los que asignamos el mensaje "Hola mundo". Usando la función radio.write() enviaremos ese mensaje al receptor. El primer argumento aquí es la variable que queremos que se envíe.
Al usar el “&” antes del nombre de la variable, en realidad establecemos una indicación de la variable que almacena los datos que queremos enviar y, al usar el segundo argumento, establecemos la cantidad de bytes que queremos tomar de esa variable. En este caso, la función sizeof() obtiene todos los bytes de las cadenas "texto". Al final del programa añadiremos 1 segundo de retraso.
Usando la función radio.write() podemos enviar un máximo de 32 bytes a la vez.
Por otro lado, en el receptor, en la sección de bucle usando la función radio.available() verificamos si hay datos para recibir. Si eso es cierto, primero creamos una matriz de 32 elementos, llamada "texto", en la que guardaremos los datos entrantes.
Usando la función radion.read() leemos y almacenamos los datos en la variable "texto". Al final solo imprimimos texto en el monitor serial. Entonces, una vez que cargamos ambos programas, podemos ejecutar el monitor en serie en el receptor y notaremos que el mensaje "Hello World" se imprime cada segundo.
Vale la pena señalar que el ruido de la fuente de alimentación es uno de los problemas más comunes que experimentan las personas cuando intentan establecer una comunicación exitosa con los módulos NRF24L01. En general, los circuitos de RF o las señales de radiofrecuencia son sensibles al ruido de la fuente de alimentación. Por lo tanto, siempre es una buena idea incluir un condensador de desacoplamiento en la línea de alimentación. El capacitor puede ser de 10uF a 100uF.
Resumen
Módulo transceptor nRF24L01
Rango de frecuencia 2,4 - Banda ISM de 2,5 GHz Velocidades de datos 250Kbps / 1Mbps / 2Mbps Máx. potencia de salida 0dBm Tensión de funcionamiento 1.9 – 3.6V Máx. corriente de funcionamiento 12.3mA Actual en espera 22µA Entradas lógicas tolerancia a 5V Rango de comunicación 100m (espacio abierto) Cómo funciona
Variaciones del módulo
Distribución de pines del módulo nRF24L01
Cómo conectar el nRF24L01 a Arduino
Arduino SCK MISO MOSI SS Uno 13 12 11 10 Nano 13 12 11 10 Mega 52 50 51 53
Código Arduino y nRF24L01
Código del transmisor
/*
* Arduino Wireless Communication Tutorial
* Example 1 - Transmitter Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
void setup() {
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
}
void loop() {
const char text[] = "Hello World";
radio.write(&text, sizeof(text));
delay(1000);
}
Code language: Arduino (arduino)Código del receptor
/*
* Arduino Wireless Communication Tutorial
* Example 1 - Receiver Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
void setup() {
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
}
void loop() {
if (radio.available()) {
char text[32] = "";
radio.read(&text, sizeof(text));
Serial.println(text);
}
}
Code language: Arduino (arduino)Código Descripción
RF24 radio(7, 8); // CE, CSN
Code language: Arduino (arduino)const byte address[6] = "00001";
Code language: Arduino (arduino)radio.openWritingPipe(address);
Code language: Arduino (arduino)radio.openReadingPipe(0, address);
Code language: Arduino (arduino)radio.setPALevel(RF24_PA_MIN);
Code language: Arduino (arduino)// at the Transmitter
radio.stopListening();
Code language: Arduino (arduino)// at the Receiver
radio.startListening();
Code language: Arduino (arduino)void loop() {
const char text[] = "Hello World";
radio.write(&text, sizeof(text));
delay(1000);
}
Code language: Arduino (arduino)void loop() {
if (radio.available()) {
char text[32] = "";
radio.read(&text, sizeof(text));
Serial.println(text);
}
}
Code language: Arduino (arduino)Resolución de problemas
Proceso de manufactura
- Cómo medir la calidad del aire en OpenSensors
- Cómo piratear mandos a distancia por infrarrojos
- ¿Qué tan alto eres?
- Generador de ondas JX
- Patineta de realidad virtual DIY
- Cómo conectar Arduino Mega con el módulo GPS NEO-6M
- ¡¿Qué tan fácil es usar un termistor ?!
- Cómo hacer música con un Arduino
- Cómo utilizar Modbus con Arduino
- Reloj de alarma ArduRadio
- Aquí hay una idea:cómo funciona una interfaz cerebro-computadora