Electrónica y programación para Microcontroladores.
Libros técnicos para electrónica programable.
Contactanos en:
consultas@firtec.com.ar
Radio NRF24L01 (2.4 Ghz)
El NRF24L01 es un chip de comunicación inalámbrica fabricado por Nordic Semiconductor que integra un transceptor RF a una frecuencia entre 2.4GHz a 2.5GHz. La velocidad de transmisión puede alcanzar los 2 Mbps y permite la conexión simultánea con hasta 6 dispositivos sien embargo solo puede “hablar” con uno a la vez. 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. Dentro de la banda asignada se pueden elegir entre 125 canales espaciados a razón de 1MHz, la tensión de alimentación del NRF24L01 es de 1.9 a 3.6V, aunque los pines de datos son tolerantes a 5V y el consumo en reposo es muy bajo subiendo a unos 18 mA durante el envío y recepción. Existen dos versiones de módulos que montan el NRF24L01, uno con antena integrada en la propia placa con 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.
Un factor de gran impacto en el desempeño del módulo es la fuente de alimentación, un condensador de 100 uF conectado directamente en los pines de alimentación del módulo aseguran un flujo estable de alimentación en condiciones de trabajo duro. Estos chips son transceptores es decir que pueden enviar y recibir pero no al mismo tiempo y es por eso que los módulos NRF2401 pueden estar en modo recepción o en modo emisión, pero no en ambos, claro que se puede cambiar de modo en cualquier momento siempre y cuando apaguemos el módulo antes. Dado el bajo costo y estupendo desempeño resulta interesante su uso con microcontroladores. En el ejemplo propuesto una placa Arduino lee la temperatura desde un sensor DS18B20 y la transmite mediante un enlace de radio a otro Arduino Uno.
El programa para el transmisor es el siguiente.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/************************************************************************ Descripción : Envía el valor de temperatura leído desde un sensor ** DS18B20 usando un transponder de 2.4 Ghz NRF24L01** ** Target : Arduino UNO** ToolChain : Arduino IDE 1.8.9 bajo Linux Debian** www.firtec.com.ar **********************************************************************/#include <SoftwareSerial.h>#include <OneWire.h> #include <DallasTemperature.h>#include <nRF24L01.h>#include <RF24.h>#include <RF24_config.h>#include <SPI.h>#define CE_PIN 9 // Pines asignados al hardware NRF24L01#define CSN_PIN 10OneWireourWire(2);//Se establece el pin 2 como bus OneWire DallasTemperaturesensor(&ourWire);//Se declara una variable u objeto para nuestro sensorbytedireccion[6]={"1Nodo"};// Dirección del nodo a contactarRF24radio(CE_PIN,CSN_PIN);// Creamos un objeto radio del tipo RF2$charbuffer[10];// Buffer para el envío de datosvoidsetup(void){Serial.begin(9600);radio.begin();// Radio iniciadoradio.setChannel(100);// Contacto por el canal 100radio.openWritingPipe(direccion);// Radio iniciado en modo escrituraradio.setPALevel(RF24_PA_MAX);// Potencia ajustada al máximoradio.stopListening();// Solo como transmisor sensor.begin();// Se inicia el sensor de temperatura ds18B20}voidloop(void){sensor.requestTemperatures();// Inicia la medición de temperaturafloattemp=sensor.getTempCByIndex(0);// Se obtiene la temperatura en ºCsprintf(buffer,"%d.%01d",(int)temp,abs((int)(temp*10)%10));// Pasa el dato a ASCII//dtostrf(temp, 2, 1, buffer); // Pasa el dato a ASCIIboolok=radio.write(buffer,sizeof(unsignedlong));// Pasa el dato al modulo NRF24L01if(ok){Serial.println(buffer);// Muestra el dato enviado}delay(1000);}
El programa para el receptor es el siguiente.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/************************************************************************ Descripción : Recibe el valor de temperatura leído desde un sensor ** DS18B20 usando un transponder de 2.4 Ghz NRF24L01** ** Target : Arduino UNO** ToolChain : Arduino IDE 1.8.9 bajo Linux Debian** www.firtec.com.ar **********************************************************************/#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>//Declaremos los pines CE y el CSN para NRF24L01#define CE_PIN 9#define CSN_PIN 10bytedireccion[6]={"1Nodo"};// Nodo a contactarRF24radio(CE_PIN,CSN_PIN);// Creael objeto radio (NRF24L01)chardatos[10];// Buffer para los datos recibidosvoidsetup(){radio.begin();//inicializamos el NRF24L01 //--------------------------------------------------------------------------------------- // Posibles ajustes de ptencia.// RF24_PA_MIN = -18dBm, RF24_PA_LOW = -12dBm, RF24_PA_HIGH = -6dBm, RF24_PA_MAX = 0dBm//--------------------------------------------------------------------------------------- radio.setPALevel(RF24_PA_MAX);// Potencia máxima (irrelevante en modo escucha)Serial.begin(9600);radio.setChannel(100);// 125 canales posiblesradio.openReadingPipe(1,direccion);// Modo escucha siempre llamar antes que radio.startListening()radio.startListening();// Modo escucha activo}voidloop(){if(radio.available())// Datos disponibles?{radio.read(datos,sizeof(unsignedlong));// Leer los datosSerial.println(datos);// Mostrar los datos en el puerto serial}delay(1000);}
También se pueden descargar los códigos completos desde https://github.com/firtec/NRF24L01 siendo este material parte del libro "Electrónica con Arduino".