Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

nRF24L01 - Cómo funciona, interfaz Arduino, circuitos, códigos

En este tutorial aprenderemos a hacer comunicación inalámbrica entre dos placas Arduino usando el nRF24L01 módulos transceptores. El módulo nRF24L01 es una opción muy popular para la comunicación inalámbrica cuando se utiliza Arduino.

Ya he usado este módulo para numerosos proyectos de Arduino y puedes ver algunos de ellos aquí:

Puede ver el siguiente video o leer el tutorial escrito a continuación. Incluye todo lo que necesitamos saber sobre el módulo transceptor nRF24L01, como el pinout del módulo, el principio de funcionamiento, el cableado y varios ejemplos de código.

Resumen

Para explicar la comunicación inalámbrica haremos dos ejemplos, el primero será enviar un mensaje simple de "Hola mundo" de un Arduino a otro, y en el segundo ejemplo tendremos una comunicación bidireccional entre las placas Arduino, donde usando con el Joystick en el primer Arduino controlaremos el servomotor en el segundo Arduino, y viceversa, utilizando el pulsador en el segundo Arduino controlaremos el LED en el primer Arduino.

Módulo transceptor nRF24L01

Echemos un vistazo más de cerca al módulo transceptor NRF24L01. Utiliza la banda de 2,4 GHz y puede operar con velocidades de transmisión desde 250 kbps hasta 2 Mbps. Si se usa en espacios abiertos y con una tasa de baudios más baja, su alcance puede alcanzar hasta 100 metros.

Aquí están las especificaciones completas:

Rango de frecuencia 2,4 - Banda ISM de 2,5 GHz
Velocidades de datos 250Kbps / 1Mbps / 2Mbps
Máx. potencia de salida 0dBm
Tensión de funcionamiento 1.9 – 3.6V
Máx. corriente de funcionamiento 12.3mA
Actual en espera 22µA
Entradas lógicas tolerancia a 5V
Rango de comunicación 100m (espacio abierto)

Cómo funciona

El módulo puede usar 125 canales diferentes, lo que brinda la posibilidad de tener una red de 125 módems que funcionan de forma independiente en un solo lugar. Cada canal puede tener hasta 6 direcciones, o cada unidad puede comunicarse con hasta 6 otras unidades al mismo tiempo.

El consumo de energía de este módulo es de alrededor de 12 mA durante la transmisión, que es incluso más bajo que un solo LED. El voltaje de funcionamiento del módulo es de 1,9 a 3,6 V, pero lo bueno es que los otros pines toleran una lógica de 5 V, por lo que podemos conectarlo fácilmente a un Arduino sin usar ningún convertidor de nivel lógico.

Tres de estos pines son para la comunicación SPI y deben conectarse a los pines SPI del Arduino, pero tenga en cuenta que cada placa Arduino tiene diferentes pines SPI. Los pines CSN y CE se pueden conectar a cualquier pin digital de la placa Arduino y se utilizan para configurar el módulo en modo de espera o activo, así como para cambiar entre modo de transmisión o comando. El último pin es un pin de interrupción que no tiene que usarse.

Variaciones del módulo

Hay varias variaciones de los módulos NRF24L01. El más popular es el que tiene antena integrada. Esto hace que el módulo sea más compacto, pero por otro lado, reduce el rango de transmisión a una distancia de unos 100 metros.

La segunda variación, en lugar de antena integrada, tiene un conector SMA y a la que podemos conectar una antena de pato para un mejor rango de transmisión.

La tercera variación que se muestra aquí, además de la antena de pato, tiene un chip RFX2401C que incluye PA (amplificador de potencia) y LNA (Amplificador de bajo ruido). Esto amplifica la señal NRF24L01 y permite un rango de transmisión aún mejor de hasta 1000 metros en espacios abiertos.

Distribución de pines del módulo nRF24L01

Aquí hay una vista detallada del pinout NRF24L01, así como del módulo NRF24L01+ PA/LNA.

