En el tutorial anterior sobre módulos de radiofrecuencia, vimos como hacer un control remoto con una pareja emisor-receptor de 433MHz.
En el proyecto que traigo a continuación haremos un control remoto, empleando el módulo NRF24L01 de 2.4GHz. Este trasnceptor va a aportar mayor rapidez y fiabilidad en la transmisión/recepción de datos.
A diferencia del conjunto de 433MHz donde emisor y receptor son tarjetas diferentes, el módulo NRF24L01 es un transceptor, es decir, el mismo módulo funciona como emisor o receptor, según lo configuremos. Necesitamos por lo tanto dos unidades de esta tarjeta para hacer el control remoto.
Para hacer el transmisor voy a emplear la misma botonera de seis pulsadores que en el Proyecto 32.1, un módulo NRF24l01 y un Arduino NANO v3.
La conexión del transmisor necesita de 5 hilos, pues emplea el protocolo de comunicaciones SPI. La alimentación de la tarjeta es a 3,3V y GND. Cuidado de no conectar a +5V so pena de quedarnos sin transmisor.
Como veis el receptor también necesita de cinco hilos de datos más la alimentación a 3,3V y GND.
Conectaremos seis leds a la salida del Arduino que se encenderán con cada uno de los pulsadores del mando.
El funcionamiento es el siguiente. Cada vez que pulsamos uno de los botones del mando a distancia, el Transmisor manda un mensaje. Este mensaje es recibido por el Receptor que lo interpreta y activa la salida correspondiente encendiendo un led.
Para que el código compile correctamente son necesarias las librerías SPI y RF24. Ambas están disponibles para descargar al final de la página.
/* ----------------------------------------------------------------
2.4GHz Wireless Remote Control with NRF24L01 Transceiver Module
Basado en el original de http://www.prometec.net/nrf2401
Modificado por Angel M. https://sites.google.com/site/angmuz/home
encender/apagar seis leds con switch/case
Sketch para el emisor
--------------------------------------------------------------------
*/
#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>
#include <SPI.h>
int msg[1] ; // Array a transmitir
RF24 radio(9,10); // Creamos un objeto radio del tipo RF2$
const uint64_t pipe = 0xE8E8F0F0E1LL; // Usamos este canal
void setup(void){
pinMode(2, INPUT); // SW1
pinMode(3, INPUT); // SW2
pinMode(4, INPUT); // SW3
pinMode(5, INPUT); // SW4
pinMode(6, INPUT); // SW5
pinMode(7, INPUT); // SW6
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe);} // Abrir para escribir
void loop(void){
// SW1
if (digitalRead(2)==HIGH)
{
msg[0] = 1;
radio.write(msg, 1);
}
if (digitalRead(2)==LOW)
{
msg[0] = 2;
radio.write(msg, 1);
}
// SW2
if (digitalRead(3)==HIGH)
{
msg[0] = 3;
radio.write(msg, 1);
}
if (digitalRead(3)==LOW)
{
msg[0] = 4;
radio.write(msg, 1);
}
// SW3
if (digitalRead(4)==HIGH)
{
msg[0] = 5;
radio.write(msg, 1);
}
if (digitalRead(4)==LOW)
{
msg[0] = 6;
radio.write(msg, 1);
}
// SW4
if (digitalRead(5)==HIGH)
{
msg[0] = 7;
radio.write(msg, 1);
}
if (digitalRead(5)==LOW)
{
msg[0] = 8;
radio.write(msg, 1);
}
// SW5
if (digitalRead(6)==HIGH)
{
msg[0] = 9;
radio.write(msg, 1);
}
if (digitalRead(6)==LOW)
{
msg[0] = 10;
radio.write(msg, 1);
}
// SW6
if (digitalRead(7)==HIGH)
{
msg[0] = 11;
radio.write(msg, 1);
}
if (digitalRead(7)==LOW)
{
msg[0] = 12;
radio.write(msg, 1);
}
}
/* ----------------------------------------------------------------
2.4GHz Wireless Remote Control with NRF24L01 Transceiver Module
Basado en el original de http://www.prometec.net/nrf2401
Modificado por Angel M. https://sites.google.com/site/angmuz/home
encender/apagar seis leds con switch/case
Sketch para el receptor
--------------------------------------------------------------------
*/
#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>
#include <SPI.h>
int msg[1];
int command = 0;
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
void setup(void){
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(1,pipe);
radio.startListening();
}
void loop(void){
if (radio.available())
{
int done = radio.read(msg, 1);
command = msg[0];
switch(command){
case 1:
digitalWrite(2, HIGH);
break;
case 2:
digitalWrite(2, LOW);
break;
case 3:
digitalWrite(3, HIGH);
break;
case 4:
digitalWrite(3, LOW);
break;
case 5:
digitalWrite(4, HIGH);
break;
case 6:
digitalWrite(4, LOW);
break;
case 7:
digitalWrite(5, HIGH);
break;
case 8:
digitalWrite(5, LOW);
break;
case 9:
digitalWrite(6, HIGH);
break;
case 10:
digitalWrite(6, LOW);
break;
case 11:
digitalWrite(7, HIGH);
break;
case 12:
digitalWrite(7, LOW);
}
}
}
Este sketch nos va a servir para testear el conjunto emisor-receptor y verificar que funcionan correctamente.
Una vez verificado el funcionamiento, disponemos punto de partida para hacer un control remoto más elaborado.
Como ejemplo de aplicación veremos como hacer un control remoto para un coche de radiocontrol, aquí.
PROMETEC: Módulos de RaDio NRF2401
Puedes descargar el proyecto completo en un .rar aquí abajo. Incluye los esquemas, sketch y librerías SPI y RF24.