nRF24L01+ 2.4GHz Wireless Transceiver

El nRF24L01+ 2.4GHz Wireless Transceiver es un dispositivo que permite comunicación in alambrica entre dos arduinos uno se le conoce como  “ping” y el otro como”pong”

El nRF24L01 es un dispositivo que tiene las siguientes especificaciones:

 

 

 

nRF24L01

Especificaciones:
• El Addicore nRF24L01 + es un transceptor de banda ISM de 2,4 GHz.
• Incluye los componentes de soporte en la tarjeta y una antena de 2.4GHz para una fácil aplicación en diseños sin necesidad de hardware adicional.
• Rango de Comunicación 262 pies (80 metros) en condiciones ideales.
• Un microcontrolador host puede comunicarse y configurar el nRF24L01 + sobre una interfaz periférica de 4 pines Serie (SPI). Los registros de configuración se puede acceder a través de la conexión SPI. Los parámetros configurables incluyen canal de frecuencia (125 canales seleccionables), potencia de salida, y la velocidad de datos (velocidad de datos: 250kbps, 1Mbps y 2Mbps).
• El regulador de voltaje en el chip acepta voltajes de alimentación de 1,9 a 3.6V. Cuando se utiliza el nRF24L01 + con un Arduino asegúrese de usar el pin de salida de 3,3 V de la placa Arduino para alimentar el módulo nRF24L01 +.
• El módulo tiene entradas con una tolerancia de 5V que permite una conexión directa de pines SPI para el Arduino.
• Ultra bajo consumo de potencia, tan bajo como 11.3mA transmitiendo 13,5 reciviendo a 2Mbps, 900nA en apagado y 26uA en modo de espera.
• Los resultados de filtrado internos en los altos márgenes de cumplimiento de las normas RF reglamentarias. La radio del módulo usa modulación Gaussian por desplazamiento de frecuencia (GFSK) de modulación, así como un control automático de ganancia (AGC).
• El módulo incluye un (IRQ) pin que puede ser utilizado para habilitar al microcontrolador, (por ejemplo: Arduino), cuando recibe una transmisión. Lo que proporciona ahorro de energía en dispositivos con baterías.
• Auto-acknowledge and auto-retransmit.

Algunas preguntas hechas por usuarias anteriores y que aparecen en el sitio de amazon son:

A: yes; i have a Pi and an Arduino talking to each other using the device. you’ll need the software driver/library for the device. i use RF24, which has versions for the Arduino and the Pi.

En la respuesta anterior se hace mención de la librería RF24 por lo que se hace necesario instalarla en el IDE de Arduino.  Esta está ubicada en la dirección http://maniacbug.github.com/RF24.                        VOID

Ubicando el sitio en el margen derecho aparece el botón

Download ZIP  mostrado en la figura:

gighubrf24

Se descarga una archivo comprimido “RF24-master”; Se procede a descomprimir el contenido y renombrar la carpeta generada a RF24 sin el guión master.

Esta carpeta se  va a copiar en la carpeta libraries de la carpeta  sketches que se creó cuando se instaló el IDE de Arduino.

Una vez copiada la carpeta entramos al IDE y siguiendo la ruta Sketch -> Importar Librería -> Add Library  ubicando la carpeta libraries y seleccionando la carpeta RF24  queda definida como una librería contribuida.

Para verificar la instalación correcta se sigue la ruta Sketch -> Importar Librería y se comprueba que aparece RF24 al final de la lista.

Si no hay ningún problema, estamos listos para usarla.

Abril 2016

Con la librería anterior no me fué posible establecer comunicación, al probar la librería desarrollada por TMRh20 se logro la comunicación usando los siguientes sketches.

La forma de integrarlo al IDE es similar a la anterior.

Otro problema fue que al tratar de presentar la información el LCD tuve que modificar el programa.

Diciembre 2017

Intentando nuevamente, como lo había dejado ya no pude establecer comunicación.

Nueva biblioteca  o bien directamente a la RF24 de tmrh20

 

Sketches.

 

//Sensor Node
//Jorge Luis Herrera Arellano*/
//Ver 0.3
//Abril 2016
//

#include
#include
#include
#include
#include
#include
#include #include "printf.h"

//Inicializar variables radio
#define CE_PIN 7 //White
#define CSN_PIN 8 //Gray
//Inicializar variables sensor humedad
#define DHTPIN 2 //El pin 2 del sensor se conecta al pin 2 de las entradas digitales de Arduino uno.
#define DHTTYPE DHT11
//Inicializar variables joystick
#define JOYSTICK_X A0
#define JOYSTICK_Y A1

//Declarar variables para definicion de radio (nrF)
// NOTE: the "LL" at the end of the constant is "LongLong" type

const uint64_t pipe = 0xE8E8F0F0E1LL; // Define the transmit pipe

