Electrónica y programación para Microcontroladores.

Libros técnicos para electrónica programable.

Email
Contactanos en:

consultas@firtec.com.ar

Arduino

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 10
 
OneWire ourWire(2);                 //Se establece el pin 2  como bus OneWire 
DallasTemperature sensor(&ourWire); //Se declara una variable u objeto para nuestro sensor
 
byte direccion[6] ={"1Nodo"};   // Dirección del nodo a contactar
RF24 radio(CE_PIN, CSN_PIN);    // Creamos un objeto radio del tipo RF2$
char buffer[10];                // Buffer para el envío de datos
 
 
void setup(void){
  Serial.begin(9600);
  radio.begin();                    // Radio iniciado
  radio.setChannel(100);            // Contacto por el canal 100
  radio.openWritingPipe(direccion); // Radio iniciado en modo escritura
  radio.setPALevel(RF24_PA_MAX);    // Potencia ajustada al máximo
  radio.stopListening();            // Solo como transmisor  
  sensor.begin();                   // Se inicia el sensor de temperatura ds18B20
}
void loop(void){
  
  sensor.requestTemperatures();             // Inicia la medición de temperatura
  float temp= sensor.getTempCByIndex(0);    // Se obtiene la temperatura en ºC
   sprintf(buffer, "%d.%01d", (int)temp, abs((int)(temp*10)%10)); // Pasa el dato a ASCII
   //dtostrf(temp, 2, 1, buffer);  // Pasa el dato a ASCII
   bool ok = radio.write(buffer, sizeof(unsigned long));    // Pasa el dato al modulo NRF24L01
if(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 10
 
byte direccion[6] ={"1Nodo"};  // Nodo a contactar
RF24 radio(CE_PIN, CSN_PIN);  // Creael objeto radio (NRF24L01)
char datos[10];   // Buffer para los datos recibidos
 
void setup(){
  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 posibles
  radio.openReadingPipe(1, direccion);  // Modo escucha siempre llamar antes que radio.startListening()
  radio.startListening();   // Modo escucha activo
}
 
void loop() {
  if ( radio.available())   // Datos disponibles?
 {    
     radio.read(datos,sizeof(unsigned long));  // Leer los datos
     Serial.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 y muchos otros ejemplos parte del libro "Proyectos con Electrónica".