Arduino y NRF24L01

La razón detrás de esta corta curva de aprendizaje:

A mi hijo le gusta estar encerrado en su habitación, lejos del resto de la ruidosa familia. Su madre necesita su presencia de vez en cuando para ayudarlo con su hermano autista y las comidas, etc. Me preguntó acerca de tener algo en su habitación que salvaría a su madre de subir y bajar las escaleras para buscarlo y le sugerí un timbre de wi-fi. . Solución fácil Quería algo que fuera bidireccional. No hay más detalles que eso, como audio o visual. Había oído que el NRF24L01 era un pequeño dispositivo de radio muy rentable y efectivo, así que decidí investigar un poco y ver qué se me ocurría.

Hay varios Instructables disponibles que muestran cómo usar el módulo de radio NRF24L01 con un Arduino. Descubrí que era difícil encontrar una configuración simple donde dos Arduino pudieran comunicarse exactamente de la misma manera. Quería ambas configuraciones para cada transmisión y recepción de la misma manera y eso definiría la forma más simple de hacer ambas cosas en dos Arduinos. Una vez que tengo dos Arduinos que se comunican de ida y vuelta, tengo el marco básico para extenderlos para hacer otras cosas.

Este Instructable no produce el producto que mi hijo quiere, pero produce el marco para él y muchas otras aplicaciones simples de dos vías.

Paso 1: el módulo NRF24L01

Las características principales del NRF24L01 son las siguientes:

Funciona en la banda de 2.4HGz ISM El voltaje de alimentación es de 3.3V (muy importante para recordar esto) Los pines SPI son tolerantes a 5V, lo cual es útil para aplicaciones Arduino Tiene 126 canales (frecuencias) seleccionables, tener canales puede ayudar a evitar cualquier posible interferencia con dispositivos cercanos que usan la misma frecuencia. Puede ser prueba y error. Canales seleccionables en incrementos de 1MHz

Dimensiones de los módulos (aprox.): Placa pequeña con antena incorporada: - 30 mm X 16 mm Pequeña con soporte de antena vertical: - 30 mm X 16 mm Grande con soporte de antena horizontal: - 41 mm X 16 mm (el soporte de antena sobresale otros 7 mm)

Las placas no son compatibles con la placa de pruebas, por lo que deben conectarse con cables hembra dupont. También hay una placa adaptadora, que todavía no es compatible con la placa de pruebas, pero separa los pines en una sola fila con Vcc y GND por sí mismos. Otra ventaja de la placa adaptadora es que tiene un regulador de 3.3v incorporado (y condensadores de derivación), lo que significa que puede usar un suministro de 5v.

Se han observado problemas con solo usar el suministro de 3.3v del Arduino en el sentido de que tiene que soldar condensadores en la placa para ayudar con las sobretensiones, etc. Fui por la opción más fácil y usé la placa adaptadora y ejecuté todo desde 5v. Dimensiones de la placa adaptadora: - 27 mm x 19 mm. Agrega aproximadamente 17 mm a la longitud de cada tabla y obviamente también un poco de profundidad. Es posible desoldar los cabezales de clavija macho y hembra y simplemente soldar las placas juntas. Te daría una huella más pequeña pero no para los débiles de corazón.

Paso 2: ponerlo junto

Lista de partes:

  • 2 X Arduinos
  • 2 X placas de prueba
  • 2 X NRF24L01
  • [opcional] 2 tableros de arranque YL-105 para NRF24L01. Esto permite una conexión de 5v y un cableado más fácil
  • 2 X interruptores momentáneos
  • 2 X LED rojos
  • 2 X LED amarillos
  • Resistencias de 4 X 220 ohmios
  • Cables de puente

Uso AliExpress para casi todos mis componentes baratos, especialmente si necesito más de un artículo.

Son componentes baratos de China principalmente, pero aún no he tenido un solo componente malo.

Me encanta usar el Arduino y, por lo tanto, todo lo que hago es bajo voltaje y los componentes baratos están a la altura. Sin embargo, si alguna vez me mudo a algo más crítico o con altos voltajes, etc., lo más probable es que obtenga mis componentes de otro lugar.

Conexiones:

El módulo se comunica mediante el protocolo SPI. Bus de interfaz periférica en serie

La disposición del pin que se usó aquí fue:

