Comunicación inalámbrica a 2.4Ghz con Arduino y NRF24L01


arduino-nrf24l01-2-4ghz-componente

¿Qué es el NRF24L01?

El NRF24L01 es un chip de comunicación inalámbrica fabricado por Nordic Semiconductor que podemos conectar a un procesador como Arduino

El NRF24L01 integra un transceptor RF (transmisor + receptor) a una frecuencia entre 2.4GHz a 2.5GHz, una banda libre para uso gratuito. La velocidad de transmisión es configurable entre 250 Kbps, 1Mbps, y 2 Mbps y permite la conexión simultánea con hasta 6 dispositivos.

El NRF24L01 también incorpora la lógica necesaria para que la comunicación sea robusta, como corrección de errores y reenvío de datos si es necesario, liberando de esta tarea al procesador. El control del módulo se realiza a través de bus SPI, por lo que es sencillo controlarlo desde un procesador como Arduino.

La banda de frecuencia es de 2400 a 2525 MHz, pudiendo elegir entre 125 canales espaciados a razón de 1MHz. Se recomienda usar las frecuencias de 2501 a 2525 MHz para evitar interferencias con las redes Wifi.

Anuncio:

La tensión de alimentación del NRF24L01 es de 1.9 a 3.6V, aunque los pines de datos son tolerantes a 5V. El consumo eléctrico en Stand By es bajo, y de unos 15mA durante el envío y recepción.

Existen dos versiones de módulos que montan el NRF24L01, uno con antena integrada en forma de zig-zag y un alcance máximo de 20-30 metros, y la versión de alta potencia que incorpora amplificador y antena externa, con un alcance máximo de 700-1000 metros.

Sin embargo, el alcance real se ve limitado por muchos factores, incluso en condiciones visibilidad directa sin obstáculos. Con el módulo de antena integrada y alimentación desde Arduino y velocidad de transmisión de 2 Mbps el alcance será apenas de 2-3 metros.

Un factor de gran impacto en el alcance es la alimentación del módulo. Para conseguir el máximo alcance conviene alimentar el módulo con una fuente externa de 3.3V, estable y con potencia suficiente.

Los módulos NRF24L01 son ampliamente empleados por su bajo precio y buenas características. Podemos emplearlos, por ejemplo, para recepción remota de sensores como temperatura presión, aplicaciones de domótica y edificios inteligentes, activación remota de dispositivos como iluminación, alarmas, y control o monitorización de robots en el rango de hasta 700 metros.

Precio

Actualmente los módulos RF de 2.4 GHz que montan el NRF24L01 son dispositivos muy baratos. Podemos encontrar el modelo con antena integrada en zig-zag por 0.65€, buscando en vendedores internacionales de eBay o AliExpress.

arduino-nrf24l01-2-4ghz-componente

Le versión con amplificador y antena externa tiene un precio superior de 1.70€, pero a cambio mejoran el alcance hasta 700-1000 metros, aunque para conseguir este alcance obligatoriamente necesitaremos alimentar el módulo con una fuente externa de 3.3V.

arduino-nrf24l01-2-4ghz-componente-antena

Lógicamente, en ambos casos, necesitaremos dos módulos NRF24L01, uno como emisor y otro como receptor.

Esquema de montaje

La conexión de un módulo RF 2.4 GHz NRF24L01 es sencillo, simplemente alimentamos el integrado desde Arduino mediante GND y 5V y conectamos los pines de datos como vimos en la entrada sobre el bus SPI.

arduino-nrf24l01-2-4ghz-conexion

Mientras que conexión vista desde el lado de Arduino quedaría así.

arduino-nrf24l01-2-4ghz-esquema

Como hemos dicho, el funcionamiento del módulo funciona si empleamos una fuente externa de 3.3V. En este caso, recordar poner Gnd en común. Para un óptimo funcionamiento también resulta conveniente conectar un condensador de 100pF – 1uF entre Gnd y 3.3V del NRF24L01.

El módulo funciona a 3.3V. No lo alimentéis a 5V o dañaréis el módulo.
Los pines de SPI que figuran son válidos para los modelos En Arduino Uno, Nano y Mini Pro. Para otros modelos de Arduino consultar el esquema patillaje correspondiente.

Ejemplos de código

Para realizar el control del NRF24L01 usaremos la librería RF24, disponible en este enlace.

La librería proporciona ejemplos de código, que resulta aconsejable revisar. Los siguientes ejemplos son modificaciones a partir de los disponibles en la librería

Enviar un string

El siguiente ejemplo muestra el envío de una cadena de texto desde un Arduino emisor a un Arduino receptor, que al recibir el texto lo muestra por puerto serie.

Código emisor

Código receptor

Enviar variables integer o float

El siguiente ejemplo muestra el envío de variables integer o float desde un Arduino emisor a otro receptor, que muestra los datos por puerto serie. El Arduino emisor envía dos datos cualquiera, en el ejemplo millis()/1000 como integer y 3.14 como float.

Por su parte, el receptor recibe los datos, y en función del identificador convierte los datos recibidos a integer o float, y muestra el resultado por el puerto serie.

Código emisor

Código receptor

Anuncio:

