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:
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:
Q: Are there datasheets available for these transceivers?
A: I used the following link. It has alot info on these units. http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo
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:
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.