En este post, vamos a discutir cómo realizar una comunicación inalámbrica unidireccional entre dos dispositivos Arduino utilizando los módulos NRF24L01. Estos módulos están basados en el chip de Nordic semiconductor NRF24 y son ideales para proyectos de comunicación inalámbrica debido a sus características únicas.
Primero, es importante mencionar que los módulos NRF24L01 se pueden alimentar con la salida de 3.3V de nuestro Arduino. Esto significa que no necesitamos preocuparnos por proporcionar una fuente de alimentación adicional, lo que hace que sea una opción muy conveniente.
Además, estos módulos tienen un consumo muy bajo, lo que significa que no van a consumir mucha energía, lo que es ideal para proyectos de baja potencia. Esto es especialmente importante si estás trabajando con dispositivos alimentados por baterías.
En cuanto a la velocidad de comunicación, los módulos NRF24L01 son muy rápidos, lo que significa que puedes enviar y recibir datos a altas velocidades. Esto es ideal para proyectos en los que la velocidad de comunicación es crítica.
Por último, pero no menos importante, es el precio. Los módulos NRF24L01 son muy económicos, lo que significa que puedes adquirirlos por muy poco dinero. Esto es especialmente importante si estás trabajando en un proyecto de bajo presupuesto.
En resumen, los módulos NRF24L01 son una excelente opción para proyectos de comunicación inalámbrica debido a su bajo consumo, alta velocidad de comunicación y bajo costo. A continuación os muestro algunas de las principales características de estos módulos:
-
- Banda ISM de 2.4GHz de operación mundial.
- Hasta una velocidad de datos de 2Mbps.
- Operación a muy baja potencia.
- Voltaje de alimentación de 1.9 a 3.6V.
- ShockBurst™ Mejorado.
- Manejo de paquetes automático.
- Compatible con nRF2401A, 02, E1 y E2.
- Distancia de alcance de 70~100mts en espacio abierto.
Los módulos NRF24L01 son transceptores, lo que significa que pueden ser configurados tanto como emisores como receptores, o incluso como ambos al mismo tiempo. Esta versatilidad los convierte en una de las mejores opciones para proyectos de comunicación inalámbrica, ya sea para domótica, robótica, juguetes, controles remotos o cualquier otro dispositivo inalámbrico que se te ocurra.
En el mercado existen varios modelos de módulos NRF24L01 de diferentes fabricantes, pero todos son compatibles entre sí. Todos operan en la banda de 2.4GHz, que es una banda libre de radiofrecuencia, lo que significa que no se requiere ningún permiso para usarlos en ninguna parte del mundo. Sin embargo, debido a que es una banda libre, también significa que no hay garantía de que no haya alguien más emitiendo en esta banda en las cercanías, lo que puede producir interferencias en nuestras emisiones.
Existe un modelo más completo, conocido como NRF24L01+PA+LNA, que además del chip NRF24L01, cuenta con un circuito amplificador de potencia (PA) y un circuito amplificador de bajo ruido (LNA), así como una antena SMA. Estos componentes adicionales permiten lograr un rango de hasta 1 Km. Sin embargo, es importante tener en cuenta que el alcance real puede variar dependiendo de las condiciones ambientales y la configuración del dispositivo. En futuros posts, discutiremos estos modelos más a fondo y cómo utilizarlos en proyectos de comunicación inalámbrica.
El alcance o distancia entre los módulos NRF24L01 varía dependiendo del modelo que se esté utilizando y del entorno en el que se encuentren. El modelo básico con el que trabajaremos tiene un alcance aproximado similar al de una señal WIFI, es decir, menos de 100 metros en espacios abiertos. Sin embargo, es importante tener en cuenta que factores como paredes, ruido y condiciones ambientales pueden afectar el alcance real.
Además, es importante mencionar que aunque estos módulos tienen un bajo consumo en modo de espera, pueden requerir una corriente adicional al encenderse, especialmente en el caso del emisor. Esto puede causar problemas en el arranque o mal funcionamiento si la fuente de alimentación de 3.3V de Arduino no es suficiente. Una solución a esto es utilizar una fuente de alimentación externa de 12VDC/3000mA para suministrar una corriente adicional en todos los terminales.
Además, para evitar interferencias eléctricas que puedan afectar el funcionamiento de los módulos NRF24L01, es recomendable conectar un condensador electrolítico de 10µF entre VCC y GND de cada módulo. A continuación se presenta una tabla que muestra la correspondencia de los pines de conexión del NRF24L01 con el Arduino UNO.
Para la realización del programa he utilizado las librerías y que podéis descargar en el este enlace . Antes de empezar a trabajar con los módulos NRF24L01, es importante asegurarse de que tienes las librerías necesarias descargadas e importadas al IDE de Arduino. Una vez importadas, debes cerrar y volver a abrir el IDE para que se carguen correctamente.
Los pines CE y CSN son programables, lo que significa que pueden ser configurados según tus necesidades. Por ejemplo, se pueden configurar como RF24 radio (9,10) si así lo deseas. Sin embargo, es importante tener en cuenta que el resto de los pines deben ser respetados ya que son los que el Arduino UNO tiene predeterminados para la comunicación SPI.
Además, es importante subir el programa correspondiente a cada Arduino teniendo en cuenta la función que debe realizar, ya sea como emisor o como receptor. Por ejemplo, si el Arduino se comporta como emisor, debe tener un pulsador con conexión PULL-DOWN en su pin digital 7. Por otro lado, si se comporta como receptor, debe tener conectado un LED a través de una resistencia limitadora de tensión de 220Ω en su pin digital 7.
Con los programas descargables en este post, es posible controlar el encendido y apagado de un LED mediante una conexión inalámbrica por radiofrecuencia (RF) entre dos Arduinos utilizando módulos NRF24L01. Cada vez que presionamos el pulsador conectado al Arduino Emisor, se envía mediante RF el valor de la variable estado_pulsador[0]. Si es la primera vez que se presiona, se envía un «1» y si es la segunda vez un «0», repitiéndose este proceso continuamente para encender o apagar un LED conectado al Arduino Receptor, que es el que recibe a través de RF el valor de la variable estado_pulsador[0].
Cuando la variable estado_pulsador[0] es «1», el LED conectado al Arduino Receptor se enciende, y cuando es «0», el LED se apaga. Sin embargo, si no se presiona el pulsador del Arduino Emisor, no se enviará ningún valor mediante RF y como resultado, el LED conectado al Arduino Receptor permanecerá apagado. Para obtener más información sobre este proceso, se recomienda revisar los comentarios incluidos en los programas.
Lista de Materiales
-
- 2 Arduinos UNO Rev.3
- Cable USB tipo A-B
- 2 módulos NRF24L01
- 2 Condensadores electrolíticos de 10µF y más de 5V
- 1 Pulsador
- Resistencia de 10KΩ
- LED 5mm (de cualquier color)
- Resistencia de 220Ω
- Fuente de alimentación de 12VDC/3000mA (DC12300)
- Protoboard
- Cables de conexión
Código del programa
Emisor NRF24L01
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
/* TITULO: Comunicación unidireccional entre Arduinos con módulos NRF24L01 >> NRF24L01_Unidireccional_Emisor AUTOR: MARIANO DEL CAMPO GARCÍA (@2016) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia - TWITTER: https://twitter.com/MarianoCampoGa - CORREO: [email protected] DESCRIPCIÓN DEL PROGRAMA Con este programa controlamos el encendido y apagado de un LED con un solo pulsador, mediante una conexión por radiofrecuencia (RF) entre dos Arduinos, a través de módulos NRF24L01. Cada vez que presionamos el pulsador se envía mediante RF el valor de la variable estado_pulsador[0], si es la primera vez que lo presionamos se envía un "1" y si es la segunda vez un "0", repitiéndose el proceso contínuamente, para que se encienda o apage un LED conectado al Arduino Receptor, que es el que obtiene, a través de RF, el valor de la variable estado_pulsador[0]. En el supuesto de que nunca presionemos el pulsador, no se envía ningún valor mediante RF y como consecuencia el LED permanecerá apagado. ESQUEMA DE CONEXION +-----+ +----[PWR]-------------------| USB |--+ | +-----+ | | GND/RST2 [ ][ ] | | MOSI2/SCK2 [ ][ ] A5/SCL[ ] | | 5V/MISO2 [ ][ ] A4/SDA[ ] | | AREF[ ] | | GND[ ] | | [ ]N/C SCK/13[ ] | Pin "SCK" del módulo NRF24L01 | [ ]IOREF MISO/12[ ] | Pin "MISO" del módulo NRF24L01 | [ ]RST MOSI/11[ ]~| Pin "MOSI" del módulo NRF24L01 | [ ]3V3 +---+ 10[ ]~| Pin "CSN" del módulo NRF24L01 | [ ]5v -| A |- 9[ ]~| Pin "CE" del módulo NRF24L01 | [ ]GND -| R |- 8[ ] | | [ ]GND -| D |- | | [ ]Vin -| U |- 7[ ] | PA | -| I |- 6[ ]~| | [ ]A0 -| N |- 5[ ]~| | [ ]A1 -| O |- 4[ ] | | [ ]A2 +---+ INT1/3[ ]~| | [ ]A3 INT0/2[ ] | | [ ]A4/SDA RST SCK MISO TX>1[ ] | | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | | [ ] [ ] [ ] | | UNO_R3 GND MOSI 5V ____________/ \_______________________/ NOTAS: - Alimentación del módulo NRF24L01: - GND del módulo NRF24L01--> GND de Arduino. - VCC del módulo NRF24L01--> +3.3V de Arduino. - El pin "IRQ" del modulo NRF24L01 no se conecta a nuestro Arduino. - Los pulsadores suelen tener dos pines, que vamos a denominar PA y PB (si es de 4 sólo usamos 2 de ellos) - Conexión PULL-DOWN del pulsador. - PB conectado a VCC. - PA conectado a GND a través de una R=10K ohms. */ // Incluimos las librerías necesarias #include <SPI.h> // Librería para la comunicación SPI // Librerías para el funcionamiento del módulo NRF24L01 #include <nRF24L01.h> #include <RF24.h> // Declaramos los pines de control del módulo NRF24L01 #define CE 9 #define CSN 10 // Se crea el objeto tipo RF24 RF24 radio(CE, CSN); // Se declara el canal (64 bits en hexadecimal) para transmisión RF const uint64_t canal = 0xE8E8F0F0E1LL; // Variable que enviamos mediante RF (de tipo string siempre) unsigned int estado_pulsador[1]; int pulsador = 7; // Pin digital 7 para el pulsador // Inicializamos las variables internas para el pulsador int encender = 0; int anterior = 0; int estado = 0; void setup() { pinMode(pulsador, INPUT); // Pin digital del pulsador como entrada radio.begin(); // Inicialización de la comunicación RF radio.openWritingPipe(canal); // Se abre el canal para escritura } void loop() { estado = digitalRead(pulsador); // Guardamos el estado actual del pulsador if(estado && anterior == 0) // Comparamos el estado actual y el anterior del pulsador { encender = 1 - encender; delay(300); // Evita los posibles rebotes del pulsador. } anterior = estado; // Actualizamos el estado del pulsador. if(encender) // Si el estado interno del pulsador pasa de "LOW" a "HIGH". { estado_pulsador[0] = 1; // La variable vale 1 } else // Si el estado interno del pulsador pasa de "HIGH" a "LOW". { estado_pulsador[0] = 0; // La variable vale 0 } // Se envía el valor de la variable estado_pulsador[0] a través de RF radio.write(estado_pulsador, sizeof(estado_pulsador)); } |
Descarga del programa para el Emisor
Receptor NRF24L01
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
/* TITULO: Comunicación unidireccional entre Arduinos con módulos NRF24L01 >> NRF24L01_Unidireccional_Receptor AUTOR: MARIANO DEL CAMPO GARCÍA (@2016) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia - TWITTER: https://twitter.com/MarianoCampoGa - CORREO: [email protected] DESCRIPCIÓN DEL PROGRAMA Con este programa controlamos el encendido y apagado de un LED con un solo pulsador, mediante una conexión por radiofrecuencia (RF) entre dos Arduinos, a través de módulos NRF24L01. Vamos a recibir el valor de la variable estado_pulsador[0] vía RF desde el Arduino Emisor, cada vez que se presione el pulsador conectado a él, si esta variable tiene el valor de "1" se enciende el LED conectado a este Arduino (receptor) y si vale "0" el LED se apaga. En el supuesto de que nunca recibamos ningún valor de la variable estado_pulsador[0], el LED permanecerá apagado (no se ha presionado todavía el pulsador del Arduino Emisor). ESQUEMA DE CONEXION +-----+ +----[PWR]-------------------| USB |--+ | +-----+ | | GND/RST2 [ ][ ] | | MOSI2/SCK2 [ ][ ] A5/SCL[ ] | | 5V/MISO2 [ ][ ] A4/SDA[ ] | | AREF[ ] | | GND[ ] | | [ ]N/C SCK/13[ ] | Pin "SCK" del módulo NRF24L01 | [ ]IOREF MISO/12[ ] | Pin "MISO" del módulo NRF24L01 | [ ]RST MOSI/11[ ]~| Pin "MOSI" del módulo NRF24L01 | [ ]3V3 +---+ 10[ ]~| Pin "CSN" del módulo NRF24L01 | [ ]5v -| A |- 9[ ]~| Pin "CE" del módulo NRF24L01 | [ ]GND -| R |- 8[ ] | | [ ]GND -| D |- | | [ ]Vin -| U |- 7[ ] | LED(+) | -| I |- 6[ ]~| | [ ]A0 -| N |- 5[ ]~| | [ ]A1 -| O |- 4[ ] | | [ ]A2 +---+ INT1/3[ ]~| | [ ]A3 INT0/2[ ] | | [ ]A4/SDA RST SCK MISO TX>1[ ] | | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | | [ ] [ ] [ ] | | UNO_R3 GND MOSI 5V ____________/ \_______________________/ NOTAS: - Alimentación del módulo NRF24L01: - GND del módulo NRF24L01--> GND de Arduino. - VCC del módulo NRF24L01--> +3.3V de Arduino. - El pin "IRQ" del modulo NRF24L01 no se conecta a nuestro Arduino. - Cátodo(-) del LED (pata más corta) a GND a través de una R=220 ohms. */ // Incluimos las librerías necesarias #include <SPI.h> // Librería para la comunicación SPI // Librerías para el funcionamiento del módulo NRF24L01 #include <nRF24L01.h> #include <RF24.h> // Declaramos los pines de control del módulo NRF24L01 #define CE 9 #define CSN 10 // Se crea el objeto tipo RF24 RF24 radio(CE, CSN); // Se declara el canal (64 bits en hexadecimal) para transmisión RF const uint64_t canal = 0xE8E8F0F0E1LL; // Variable que enviamos mediante RF (de tipo string siempre) unsigned int estado_pulsador[1]; int LED = 7; // Pin digital 7 para el LED void setup() { radio.begin(); // Inicialización de la comunicación RF radio.openReadingPipe(1, canal); // Se abre el canal para lectura radio.startListening(); // Comienza a escuchar por el canal abierto para lectura pinMode(LED, OUTPUT); // Pin digital 7 como salida digitalWrite(LED, LOW); // Inicialmente el LED se apaga } void loop() { // Siempre que haya información disponible vía RF... while(radio.available()) { // Se recibe el valor de la variable estado_pulsador[0] a través de RF radio.read(estado_pulsador, sizeof(estado_pulsador)); } // Si el valor de la variable estado_pulsador[0] es igual a "1" se enciende el LED if (estado_pulsador[0] == 1) { digitalWrite(LED, HIGH); } // Si el valor de la variable estado_pulsador[0] es igual a "0" se apaga el LED if (estado_pulsador[0] == 0) { digitalWrite(LED, LOW); } } |
Descarga del programa para el Receptor
Video
Conclusión
En resumen, en este post se ha discutido cómo controlar el encendido y apagado de un LED mediante una conexión inalámbrica por radiofrecuencia (RF) entre dos Arduinos utilizando módulos NRF24L01. Se ha explicado cómo se envía y recibe información mediante RF, y cómo este proceso se utiliza para encender o apagar un LED conectado al Arduino Receptor.
Quiero agradecerle por leer este post y espero que haya encontrado útil e interesante la información proporcionada. Si tiene alguna pregunta o comentario, por favor no dude en compartirlo con nosotros. Estamos siempre dispuestos a ayudar y responder a cualquier pregunta.