Impulsa tus Proyectos Arduino con conexiones punto a punto: Conoce el nRF24L01

1. INTRODUCCIÓN

En este tutorial, nos embarcaremos en un viaje de descubrimiento mientras desentrañamos el potencial del versátil transceptor de radio nRF24L01. Te guiaremos paso a paso para programar este increíble dispositivo, tanto en su rol de emisor como de receptor. Además, aprenderás a enviar una trama de datos de manera precisa y efectiva. Al final de este tutorial, habrás adquirido habilidades valiosas que te permitirán explorar aún más las posibilidades de la comunicación inalámbrica en tus futuros proyectos.

2. NRF24L01

El nRF24L01 es un transceptor de radio de 2.4GHz fabricado por Nordic Semiconductor. Es ampliamente utilizado para la comunicación inalámbrica de corto alcance en proyectos de electrónica y robótica. Aquí están algunas de sus características principales:

  1. Frecuencia de operación: El nRF24L01 trabaja en la banda de 2.4GHz ISM (Industrial, Scientific, and Medical), que es una banda de frecuencia de radio reservada internacionalmente para usos industriales, científicos y médicos.

  2. Comunicación multi-canal: El nRF24L01 soporta hasta 125 canales de frecuencia, lo que permite a varios dispositivos trabajar en la misma área sin interferirse entre sí.

  3. Capacidad multi-punto: Es compatible con un diseño de red de estrella, lo que significa que un transceptor puede comunicarse con hasta otros seis a la vez.

  4. Tamaño de carga útil: Puede transmitir y recibir datos de hasta 32 bytes a la vez.

En resumen, el nRF24L01 es una solución versátil y de bajo consumo para la comunicación inalámbrica en una variedad de aplicaciones de electrónica.

El datasheet completo lo puedes descargar aquí.

3. USO EN ARDUINO