NRF24L01 pin Arduino

VCC 3.3 V Si usa la placa de conexión YL-105, el cable Vcc puede ir al pin Arduino de 5v

GND GND

CS 8 (puede ser cualquier pin no utilizado pero está definido en el código)

CE 7 (puede ser cualquier pin no utilizado pero está definido en el código)

MOSI 11 (debe ser el pin 11 de SPI MOSI o el pin 4 de ICSP)

MISO 12 (debe ser el pin 12 SPI MISO o el pin 1 ICSP)

SCK 13 (debe ser el pin SPI SCK 13 o el pin 3 ICSP)

Cableado para LED e interruptor:

  • Pin Arduino 2 a cable largo LED amarillo - ánodo
  • Cable corto amarillo - cátodo a resistencia de 220ohm, luego cable de segunda resistencia a GND
  • Arduino pin 3 a LED rojo cable largo - ánodo
  • Cable corto rojo - cátodo a resistencia de 220ohm, luego segunda resistencia a GND
  • Pin Arduino 4 para cambiar, otro lado del interruptor a GND

La construcción física de las dos tablas es idéntica.

Existen pequeñas diferencias de software para las tuberías de lectura y escritura para los respectivos tableros.

Paso 3: el código

El código que creé para ambos Arduinos es casi idéntico, así que solo mostraré uno de ellos.

Todos los archivos de código están disponibles para descargar.

#include // viene con Arduino

#include "RF24.h" // se puede encontrar a través del IDE: Boceto / Incluir biblioteca / Administrar bibliotecas / Buscar RF24 y localizar RF24 mediante TMRh20 / más información / Instalar

// configura el botón y los LED

#define button 4

#define confirmLed 2

#define led 3

RF24 NRF24L01 (7, 8); // crea un objeto llamado NRF24L01. especificando los pines CE y CSN que se utilizarán en el Arduino

dirección de byte [] [6] = {"pipe1", "pipe2"}; // establece las direcciones de las 2 tuberías para leer y escribir

boolean buttonState = false; // se usa tanto para transmitir como para recibir

configuración nula () {

// configura los pines Arduino

pinMode (botón, INPUT_PULLUP);

pinMode (confirmar, SALIDA); // LED amarillo

pinMode (led, SALIDA); // LED rojo

NRF24L01.begin (); // abre las tuberías para leer y escribir desde la pizarra 1

NRF24L01.openWritingPipe (dirección [0]); // abre el tubo de escritura para abordar el tubo 1

NRF24L01.openReadingPipe (1, dirección [1]); // abrir el tubo de lectura del tubo de dirección 2

// esta es la única diferencia en los dos bocetos requeridos

// las dos líneas siguientes son para el tablero dos, observe cómo se invierten las tuberías de lectura y escritura

// NRF24L01.openReadingPipe (1, dirección [0]); // abrir el tubo de lectura del tubo de dirección 1

// NRF24L01.openWritingPipe (dirección [1]); // abre el tubo de escritura para abordar el tubo 2

NRF24L01.setPALevel (RF24_PA_MAX); // establece la salida de potencia de RF al mínimo, RF24_PA_MIN (cambia a RF24_PA_MAX si es necesario)

NRF24L01.setDataRate (RF24_250KBPS); // establece la velocidad de datos a 250 kbps

// Si la frecuencia de 110 a continuación es un problema con otro wi-fi, incremente en 1 hasta que esté bien

// No olvides que ambos conjuntos de código deben tener la misma frecuencia

NRF24L01.setChannel (110); // establece la frecuencia en el canal 110.

}

bucle vacío () {

// Transmitir cambio de botón A otro Arduino

retraso (10);

NRF24L01.stopListening ();

buttonState = digitalRead (botón); // prueba para presionar el botón en ESTE tablero

if (buttonState == LOW) // se tira del botón, así que pruebe LOW

{

NRF24L01.write (& buttonState, sizeof (buttonState)); // enviar estado BAJO a otra placa Arduino

// parpadea el LED amarillo para mostrar el progreso

digitalWrite (confirmado, ALTO);

retraso (100);

digitalWrite (confirmarLED, BAJO);

}

buttonState = HIGH; // restablecer la variable de estado del botón


/ / Recibir cambio de botón desde el otro Arduino

retraso (10);

NRF24L01.startListening ();

if (NRF24L01.available () ) // ¿tenemos transmisión desde otra placa Arduino?

{

NRF24L01.read (& buttonState, sizeof (buttonState)); // actualiza la variable con nuevo estado

NRF24L01.stopListening ();

}

if (buttonState == HIGH) // prueba el estado del botón del otro Arduino

{

digitalWrite (led, BAJO);

}

más

{

flashLed (); // indica que el botón fue presionado en el otro tablero

}

buttonState = HIGH; // restablecer la variable de estado del botón

}