/*-----( Declara Variables )-----*/
int ledPin = 6; //Led Verde
int joyPin = 4; //Led Rojo
int ledState = LOW;

float datos[7]; // arreglo de 7 elementos con lecturas de humedad, temperatura (*C,*F)
// indice de calor (*C,*F), y Joystick (X,Y)
unsigned long previousTime = 0;
const long interval = 1000;

/*-----( Declara Objetos )-----*/
RF24 radio(CE_PIN, CSN_PIN); // Create a Radio
// Inicializando sensor temperatura, humedad
DHT dht(DHTPIN, DHTTYPE);
// SETUP CRISTAL LIQUIDO
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7);
// Conectar SCL a A5
// Conectar SDA a A4

void setup()

{
pinMode(ledPin,OUTPUT);
pinMode(joyPin,OUTPUT);
//Inicializa monitor serie
Serial.begin(9600);
lcd.begin (20,4); // Modulo LCD I2C 20 x 4
lcd.setBacklightPin(3,POSITIVE);
lcd.setBacklight(HIGH);
dht.begin();
Serial.println("Inicializando DHT11");
radio.begin();
Serial.println("Inicializando Nrf24L01");
radio.openWritingPipe(pipe);
Serial.println("Comienza a enviar datos ... ");
radio.setChannel(108);
radio.setPALevel(RF24_PA_MIN);
radio.printDetails();
delay(1000);
}

void loop()

{
unsigned long currentTime = millis();
float voltaje_X = 0.0;
float voltaje_Y = 0.0;
int intervalo = currentTime - previousTime;

printf("\n Tiempo actual.\n\r ");
Serial.println(currentTime);
printf("\n Intervalo.\n\r ");
Serial.println(intervalo);
printf("\n Tiempo anterior.\n\r ");
Serial.println(previousTime);

/* Comienza a parpadear el Led en pin 6*/
if (currentTime - previousTime >= interval) {
// save the last time you blinked the LED
previousTime = currentTime;

// if the LED is off turn it on and vice-versa:
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
// set the LED with the ledState of the variable:
digitalWrite(ledPin, ledState);
}

// Espera 2 segundos entre lecturas.
//delay(2000);

// La lectura de la temperatura y humedad toma alrededor de 250 milisegundos!
// Las lecturas del sensor pueden estar el alto por 2 segundos ‘old’ (esto ya que es un //procesador muy lento)
datos[0] = dht.readHumidity();
// Lectura de temperature en Celsius
datos[1] = dht.readTemperature();
// Lectura de temperatura en Fahrenheit
datos[2] = dht.readTemperature(true);
// Verifica si las lecturas fueron correctas o se dio un timeout (intenta nuevamente).

if (isnan(datos[0]) || isnan(datos[1]) || isnan(datos[2]))

{
lcd.home();
lcd.setCursor (0,0);
lcd.print("No se obtuvieron valores adecuados del sensor DHT!");
Serial.println("No se obtuvieron valores adecuados del sensor DHT!");
return;
}

// Calculando el índice de calor en Celsius;
datos[3] = dht.computeHeatIndex(datos[1], datos[0],false);
// Calculando el índice de calor en Farenheith;
datos[4] = dht.computeHeatIndex(datos[2], datos[0]);
//Leyendo datos de resistencia en los potenciometros. https://www.arduino.cc/en/Tutorial/ReadAnalogVoltage
//los valores estaran entre 0 y 1023, para mostrar voltaje hay que correjir dato multiplicando
//por fator (5.0/1023.0)
float voltage_X = analogRead(JOYSTICK_X); // Terminal A0 Nano
analogWrite(joyPin,voltage_X / 4); // Intensidad led Rojo Varia conforme el potenciomentro se ajusta
datos[5]= voltage_X * 0.00488;
float voltage_Y = analogRead(JOYSTICK_Y); // Terminal A1 Namo
datos[6] = voltage_Y * 0.00488;

//Mandando Vector de datos

radio.write( &datos, sizeof(datos) );

//Imprime datos
printf("\n Humedad Relativa: \n\r");
Serial.print(datos[0]);
Serial.print(" % ");
printf("\n Temperatura: \n\r");
Serial.print(datos[1]);
Serial.print(" *C ");
Serial.print(datos[2]);
Serial.print(" *F\t");
Serial.println("");
printf("\n Indice Calorifico Celsius: \n\r");
Serial.print(datos[3]);
Serial.print(" *C");
printf("\n Indice Calorifico Farenheith: \n\r");
Serial.print(datos[4]);
Serial.print(" *F");
printf("Posicion X: \n\r");
Serial.println(datos[5],DEC);
printf("Posicion Y: \n\r");
Serial.println(datos[6],DEC);

lcd.home();
lcd.setCursor(0,0);
lcd.print("Humedad:");
lcd.setCursor(9,0);
lcd.print(datos[0]);
lcd.print(" %");
lcd.setCursor(0,1);
lcd.print("Temp:");
lcd.print(datos[1]);
lcd.print("*C");
lcd.setCursor(13,1);
lcd.print(datos[2]);
lcd.print("*F");
lcd.setCursor(0,2);
lcd.print("Ind Cal: ");
lcd.setCursor (10,2);
lcd.print(datos[3]);
lcd.print(" *C");
lcd.setCursor (0,3);
lcd.print("XPos");
lcd.setCursor(5,3);
lcd.print(datos[5]);
lcd.setCursor(10,3);
lcd.print("YPos");
lcd.setCursor(16,3);
lcd.print(datos[6]);

delay(2000);

}
//GateWay Node
//Jorge Luis Herrera Arellano*/
//Ver 0.1
//Abril 2016
//