Ambos módulos, el NRF24L01 y el NRF24L01+ PA/LNA tienen el mismo pinout, por lo que podemos conectarlos en nuestro circuito de la misma forma.

Cómo conectar el nRF24L01 a Arduino

Así es como necesitamos conectar los módulos NRF24L01 a las placas Arduino.

Como ya mencioné, cada placa Arduino tiene diferentes pines SPI, así que tenlo en cuenta cuando conectes los módulos a tu placa Arduino.

Arduino SCK MISO MOSI SS
Uno 13 12 11 10
Nano 13 12 11 10
Mega 52 50 51 53

Puede obtener los componentes necesarios para este tutorial de Arduino desde los siguientes enlaces:

  • Módulo transceptor NRF24L01………
  • Placa Arduino ………………………………
  • Protoboard y cables de salto ………… 

Código Arduino y nRF24L01

Una vez que conectamos los módulos NRF24L01 a las placas Arduino, estamos listos para hacer los códigos tanto para el transmisor como para el receptor.

Primero necesitamos descargar e instalar la biblioteca RF24, lo que hace que la programación sea menos difícil. También podemos instalar esta biblioteca directamente desde Arduino IDE Library Manager. Simplemente busque "rf24" y busque e instale el de "TMRh20, Avamander".

Aquí están los dos códigos para la comunicación inalámbrica y debajo está la descripción de ellos.

Código del transmisor

