lunes, 17 de octubre de 2016

Comunicación bidireccional entre Arduinos con módulos NRF24L01


En este POST realizaremos una comunicación bidireccional inalámbrica o “Duplex” por radiofrecuencia entre dos Arduinos, utilizando módulos NRF24L01, que como ya sabemos del POST anterior 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, que es el caso que nos ocupa en este momento. La conexión de los módulos NRF24L01 a los Arduino se hace mediante SPI como siempre, aunque para diferenciar la programación de cada Arduino, los vamos a distinguir llamándolos Arduino “A” y Arduino “B”. La conexión del Hardware va a ser idéntica para los dos Arduinos, es decir, debemos de conectar un pulsador PULL DOWN al pin digital 7 y al mismo tiempo un LED al pin digital 6 de cada Arduino.


Montaje del sistema de comunicación bidireccional RF

A la hora de programar los dos Arduino, al ser una comunicación bidireccional,  tenemos que declarar esta vez dos canales (const uint64_t canal[2] = {0xF0F0F0F0E1LL,0xF0F0F0F0D2LL};). Por el canal “0” que es por el que escribe el Arduino “A” tiene que leer el Arduino “B”, y en contraposición, por el canal “1” que es por donde escribe el Arduino “B” tiene que leer el Arduino “A” como se muestra a continuación.

Canales para el sistema bidireccional RF

Una cosa muy importante es darle tiempo a los módulos para que reciban y emitan con un pequeño delay(20), aunque no os preocupéis demasiado porque ya está todo incluido dentro de los programas a descargar. El programa de cada Arduino lo primero que hace es escuchar a través del canal correspondiente para ver si le está llegando información mediante RF, es decir, el valor del estado del pulsador del otro Arduino para que en función de ese valor se encienda o apague el LED que tiene conectado, una vez verificado esto se deja de escuchar por el canal para proceder a enviar el valor del pulsador al otro Arduino, repitiéndose todo esto cíclicamente dentro de la función void loop(). Para más información acerca del funcionamiento de los programas os recomiendo leer los comentarios realizados dentro de la programación.



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.

·         2 Pulsadores.

·         2 Resistencias de 10KΩ.

·         2 LED 5mm (de cualquier color).

·         2 Resistencias de 220Ω.

·         Fuente de alimentación de 12VDC/3000mA (DC12300).

·         Protoboard.

·         Cables de conexión.



Código del programa:

           NRF24L01_Bidireccional_A:





          NRF24L01_Bidireccional_B:




Video:

16 comentarios:

  1. Hola Mariano, gracias por su blog.
    Estoy realizando el montaje y logro subir los codigos a la placa correspondiente, también estoy alimentando los modulos RF24L01 a 3.5V externos a las placas de Arduino, pero al probar no obtengo ninguna respuesta. ¿Tendrá alguna sugerencia que me pueda brindar?
    Quedo atenta a su respuesta, saludos

    ResponderEliminar
    Respuestas
    1. Recuerda conectar los condensadores como se recomienda en el POST para eliminar el ruido. Por lo demás decirte que revises las conexiones. Saludos

      Eliminar
    2. hola, estoy leyendo lo del ruido pero donde tengo que conectar las pines del condensador?

      Eliminar
    3. Negativo a GND y positivo a VCC

      Eliminar
  2. Buenas noches yo arme, compile, puse los condensadores pero simplemente transmiten datos pero no reciben datos, no tiene algun otro programa similar de comunicación bidireccional ya que no me funciona aquella.

    ResponderEliminar
  3. Este comentario ha sido eliminado por un administrador del blog.

    ResponderEliminar
  4. Excelente lo voy a probar, y para los demas, si es simple, si no tienen los condensadores soldados en la pata GND y VCC no va funcionar correctamente, o directamente no funciona, asi de simple, yo siempre use los tipicos 10uF 25v, pero he puesto de 1uf y de 100uf y funcionan igual, asiq hay q ponerlos si o si.

    ResponderEliminar
  5. buenos dias, me gustaria saber como poder evitar el solapamiento de datos entre dos señales de dos arduino como emisor y y uno como receptor, he intentado aumentarle un poco el tiempo pero nada es como si el buffer del receptor se fuera llenando de los datos del otro, estuve pensando utilizar canales diferentes con la funcion setChannel pero no me sirvio, soy nuevo en el tema agradeceria mucho de antemano alguna ayuda

    ResponderEliminar
  6. Hola estoy haciendo el mismo proyecto y tu blog me sirvió de mucha ayuda pero ahí se envían números,como debería hacer si quisiera enviar palabras en vez de numeros,me podrías ayudar dándome un ejemplo gracias

    ResponderEliminar
  7. Buenos días y muchas gracias, justo lo que estaba buscando. Funciona perfectamente.

    ResponderEliminar
  8. Hola. En vez de pulsadores lo estoy usando con sensores PIR y funciona, a pesar de que uso un arduino uno y un arduino mega 2560, advirtiendo que para el arduino mega la conexión de los pines SCK, MISO y MOSI cambia de número. Gracias por el aporte Mariano

    ResponderEliminar
  9. Hola. Muy Bueno el ejemplo. Me sirvió muchisimo en mi proyecto. sinceramente FELICITACIONES!!! y GRACIAS.

    ResponderEliminar
  10. OLA, GOSTEI MUITO DESTE PROJETO, MAS NAO ENTENDI MUITO BEM ESTAS LINHAS DE CODIGO

    unsigned int estado_pulsador_A[1];

    unsigned int estado_pulsador_B[1];

    -PORQUE PULSADOR A E PULSADOR B ?

    OBRIGADO
    VICTOR.

    ResponderEliminar
  11. OLA, E PARA UM SEGUNDO PULSADOR E UM SEGUNDO LED,
    O QUE SE ACRESCENTA ?

    OBRIGADO,
    VICTOR.

    ResponderEliminar