#include 
#include 
#include 
//#include 
//#include 
//#include 
//#include 
#include 

//Inicializar variables radio
#define CE_PIN   7     //White
#define CSN_PIN  8     //Gray
//Inicializar variables sensor humedad
//#define DHTPIN 2       //El pin 2 del sensor se conecta al pin 2 de las entradas digitales de Arduino uno.
//#define DHTTYPE DHT11
//Inicializar variables joystick
//#define JOYSTICK_X A0
//#define JOYSTICK_Y A1

//Declarar variables para definicion de radio (nrF)
// NOTE: the "LL" at the end of the constant is "LongLong" type

const uint64_t pipe = 0xE8E8F0F0E1LL; // Define the transmit pipe

/*-----( Declara Variables )-----*/
//int ledPin = 6; //Led Verde
//int joyPin = 4; //Led Rojo
//float ledState = LOW;
float data[7];  // arreglo de 7 elementos con lecturas de humedad, temperatura (*C,*F)
               // indice de calor (*C,*F), y Joystick (X,Y)
//unsigned long previousTime = 0;
//const long interval = 1000;

/*-----( Declara Objetos )-----*/
RF24 radio(CE_PIN, CSN_PIN); // Create a Radio
// Inicializando sensor temperatura, humedad
//DHT dht(DHTPIN, DHTTYPE);
// SETUP CRISTAL LIQUIDO
//LiquidCrystal_I2C	lcd(0x3F,2,1,0,4,5,6,7);
// Conectar  SCL a A5
// Conectar  SDA a A4
 

void setup(){
 
  Serial.begin(115200);
  printf_begin();
  printf("\nInicializando Nrf24L01\n\r");
  radio.begin();
  radio.setChannel(108);
  radio.setPALevel(RF24_PA_MIN);
  radio.printDetails();
  radio.openReadingPipe(1,pipe);
  radio.startListening();
  printf("\nRecibiendo datos ... ");
}

void loop()
{
 
  if(radio.available())
  {
    while( radio.available() )
    {
      radio.read(data,sizeof(data));
    }  
     
    Serial.println("Got packet");
    Serial.print("Humedad: ");
    Serial.print(data[0]); //
    Serial.print(" %\t ");
    Serial.print("Temperatura: ");
    Serial.print(data[1]); //
    Serial.print(" *C ");
    Serial.print(data[2]); //-8
    Serial.print(" *F\t");
    Serial.print("Indice Calorifico Celsius: ");
    Serial.print(data[3]); //3
    Serial.println(" *C\ ");
    Serial.print("Indice Calorifico Farenheit: ");
    Serial.print(data[4]); //3
    Serial.println(" *F\ ");
    Serial.println(data[5],DEC);
    Serial.println(data[6],DEC);
    
    
  }  
}

Aquí un pequeño vídeo.

Comunicación entre Arduino Sensor y Arduino Gateway

Para establecer la comunicación entre Arduino y Raspberry Pi es necesario inicialmente configurar el RPi para lo cuál es necesario seguir las siguientes instrucciones que van a permitir recibir las señales del radio (nrf24L01)

Esta información la tome del blog , en el cuál se detallan las instrucciones, a manera de práctica aquí los especifico con la finalidad de no tener que estar utilizando dos páginas al mismo tiempo.

sudo apt-get install python-dev. # python2

sudo apt-get install python3-dev. # python3

wget https://github.com/Gadgetoid/py-spidev/archive/master.zip

unzip master.zip

rm master.zip

cd py-spidev-master

sudo python setup.py install # python2

sudo python3 setup.py install # python3

cd ..

cd Desktop/

mkdir NRF24L01

cd NRF24L01/

git clone https://github.com/Blavery/lib_nrf24

cd libnrf24/

cp lib_nrf24.py ~/Desktop/NRF24L01/

Eso es todo ahora solo se tiene que crear los archivos de código con un procesador de texto puede ser IDLE, nano o gedit y grabarlos en la carpeta NRF24L01 creada anteriormente,  de ahí ejecutarlos con sudo python foo.py o bien, cambiar con chmod -x foo.py para correrlos con ./foo.py.