Previous Comunicación inalámbrica en Arduino con módulos RF 433MHz
Next Comunicación RS485 con Arduino y conversor MAX485
1000
20 Comment threads
4 Thread replies
2 Followers
 
Most reacted comment
Hottest comment thread
17 Comment authors
newest oldest
Martín

Hola Luis, primero mis felicitaciones por otra gran y sencillo tutorial!!. como segundo me surge una duda respecto a los canales de radio, existen otros aparte del ya mencionado?. saludos!

luisllamas

Por supuesto que sí! Consulta los tutoriales de paso a paso
https://www.luisllamas.es/?s=paso+a+paso

luisllamas

Debería, funcionan bastante bien. Pero si vas a hacer algo como un dron (un bicho volador que se puede caer y matar a alguien) por favor, tener mucho cuidado ante fallos de programación, pérdida de paquetes en la comunicación, etc etc. Puede llegar a ser muy peligroso

Alvaro

Hola Luis,podria publicar un tutorial que tenga 1 receptor y 6 transmisores equipados cada uno con un ds18b20 ?
gracias

Keytt

Hola buenas tardes donde te puedo contactar para unas dudas que tengo y muchas felicidades por el tutorial

Carlos Rincon

Gracias, me ha servido de mucho

Eric

Hola Luis, tengo una duda y te agradecería si me respondieras, como puedo hacer que el receptor funcione sin conectar el cable USB al Arduino, es decir,solo usando el jack.
Veras quiero presionar un botón en un Arduino y que en otro Arduino se encienda un LED haciendo uso de estos módulos y sin tener que encender y conectar la PC, ya que el código que esta en esta publicación requiere de la comunicación serial con la PC.
Espero puedas resolverme esta duda, gracias

Carlos Jiménez

Hola Luis, en el esquema de montaje, primero indicas la alimentación a 5V del NRF24L01, sin embago, luego adviertes de alimentar a 3V3 o dañaríamos el módulo. Creo que la errata es la primera (alimentar a 5V), es así?

Gracias y un saludo.

Alvaro

Hola, lo primero felicitarte por el gran post y ahora mi pregunta…
Se puede usar el módulo como emisor y receptor al mismo tiempo?
Saludos

David

buenas quería preguntar una dudilla que tengo, tengo un pequeño datalogger con 14 sensores, actualmente estoy almacenando los datos en un SD, puesto que el datalogger va en un coche montado nos gustaría poder transmitir esos datos a modo de telemetria, peri mi duda es… se pueden hacer las dos cosas a la vez? almacenar en la SD y utilizar este dispositivo para enviarlos? los dos utilizan el mismo tipo de puertos MOSI, MISO,… habria que multiplexar la señal? estoy utilizando el arduino MEGA 2560, gracias y un saludo, tus publicaciones me han ayudado mucho para poder implementar todo esto

David

me surge otra duda, he leído que la función openWritingPipe(), el dato es de máximo 32bytes, existe alguna manera de aumentar esto? se podrían abrir dos canales de comunicación en caso de no poder ampliarse?

Eduardo

Hola Luís, el “radio.available()” siempre me devuelve 0. He reinstalado tu código varias veces e instalado las librerías correspondientes. ¿qué puede suceder? como comprobar si el hardware estuviera dañado??

gracias

ARUCAR

MUCHAS GRACIAS LUIS. MUY BIEN EXPLICADO!!

Ángel

Alguna aplicacion de movil que este enviando datos bluetooth todo el rato y puedas recibirlos con este codigo??Saludos

Ricardo flores

con arduinos nano se pueden hacer la comunicación ??

Ivrolan

Buenas Luis, quisiera preguntarte sobre un detalle que no acabo de comprender. ¿Por qué el rango de data[] es distintos en los dos últimos ejemplos? En el emisor es data[2], mientras que en el receptor es data[3]. Seguramente sea una tontería, pues con crear un array lo suficiente grande paar recoger los datos basta pero me deja con la duda. ¡Muchas gracias por su blog, es de gran ayuda!

Adrian Rubio

Hola, Gracias por su explicacion, tengo esta duda, estoy comunicando un tx con un Rx que van montado en locomotoras a escalas, pero tengo varias locomotoras y quiero colocarles address como para no se crucen las comunicaciones, cada locomotora dispone de su transmisor, y el codigo ya lo tengo funcionando muy bien , solo quiero saber como comunico por cada locomotora con su respectivo tx sin que reciba info de otra locomotora o tx.

Comunicaciones Arduino | Aprendiendo Arduino
Adan Alvarez

hola k tal, excelente tu explicación acerca de este modulo, tengo una duda espero me puedas ayudar. quiero crear un control de rf con 15 botones utilizando el modulo NRF24l01 asi mismo tener un receptor, el cual debe de activar 15 reveladores cada re elevador se activa al presionar algun boton del emisor, mi duda es si soporta los 16 canales este modulo o necesito conectar dos módulos para completar los 15 canales del emisor y otros dos para el receptor

Víctor

Hola Luis, gran tutorial!!! pero se me queda una duda: ¿como se pueden comunicar mas de un modulo y que es lo que cambiaría en openreadingpipe y openwritingpipe?

Víctor

Y otra duda, ¿que debo poner en la variable pipe? Se que es una dirección, ¿pero de donde la puedo sacar para usarla en el código?