jueves, 13 de octubre de 2016

Comunicación unidireccional entre Arduinos con módulos NRF24L01


En este POST realizaremos una comunicación unidireccional inalámbrica por radiofrecuencia entre dos Arduinos, utilizando módulos NRF24L01, cuyo funcionamiento está basado en el chip de Nordic semiconductor  NRF24, se pueden alimentan con la salida de 3.3V de nuestro Arduino, tienen muy bajo consumo, se comunican muy rápido y los podemos adquirir por muy poco dinero, que es lo que realmente nos interesa. 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.

Estos módulos son TRANCEPTORES, es decir mediante programación los podemos configurar como emisores o como receptores o configurarlos para que realicen ambas funciones, lo que les convierte en una de las mejores soluciones para realizar comunicaciones inalámbricas, ya sea para domótica, robótica, o lo que se os pueda ocurrir (juguetes, controles remotos, periféricos inalámbricos....). En el mercado existen varios modelos de módulos NRF24L01, de diferentes fabricantes, aunque siempre compatibles entre sí. Todos ellos operan en la banda de 2.4GHz, que es una banda libre de radiofrecuencia, por lo que no requieren de ningún permiso para usarse en ninguna parte del mundo, pero en contra, no tenemos garantía de que no haya alguien más emitiendo en esta banda en las cercanías, lo que puede producir interferencias en nuestra emisiones. Existe un modelo más completo, que aparte del NRF24L01 posee un circuito amplificador de potencia (PA), un circuito amplificador de bajo ruido (LNA) además de una antena SMA que en conjunto le permiten lograr un rango de hasta 1 Km (no os preocupéis demasiado que ya los analizaremos más a fondo en posteriores POST).

Módulo NRF24L01 básico

La distancia o alcance entre módulos NRF24L01 dependerá del modelo que están usando y del lugar en donde están trabajando, si hay muros, ruido, o si están en lugares abiertos. El módulo NRF24L01 con el que vamos a trabajar es el más básico, con un alcance aproximado del orden de una señal WIFI, es decir, por debajo de los 100 metros en espacios abiertos. Aunque estos módulos consumen muy poco cuando estamos trabajando con ellos (Stand By), pueden llegar a absorber en el arranque más de lo que la fuente de 3.3V de Arduino puede proporcionar, lo que impide que arranquen correctamente o que tengan un mal funcionamiento, especialmente en el caso del emisor. Esto lo podemos solucionar fácilmente alimentando los Arduinos mediante una batería de 12VDC/3000mA (fuente de alimentación externa) que administre a nuestros Arduinos una corriente suficiente en todos sus terminales. Además, para eliminar el ruido eléctrico, que en muchos casos hace que nuestros módulos NRF24L01 no funcionen, debemos de conectar un condensador electrolítico de 10µF entre VCC y GND de cada módulo (personalmente me volví loco hasta que conseguí que me funcionaran por este motivo). A continuación os muestro una tabla donde se puede ver la correspondencia de los pines de conexión del NRF24L01 a nuestro Arduino UNO.

Tabla de conexiones del módulo NRF24L01

Para la realización del programa he utilizado las librerías y que podéis descargar en el este enlace . Una vez descargadas las debéis de importar al IDE de Arduino,  para después cerrarlo y volverlo a abrir para que se carguen correctamente. Los pines CE y CSN son programables, es decir, les podemos configurar a nuestro antojo (RF24 radio(9,10)), en cambio el resto de los pines deben ser respetados puesto que son los que nuestro Arduino UNO tiene predeterminados para la comunicación SPI. Además debemos de subir a cada Arduino el programa correspondiente teniendo en cuenta la función que tiene que realizar, es decir, si se comporta como Emisor (tiene que tener un pulsador con conexión PULL-DOWN en su pin digital 7) o como Receptor (tiene que tener conectado un LED, a través de una resistencia limitadora de tensión de 220Ω, en su pin digital 7). 

Montaje del sistema de comunicación unidireccional RF