// parpadea el LED rojo cinco veces

vacío flashLed ()

{

para (int i = 0; i <5; i ++)

{

digitalWrite (led, ALTO);

retraso (200);

digitalWrite (led, BAJO);

retraso (200);

}

}

Paso 4: Código Arduino y archivos Fritzing

A menos que cargue el código en los dos Arduinos en momentos separados, asegúrese de tener dos puertos COM diferentes seleccionados; de lo contrario, tendrá exactamente el mismo código en ambos.

Espero que esto pueda ser de su interés y ayudar a un principiante con su primera implementación de un NRF24L01.

Si nada más, le dará un marco de trabajo sobre el que puede construir.

Archivos adjuntos

  • Arduino_nRF24L01_with_LED.ino Descargar
  • Arduino_nRF24L01_with_LED_2.ino Descargar
  • Arduino NRF24L01.fzz Descargar

Paso 5: Actualización basada en posibles problemas

He recibido un par de comentarios de Tony en Italia y Andrea, donde ambos tienen problemas para conectar este circuito a un Arduino Nano.

Hace aproximadamente un año compré dos Nanos pero nunca pude usarlos, así que aproveché esta oportunidad para soldarlos y ponerlos en uso.

Había desarmado la compilación original, así que la recreé del Instructable con un Arduino UNO como antes, solo para asegurarme de que todo funcionara.

He agregado un par de imágenes de esta compilación.

Muestra el cableado ligeramente diferente y puede ser más fácil de ver.

Tuve un pequeño problema técnico / retraso en una de las placas NRF24L01, pero pareció solucionarse.

Cambié los UNO y los reemplacé por los Nanos, cargué un boceto a un Nano y el otro boceto al otro Nano, y esperaba problemas, pero todo funcionó sin cambios en el código.

Es importante que los diferentes bocetos se carguen en los dos Arduinos.

Las diferencias son solo leves pero muy importantes.

También he agregado un par de imágenes para esta compilación.

Eso me lleva a pensar que puede haber una mala conexión o que mis instrucciones fueron ambiguas.

He usado placas de conexión YL-105 para los NRF24L01 para poder usar 5v.

Si no está usando los paneles de conexión, debe usar 3.3v.

Si empuja 5v en el NRF24L01, lo más probable es que muera.

Hay siete cables en uso en la placa NRF24L01

  • GND
  • Positivo 3.3v
  • CS a Arduino pin 8 (definido en el código)
  • CE a Arduino pin 7 (definido en el código)
  • MOSI a Arduino pin 11 (obligatorio)
  • MISO a Arduino pin 12 (obligatorio)
  • SCK a Arduino pin 13 (obligatorio)
  • IRQ no se usa
  • Cable amarillo largo LED - ánodo, al pin 2 de Arduino
  • Cable corto amarillo - cátodo, a resistencia de 220ohm, luego cable de segunda resistencia a GND
  • Cable rojo de LED largo - ánodo, al pin Arduino 3 Cable rojo corto - cátodo, a resistencia de 220ohm, luego cable de segunda resistencia a GND
  • Pin Arduino 4 para cambiar, otro lado del interruptor a GND

Si alguna vez tengo una compilación que no parece funcionar, la desarmo y comienzo de nuevo, especialmente con una compilación que es bastante pequeña, de esa manera elimino cualquier error anterior.

Lo único que puedo pensar que puede ser incorrecto en el directorio de Tony y Andrea es que el MOSI y el MISO pueden haber sido intercambiados.

Espero que esto les ayude a ellos y a cualquier otra persona que pueda tener problemas.

Paso 6: video de demostración agregado

Video cargado para dar una rápida demostración de la configuración y el uso.

Artículos Relacionados