3.1 Hardware necesario: 

  • Dos placas Arduino
  • Dos módulos de radio nRF24L01
  • Cables jumper
  •  

    3.2 Diagrama

    Las conexiones necesarias para usar este dispositivo como emisor o receptor estan descritas en el siguiente diagrama.

    También puedes descargar el diagrama esquemático.

    3.3 Librería

    El primer paso es agregar la librería RF24 al IDE de Arduino, para esto vamos a Sketch>Include Library>Manage Libraries>RF24, la instalamos y reiniciamos el IDE.

    libreria RF24

    3.4 Código

    Programaremos el transmisor e iremos explicando cada parte.

    Importación de bibliotecas: Se importa la biblioteca SPI, necesaria para la comunicación entre el microcontrolador y el módulo nRF24L01. También se importa la biblioteca RF24, que facilita el uso del módulo nRF24L01.

    #include <SPI.h>
    #include "RF24.h"

    Definición de pines: Se definen los pines CE y CSN.

    #define CE_PIN 7
    #define CSN_PIN 8

    Creación de la instancia del radio: Se crea una instancia de la clase RF24, que se utiliza para interactuar con el módulo.

    RF24 radio(CE_PIN, CSN_PIN);

    Definición de la carga útil: Se define text, que es la cadena de caracteres que se enviará a través del módulo.

    char text[] = "HOLA";

    Definición de direcciones: Se define una matriz llamada address que contiene dos elementos, "1Node" y "2Node". Estos elementos representan las direcciones únicas de los canales de comunicación (también conocidos como 'pipes') que se utilizarán para la transmisión y recepción de datos. También se define una variable booleana radioNumber que se utiliza para seleccionar una de estas direcciones.

    uint8_t address[][6] = { "1Node", "2Node" };
    bool radioNumber = 0;

    En este caso, radioNumber está inicializado como 0, por lo que address[radioNumber] seleccionara "1Node".

    Configuración inicial: En la función setup(), se realizan varias operaciones importantes:

  • radio.begin(); Inicializa el módulo nRF24L01. Esta función debe ser llamada antes de realizar cualquier otra operación con el módulo.
  • SIZE = sizeof(text); Calcula el tamaño de los datos (text) que se van a transmitir. sizeof es una función integrada en C++ que devuelve el tamaño en bytes del objeto o tipo de datos proporcionado.
  • radio.setPayloadSize(4); Establece el tamaño de la carga útil (payload) que se va a transmitir. En este caso, se establece a 4, que es el número de caracteres en la cadena "HOLA".
  • radio.openWritingPipe(address[radioNumber]); Abre el canal de comunicación para la transmisión de datos. Aquí, se utiliza address[radioNumber] para seleccionar la dirección del canal.
  • radio.stopListening(); Pone el módulo nRF24L01 en modo de transmisión. Es necesario llamar a esta función antes de poder transmitir datos.
  •  

     Bucle principal: En la función loop(), que se ejecuta indefinidamente en el programa de Arduino, se realiza la transmisión de los datos:

    • radio.write(&text, SIZE); Envia los datos al dispositivo de destino. Aquí, &text es un puntero al inicio de los datos que se van a transmitir, y SIZE es la cantidad de datos que se van a transmitir.
    • delay(100);: Esta función crea un retardo de 100 milisegundos antes de la siguiente iteración del bucle. Esto significa que los datos se transmiten cada 100 milisegundos.

    A continuación se muestra el código completo: 

    Código

    Para programar el receptor se importan las mismas librerías , los pines, la instancia del radio y la definición de las direcciones, con la diferencia de la dirección del radio.

    bool radioNumber = 1;
    En la función setup() se configura lo siguiente:
    • Serial.begin(9600); Inicia la comunicación serial a 9600 baudios. Esto se hace para permitir la depuración y la visualización de la salida del programa en el Monitor Serial del IDE de Arduino.
    • radio.begin(); Inicia el módulo de radio nRF24L01. Esta función debe ser llamada antes de que puedas realizar cualquier otra operación con el módulo de radio.
    • radio.setPayloadSize(4); Establece el tamaño de la carga útil (payload) que el módulo de radio recibirá. En este caso, se establece a 4, lo que significa que está configurado para recibir 4 bytes de datos a la vez.
    • radio.openReadingPipe(1,address[!radioNumber]); Abre un canal de comunicación ("pipe") para recibir datos. El primer argumento 1 es el número del pipe. El módulo de radio nRF24L01 puede tener hasta 6 pipes para recibir datos, numerados del 1 al 6. El segundo argumento address[!radioNumber] es la dirección del pipe. Aquí, address es una matriz que contiene las direcciones de los pipes y radioNumber es un índice para seleccionar una dirección de esa matriz.
    • radio.startListening(); Pone el módulo de radio en modo de recepción. Después de llamar a esta función, el módulo estará preparado para recibir datos.

    Y en la función void se hace lo siguiente:

    • uint8_t pipe; Esta variable se utilizará para almacenar el número del pipe (canal de comunicación) por el que se reciben los datos.
    • if (radio.available(&pipe))  Esta línea comprueba si hay datos disponibles para ser leídos en el módulo de radio. Si hay datos disponibles, radio.available(&pipe) devuelve true y el código dentro del bloque if se ejecutará. La función radio.available también actualiza la variable pipe con el número del pipe que tiene datos disponibles.
    • radio.read(&text,radio.getPayloadSize()); Si hay datos disponibles, esta línea lee los datos en la carga útil. &text es un puntero al lugar donde se almacenarán los datos leídos (en este caso, se supone que text es una variable definida previamente que puede almacenar la carga útil) y radio.getPayloadSize() devuelve el tamaño de la carga útil recibida.
    • Serial.println(text); Esta línea imprime los datos recibidos en el Monitor Serial del IDE de Arduino. Esto se hace generalmente para fines de depuración y/o para verificar que los datos se reciben correctamente.
    • delay(50); Esta línea hace que el programa se detenga por 50 milisegundos. 

    El código completo queda así:

     Código

    4. Resultados

    Una vez subido el programa a los dos arduinos empieza la comunicación y podemos ver en el monitor serial del receptor el mensaje "HOLA".

    5. Conclusión 

    El nRF24L01 es un dispositivo de comunicación inalámbrica verdaderamente excepcional que se destaca por su facilidad de integración, bajo consumo y amplio rango de alcance. Sus características únicas hacen de este módulo una herramienta invaluable para establecer enlaces de comunicación punto a punto de manera eficiente y efectiva.

    Esperamos que este tutorial sobre el nRF24L01 te brinde una base sólida para explorar aún más las posibilidades de este módulo. El objetivo no es solo que aprendas a utilizar este dispositivo, sino que adquieras el conocimiento y la confianza para incorporarlo en tus propios proyectos.

    Ya sea que estés buscando establecer comunicaciones entre varios dispositivos, crear un sistema de sensores inalámbricos, o incluso construir tu propio robot controlado de forma remota, el nRF24L01 tiene el potencial de ser un componente esencial en tu caja de herramientas de electrónica.

    Productos Relacionados

    Ver artículo

    Ver artículo

    Ver artículo

    ArduinoRadio

    Deja un comentario