Con los programas que podemos descargar en este POST, 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 conectado al Arduino Emisor, 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 continuamente, para que se encienda o apague un LED conectado al Arduino Receptor, que es el que obtiene a través de RF el valor de la variable estado_pulsador[0]. Cuando la variable estado_pulsador[0] vale  "1", se enciende el LED conectado al Arduino (receptor), y si vale "0",  el LED se apaga. En el supuesto de que nunca presionemos el pulsador del Arduino Emisor, no se enviará ningún valor mediante RF y como consecuencia el LED conectado al Arduino Receptor permanecerá apagado. Para una mayor información os recomiendo echar un vistazo a los comentarios realizados dentro de 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:





          Receptor NRF24L01 :




Video:


8 comentarios:

  1. Hola Mariano
    Descargué los códigos que publicaste y me funcionaron a la primera, la comunicación es muy estable y los módulos nRF24L01 son sorprendentes. Me gusta que la respuesta del sistema es muy rápida y no tienen los problemas de rebote que pueden surgir en los pulsadores. Hasta el momento no he necesitado el condensador que sugieres para eliminar el ruido eléctrico y los módulos los tengo alimentados con los 3.3 Voltios que proporciona el arduino, no he necesitado fuente externa de 3.3 V.

    Para complementar tu información con mi experiencia práctica puedo comentarte que el receptor lo monté igual que tu con un "arduino uno" y el transmisor con un "arduino nano" con la misma configuración de pines y sin necesidad de modificar el código. Los dos arduinos los he alimentado por la entrada USB cada uno con una bateria externa tipo "power bank" (las que se usan para los celulares) de 2200 mAH y funcionan muy bien, esto me permite movilidad.
    En cuanto al alcance al receptor en vez de led le conecté una tarjeta de relés para poder activar una lampara que hice con unas tiras de leds que funcionan a 12 VDC y de esta manera poder visualizar la respuesta, todo el conjunto lo ubiqué en el balcón del apartamento en un cuarto piso y con el transmisor me fui alejando hasta que no tuve mas espacio dándome un alcance superior a 300 mts (medido con google maps) y con la comunicación perfectamente estable, yo creo que tenía para mucho mas alcance. Esta prueba la hice con los módulos que tienen la antena externa que son mas potentes, después al transmisor le cambié el modulo por el básico que muestras en la foto y el video, dejando el receptor con el modulo de antena externa. Las pruebas con esta configuración me dieron casi los mismos 300 mts. de aclance pero era mas sensible a la linea de vista.
    Esta pequeña experimentación la hice porque estoy montando el control de una maquina a distancia y lo que publicaste es justo lo que necesito, con tu permiso voy a tomar el código como punto de partida para mi aplicación, espero no te moleste. Gracias, y felicitaciones por tu blog que tiene una información muy clara y precisa de cada uno de los proyectos que publicas.

    ResponderEliminar
  2. Hola Mariano. Muy bueno el tutorial. Quisiera realizarte una consulta. Necesito conectar varios arduinos. Uno que les hable a los demas, y que luego escuche las respuestas de ellos, de a uno por vez. Pero no termino de saber como realizarlo en código, se me hace lio con las direcciones. Si podes darme una mano con esto, te lo agradeceria muchisimo.
    Saludos,
    Sebastian

    ResponderEliminar
  3. Como podria hacer una comunicacion entre arduinos con mas distancia entre 400 a 600 mts se puede ?

    ResponderEliminar
  4. Hola buenas tardes como puedo lograr adaptar este codigo para mas de un boton y por supuesto mas de un led, quiero decir...

    Boton 1 prendera led 1
    boton 2 prendera led 2
    boton 3 prendera led 3
    etc etc etc


    Es posible? desde ya muchas gracias.

    ResponderEliminar
  5. nada no me funcionan de momento la parte que no entiendo es la del pulsador por mas que amplifico la foto no alcanzo a distingir las conexiones ya lo solucionare muchas gracias

    ResponderEliminar
  6. Hola, yo he hecho funcionar a la primera el proyecto, incluso le he puesto una power-bank y me he alejado bastante con paredes e incluso un segundo piso de por medio y sin antena. Solo tengo un problema, si me quedo quieto sin hacer nada a los pocos minutos (5 o 10 no se en que momento falla) deja de funcionar, como si entraran en modo sleep (por mucho que le des a los pulsadores tanto del A como del B, los leds no se encienden). He estado mirando el código pero no veo el problema o lo paso por alto, si me dan una manita, me orientan o me indican que otra cosa podría ser.

    Por cierto, lo he implementado en 2 arduino Nano.

    ResponderEliminar