Comunicación inalámbrica mediante módulos NRF24L01 en modo maestro-esclavo

Transmisión de mensajes entre un módulo maestro y tres módulos esclavos mediante NRF24L01

...
Posteado por Aviles el 11-06-2024 a las 22:51
Categoria: Arduino
Realizado por: Jose Francisco Cat Aviles, Alejandro Yáñez Alvarado

Presentación.

Este proyecto trata sobre como establecer una comunicación entre un módulo maestro y tres módulos esclavos utilizando el transceptor inalámbrico NRF24L01. El módulo maestro actúa como el control central, enviando y recibiendo mensajes a los módulos esclavos, que funcionan como dispositivos remotos. Esta comunicación inalámbrica permite la transmisión de datos y comandos en tiempo real, lo que resulta especialmente útil en aplicaciones de control remoto, monitoreo o automatización donde se requiere coordinación entre múltiples dispositivos.

Funcionamiento.

Enviaremos un mensaje por la terminal desde el modulo “maestro” el cual enviará una señal a todos los “esclavos” y dependiendo del mensaje/señal que el maestro mande, el esclavo responderá diciendo que es el módulo correcto.

Realización.

Materiales necesarios para poder ensamblar el proyecto:

  • 4 Módulos NRF24L01
  • Cables dupont
  • 4 Arduino UNO
  • 4 Protoboards

Como primer paso conectaremos los módulos NRF24L01 a los Arduinos UNO, cada modulo va conectado a un Arduino Uno como se muestra a continuación:

NRF24L01

Arduino UNO

CE

9

C5N

10

5CK

13

MOSI

11

MISO

12

VCC

3.3v

GND

GND

En la siguiente imagen se muestra donde se ubica cada pin del modulo NRF24L01

Nos quedaría de la siguiente manera:

La conexion final de los 4 modulos quedaria de la siguiente manera:

 

Programación.

Primero debemos descargar e instalar la librería RF24:

Una vez instalado la libreria prodemos a codificar el funcionamiento de los modulos:

CÓDIGO DEL MODULO MAESTRO

#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>

#include <SPI.h>

const uint64_t pipe2 = 0xE8E8F0F0E2LL; // Dirección del primer canal de comunicación
const uint64_t pipe3 = 0xE8E8F0F0E3LL; // Dirección del segundo canal de comunicación

const int pinCE = 9;
const int pinCSN = 10;

RF24 radio(pinCE, pinCSN);

char data[32];