/*
* Arduino Wireless Communication Tutorial
*     Example 1 - Transmitter Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

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

RF24 radio(7, 8); // CE, CSN

const byte address[6] = "00001";

void setup() {
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

void loop() {
  const char text[] = "Hello World";
  radio.write(&text, sizeof(text));
  delay(1000);
}Code language: Arduino (arduino)

Código del receptor

/*
* Arduino Wireless Communication Tutorial
*       Example 1 - Receiver Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

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

RF24 radio(7, 8); // CE, CSN

const byte address[6] = "00001";

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}

void loop() {
  if (radio.available()) {
    char text[32] = "";
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }
}Code language: Arduino (arduino)

Código Descripción

Por lo tanto, debemos incluir el SPI básico y las bibliotecas RF24 recién instaladas y crear un objeto RF24. Los dos argumentos aquí son los pines CSN y CE.

RF24 radio(7, 8); // CE, CSNCode language: Arduino (arduino)

A continuación, debemos crear una matriz de bytes que representará la dirección, o el llamado canal a través del cual se comunicarán los dos módulos.

const byte address[6] = "00001";Code language: Arduino (arduino)

Podemos cambiar el valor de esta dirección a cualquier cadena de 5 letras y esto permite elegir con qué receptor hablaremos, por lo que en nuestro caso tendremos la misma dirección tanto en el receptor como en el transmisor.

En la sección de configuración, debemos inicializar el objeto de radio y, mediante la función radio.openWritingPipe(), configuramos la dirección del receptor al que enviaremos los datos, la cadena de 5 letras que configuramos previamente.

radio.openWritingPipe(address);Code language: Arduino (arduino)

Por otro lado, en el receptor, usando la función radio.setReadingPipe() configuramos la misma dirección y de esa forma habilitamos la comunicación entre los dos módulos.

radio.openReadingPipe(0, address);Code language: Arduino (arduino)

Luego, usando la función radio.setPALevel(), establecemos el nivel del amplificador de potencia, en nuestro caso, lo configuraré al mínimo ya que mis módulos están muy cerca uno del otro.

radio.setPALevel(RF24_PA_MIN);Code language: Arduino (arduino)

Tenga en cuenta que si usa un nivel más alto, se recomienda usar condensadores de derivación a través de GND y 3,3 V de los módulos para que tengan un voltaje más estable mientras funcionan.

A continuación tenemos la función radio.stopListening() que establece el módulo como transmisor y, por otro lado, tenemos la función radio.startListening() que establece el módulo como receptor.

// at the Transmitter
radio.stopListening();Code language: Arduino (arduino)
// at the Receiver
radio.startListening();Code language: Arduino (arduino)

En la sección de bucle, en el transmisor, creamos una matriz de caracteres a los que asignamos el mensaje "Hola mundo". Usando la función radio.write() enviaremos ese mensaje al receptor. El primer argumento aquí es la variable que queremos que se envíe.

void loop() {
 const char text[] = "Hello World";
 radio.write(&text, sizeof(text));
 delay(1000);
}Code language: Arduino (arduino)

Al usar el “&” antes del nombre de la variable, en realidad establecemos una indicación de la variable que almacena los datos que queremos enviar y, al usar el segundo argumento, establecemos la cantidad de bytes que queremos tomar de esa variable. En este caso, la función sizeof() obtiene todos los bytes de las cadenas "texto". Al final del programa añadiremos 1 segundo de retraso.

Usando la función radio.write() podemos enviar un máximo de 32 bytes a la vez.

Por otro lado, en el receptor, en la sección de bucle usando la función radio.available() verificamos si hay datos para recibir. Si eso es cierto, primero creamos una matriz de 32 elementos, llamada "texto", en la que guardaremos los datos entrantes.

void loop() {
  if (radio.available()) {
    char text[32] = "";
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }
}Code language: Arduino (arduino)

Usando la función radion.read() leemos y almacenamos los datos en la variable "texto". Al final solo imprimimos texto en el monitor serial. Entonces, una vez que cargamos ambos programas, podemos ejecutar el monitor en serie en el receptor y notaremos que el mensaje "Hello World" se imprime cada segundo.

Resolución de problemas

Vale la pena señalar que el ruido de la fuente de alimentación es uno de los problemas más comunes que experimentan las personas cuando intentan establecer una comunicación exitosa con los módulos NRF24L01. En general, los circuitos de RF o las señales de radiofrecuencia son sensibles al ruido de la fuente de alimentación. Por lo tanto, siempre es una buena idea incluir un condensador de desacoplamiento en la línea de alimentación. El capacitor puede ser de 10uF a 100uF.

Otro problema común es que el pin de 3,3 V de las placas Arduino no siempre puede suministrar suficiente energía al módulo NRF24L01. Por lo tanto, alimentar el módulo con una fuente de alimentación externa también es una buena idea.

Comunicación inalámbrica bidireccional con dos NRF24L01 y Arduino

Veamos el segundo ejemplo, una comunicación inalámbrica bidireccional entre dos placas Arduino. Aquí están los esquemas del circuito:

Puede obtener los componentes necesarios para este ejemplo desde los siguientes enlaces:

  • Módulo transceptor NRF24L01…………
  • Placa Arduino…………………………………….
  • Módulo de palanca de mando ……………………………….
  • Servomotor …………………………………….
  • Pulsador ……………………………………..
  • LED ……………………………………………………

código fuente nRF24L01

Aquí están los dos códigos y su descripción a continuación.

Código del transmisor

/*
* Arduino Wireless Communication Tutorial
*     Example 2 - Transmitter Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

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

#define led 12

RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
boolean buttonState = 0;

void setup() {
  pinMode(12, OUTPUT);
  radio.begin();
  radio.openWritingPipe(addresses[1]); // 00002
  radio.openReadingPipe(1, addresses[0]); // 00001
  radio.setPALevel(RF24_PA_MIN);
}

void loop() {
  delay(5);

  radio.stopListening();
  int potValue = analogRead(A0);
  int angleValue = map(potValue, 0, 1023, 0, 180);
  radio.write(&angleValue, sizeof(angleValue));

  delay(5);
  radio.startListening();
  while (!radio.available());
  radio.read(&buttonState, sizeof(buttonState));
  if (buttonState == HIGH) {
    digitalWrite(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  }
}Code language: Arduino (arduino)

Código del receptor

/*
* Arduino Wireless Communication Tutorial
*     Example 2 - Receiver Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>

#define button 4

RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
Servo myServo;
boolean buttonState = 0;

void setup() {
  pinMode(button, INPUT);
  myServo.attach(5);
  radio.begin();
  radio.openWritingPipe(addresses[0]); // 00001
  radio.openReadingPipe(1, addresses[1]); // 00002
  radio.setPALevel(RF24_PA_MIN);
}

void loop() {
  delay(5);
  radio.startListening();
  if ( radio.available()) {
    while (radio.available()) {
      int angleV = 0;
      radio.read(&angleV, sizeof(angleV));
      myServo.write(angleV);
    }
    delay(5);
    radio.stopListening();
    buttonState = digitalRead(button);
    radio.write(&buttonState, sizeof(buttonState));
  }
}Code language: Arduino (arduino)

Lo que es diferente aquí del ejemplo anterior es que necesitamos crear dos conductos o direcciones para la comunicación bidireccional.

const byte addresses[][6] = {"00001", "00002"};Code language: Arduino (arduino)

En la sección de configuración, debemos definir ambas tuberías y tenga en cuenta que la dirección de escritura en el primer Arduino debe ser la dirección de lectura en el segundo Arduino, y viceversa, la dirección de lectura en el primer Arduino debe ser la dirección de escritura en el segundo Arduino.

// at the Transmitter
radio.openWritingPipe(addresses[1]); // 00001
radio.openReadingPipe(1, addresses[0]); // 00002Code language: Arduino (arduino)
// at the Receiver
radio.openWritingPipe(addresses[0]); // 00002
radio.openReadingPipe(1, addresses[1]); // 00001Code language: Arduino (arduino)

En la sección de bucle usando la función radio.stopListening() configuramos el primer Arduino como transmisor, leemos y mapeamos el valor del Joystick de 0 a 180, y usando la función radio.write() enviamos los datos al receptor.

radio.stopListening();
int potValue = analogRead(A0);
int angleValue = map(potValue, 0, 1023, 0, 180);
radio.write(&angleValue, sizeof(angleValue));Code language: Arduino (arduino)

Por otro lado, usando la función radio.startListening() configuramos el segundo Arduino como receptor y verificamos si hay datos disponibles. Mientras haya datos disponibles, los leeremos, los guardaremos en la variable "angleV" y luego usaremos ese valor para rotar el servomotor.

radio.startListening();
  if ( radio.available()) {
    while (radio.available()) {
      int angleV = 0;
      radio.read(&angleV, sizeof(angleV));
      myServo.write(angleV);
    }Code language: Arduino (arduino)

A continuación, en el transmisor, configuramos el primer Arduino como receptor y con un ciclo "while" vacío esperamos que el segundo Arduino envíe los datos, y esos son los datos para el estado del botón, ya sea que esté presionado o no. Si se presiona el botón, el LED se encenderá. Entonces, este proceso se repite constantemente y ambas placas Arduino envían y reciben datos constantemente.

Ejemplo 3:envío de múltiples variables en un solo paquete

Echemos un vistazo a un código de ejemplo más usando los módulos NRF24L01. Todo sigue igual que en los ejemplos anteriores, excepto por la forma en que estructuramos y enviamos la fecha.

Código del transmisor

/*
  Arduino Wireless Communication Tutorial
      Example 1 - Transmitter Code

  by Dejan Nedelkovski, www.HowToMechatronics.com

  Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

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

RF24 radio(7, 8); // CE, CSN

const byte address[6] = "00001";

// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
  byte a = 0;
  byte b = 125;
  byte c = 255;
  int d = 1024;
  float e = 3.141592;
  String f = "Test";
};

Data_Package data; // Create a variable with the above structure

void setup() {
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

void loop() {
  // Send the whole data from the structure to the receiver
  radio.write(&data, sizeof(Data_Package));
  delay(500);
}Code language: Arduino (arduino)

Entonces, podemos crear una estructura que en realidad es una colección de varios tipos de variables.

// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
  byte a = 0;
  byte b = 125;
  byte c = 255;
  int d = 1024;
  float e = 3.141592;
  String f = "Test";
};

Data_Package data; // Create a variable with the above structureCode language: Arduino (arduino)

Debemos tener en cuenta que el tamaño máximo de esta estructura de datos puede ser de 32 bytes. Aquí podemos ver que incluí tres variables tipo byte, una variable entera (4 bytes), una variable flotante (4 bytes) y una cadena que contiene cuatro caracteres (4 bytes). Eso es un total de 15 bytes.

Código del receptor

/*
  Arduino Wireless Communication Tutorial
        Example 1 - Receiver Code

  by Dejan Nedelkovski, www.HowToMechatronics.com

  Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

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

RF24 radio(7, 8); // CE, CSN

const byte address[6] = "00001";

// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
  byte a = 0;
  byte b = 125;
  byte c = 255;
  int d = 1024;
  float e = 3.141592;
  String f = "Test";
};

Data_Package data; //Create a variable with the above structure

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}

void loop() {
  // Check whether there is data to be received
  if (radio.available()) {
    radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure
  }
  Serial.print("a: ");
  Serial.print(data.a);
  Serial.print(" b: ");
  Serial.print(data.b);
  Serial.print(" c: ");
  Serial.print(data.c);
  Serial.print(" d: ");
  Serial.print(data.d);
  Serial.print(" e: ");
  Serial.print(data.e);
  Serial.print(" f: ");
  Serial.println(data.f);
}Code language: Arduino (arduino)

En el lado del receptor, tenemos que definir los mismos datos de estructura para poder recibir los datos entrantes. Para probar si la comunicación inalámbrica funciona correctamente, imprimí cada variable en el monitor serie.

Conclusión

El módulo NRF24L01 es una excelente opción cuando necesita comunicación inalámbrica para su proyecto Arduino. Ya he usado este módulo en muchos de mis proyectos Arduino.

Aquí listaré todos mis proyectos en los que he usado estos módulos.

  • Control inalámbrico de Arduino Robot Car usando los módulos transceptores HC-05 Bluetooth, NRF24L01 y HC-12
  • Proyecto de estación meteorológica inalámbrica Arduino
  • Transmisor DIY Arduino RC
  • Robot hexápodo de hormiga Arduino
  • Aerodeslizador RC basado en Arduino DIY
  • Robot de ruedas Arduino Mecanum
  • Receptor DIY Arduino RC para modelos RC y proyectos Arduino
  • Avión RC Arduino | 100% bricolaje

Cada uno de estos proyectos/tutoriales tiene una explicación detallada de cómo usar el módulo NRF24L01, incluidos diagramas de circuitos, implementación de código mejorada para una mejor comunicación, etc.

Mi proyecto favorito es este transmisor Arduino RC diseñado a medida. En realidad, es un controlador RC de 14 canales que se puede usar para controlar prácticamente cualquier proyecto Arduino.

Eso es todo por este tutorial, espero que lo hayan disfrutado y aprendido algo nuevo. Como siempre, no dude en hacer cualquier pregunta en la sección de comentarios a continuación.


Proceso de manufactura

  1. Cómo medir la calidad del aire en OpenSensors
  2. Cómo piratear mandos a distancia por infrarrojos
  3. ¿Qué tan alto eres?
  4. Generador de ondas JX
  5. Patineta de realidad virtual DIY
  6. Cómo conectar Arduino Mega con el módulo GPS NEO-6M
  7. ¡¿Qué tan fácil es usar un termistor ?!
  8. Cómo hacer música con un Arduino
  9. Cómo utilizar Modbus con Arduino
  10. Reloj de alarma ArduRadio
  11. Aquí hay una idea:cómo funciona una interfaz cerebro-computadora