void setup()
{
  Serial.begin(9600);
  radio.begin();

  //set the address
  radio.openReadingPipe(1, pipe2);

  radio.setPALevel(RF24_PA_HIGH);
  radio.setDataRate(RF24_2MBPS);

  //Set module as transmitter
  radio.stopListening();
}
void loop(){
  if (Serial.available()) {
    String miString = Serial.readStringUntil('
');
    Serial.println("Mi mensaje: " + miString);
    //Serial.println(miString);

    if (miString != "") {
      strncpy(data, miString.c_str(), sizeof(data)); // Copiar el contenido del string al arreglo
      radio.stopListening();
      radio.openWritingPipe(pipe3);
      radio.write(data, sizeof(data));
      radio.startListening();
    }
  }
  if (radio.available()) {
    radio.read(data, sizeof(data));
    Serial.println("Esclavo: " + String(data));
    radio.stopListening();
  }
}

CÓDIGO DEL MODULO ESCLAVO "A"

#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>

#include <SPI.h>

const uint64_t pipe2 = 0xE8E8F0F0E2LL; // Dirección del primer canal de comunicación
const uint64_t pipe3 = 0xE8E8F0F0E3LL; // Dirección del segundo canal de comunicación

const int pinCE = 9;
const int pinCSN = 10;

RF24 radio(pinCE, pinCSN);

char data[32];

void setup()
{
  Serial.begin(9600);

  radio.begin();

  //set the address
  radio.openReadingPipe(1, pipe3);
  radio.setPALevel(RF24_PA_HIGH);
  radio.setDataRate(RF24_2MBPS);

  //Set module as receiver
  radio.startListening();
}

void loop() {

  if (radio.available()) {
    radio.read(data, sizeof(data));
    Serial.println("maestro: " + String(data));
    radio.stopListening();
    if (String(data) == "a") {
      char text[] = "SOY A";
      radio.stopListening();
      radio.openWritingPipe(pipe2);
      radio.write(text, sizeof(text));
      Serial.println("Mi mensaje: " + String(text));
    }
    radio.startListening();
  }
}

CÓDIGO DEL MODULO ESCLAVO "B"

#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>

#include <SPI.h>

const uint64_t pipe2 = 0xE8E8F0F0E2LL; // Dirección del primer canal de comunicación
const uint64_t pipe3 = 0xE8E8F0F0E3LL; // Dirección del segundo canal de comunicación

const int pinCE = 9;
const int pinCSN = 10;

RF24 radio(pinCE, pinCSN);

char data[32];

void setup()
{
  Serial.begin(9600);

  radio.begin();

  //set the address
  radio.openReadingPipe(1, pipe3);
  radio.setPALevel(RF24_PA_HIGH);
  radio.setDataRate(RF24_2MBPS);

  //Set module as receiver
  radio.startListening();
}

void loop() {

  if (radio.available()) {
    radio.read(data, sizeof(data));
    Serial.println("maestro: " + String(data));
    radio.stopListening();
    if (String(data) == "b") {
      char text[] = "SOY B";
      radio.stopListening();
      radio.openWritingPipe(pipe2);
      radio.write(text, sizeof(text));
      Serial.println("Mi mensaje: " + String(text));
    }
    radio.startListening();
  }
}

CÓDIGO DEL MODULO ESCLAVO "C"

#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>

#include <SPI.h>

const uint64_t pipe2 = 0xE8E8F0F0E2LL; // Dirección del primer canal de comunicación
const uint64_t pipe3 = 0xE8E8F0F0E3LL; // Dirección del segundo canal de comunicación

const int pinCE = 9;
const int pinCSN = 10;

RF24 radio(pinCE, pinCSN);

char data[32];

void setup()
{
  Serial.begin(9600);

  radio.begin();

  //set the address
  radio.openReadingPipe(1, pipe3);
  radio.setPALevel(RF24_PA_HIGH);
  radio.setDataRate(RF24_2MBPS);

  //Set module as receiver
  radio.startListening();
}

void loop() {

  if (radio.available()) {
    radio.read(data, sizeof(data));
    Serial.println("maestro: " + String(data));
    radio.stopListening();
    if (String(data) == "c") {
      char text[] = "SOY C";
      radio.stopListening();
      radio.openWritingPipe(pipe2);
      radio.write(text, sizeof(text));
      Serial.println("Mi mensaje: " + String(text));
    }
    radio.startListening();
  }
}

 

Explicación del código

En el codigo del maestro y esclavo se declaran las librerias que se van a utilizar y se definen las direcciones de los canales de comunicación (pipes) y los pines a los que están conectados los pines CE y CSN del módulo NRF24L01. También se instancia un objeto RF24 llamado radio con los pines especificados y se define un arreglo de caracteres data para almacenar los datos recibidos.

Maestro:

Configuración inicial en la función setup():

En esta función se inicializan el puerto serial para la comunicación con la computadora, se inicia la comunicación con el módulo NRF24L01, se configura un pipe de lectura con la dirección pipe2, se establece la potencia de transmisión a alta (RF24_PA_HIGH) y se configura la tasa de transferencia de datos a 2 Mbps. Por último, se coloca el módulo en modo de transmisión (stopListening()).

Bucle principal en la función loop():

En este bucle principal, el programa primero verifica si hay datos disponibles en el puerto serial. Si los hay, lee el mensaje enviado por el usuario, lo almacena en data y luego lo transmite a través del pipe 3. Después, el programa verifica si hay datos disponibles en el módulo NRF24L01. Si los hay, lee los datos recibidos, los almacena en data y los imprime en el puerto serial como "Esclavo: " seguido del mensaje recibido.

Esclavo

Configuración inicial en la función setup():

En esta función se inicializan el puerto serial para la comunicación con la computadora, se inicia la comunicación con el módulo NRF24L01, se configura un pipe de lectura con la dirección pipe3, se establece la potencia de transmisión a alta (RF24_PA_HIGH) y se configura la tasa de transferencia de datos a 2 Mbps. Por último, se coloca el módulo en modo de escucha (startListening()).

Bucle principal en la función loop():

En este bucle principal, el programa verifica si hay datos disponibles para leer en el módulo NRF24L01. Si hay datos disponibles, se leen en el arreglo data, se imprime en el puerto serial y luego se detiene la escucha para enviar una respuesta si el dato recibido es "c". Si el dato recibido es "c", se envía el mensaje "SOY C" al otro extremo de la comunicación a través del pipe 2. Una vez que se envía la respuesta, se vuelve a iniciar la escucha.

Utilización.

Abrimos el IDE de arduino y seleccionamos el puerto del Arduino Uno y abrimos el monitor serial para enviar mensaje

Al enviar la letra "a"  el modulo que fue asginado con esa letra nos responde, lo mismo sucede con la letra "b" y "c". Si se envia una letra diferente de "a", "b" ò "c" no se obtiene ninguna respuesta por parte de los modulos ya que no estan asignados.

Conclusiones.

Alejandro: En conclusión, este proyecto me deja ver lo que Arduino puede hacer con los módulos NRF24L01 y la terminal como medio de comunicación y cómo podemos establecer una comunicación bidireccional de manera tan “sencilla”. Esto nos abre un mundo de posibilidades para desarrollar proyectos de control remoto, monitoreo y mensajería en tiempo real, lo cual es emocionante dentro de lo que cabe.

Aviles: En resumen, este proyecto en Arduino nos muestra cómo podemos lograr una comunicación bidireccional con los módulos NRF24L01 y la terminal, ya que como comentábamos, no solo lo podemos enfocar a la comunicación, sino a otros proyectos mas grandes y con una mayor usabilidad.

Referencias.

Ecarletti. (s. f.). Arduino: Comunicación inalámbrica con NRF24L01 | Robots Didácticos. Recuperado 18 de abril de 2024, de https://robots-argentina.com.ar/didactica/arduino-comunicacion-inalambrica-con-nrf24l01/

Redacción. (2020, 17 abril). Cómo funciona el módulo inalámbrico NRF24L01 y su interfaz con Arduino. descubrearduino. Recuperado 18 de abril de 2024, de https://descubrearduino.com/nrf24l01/

Para comentar debes acceder Acceder

Comentarios


No hay comentarios en este post