Vous êtes sur la page 1sur 35

OBJETIVOS

o Presentar los mdulos de radio NRF2401.


o Describir la forma de conectarlos a nuestros Arduinos o similares.
o Presentar un par de programas sencillos que nos permitan usarlos en nuestros proyectos para
enviar y recibir rdenes o datos.
o En este primer ejemplo de programa la comunicacin ser unidireccional..

MATERIAL REQUERIDO.

Arduino UNO o equivalente.

Un par de mdulos de radio NRF2401,


Algunos cables de protoboard, preferibleme
una protoboar

LAS CONEXIONES DE RADIO

Hemos visto en anteriores sesiones, que poder usar conexiones inalmbricas nos ofrece
unas posibilidades a las que resulta difcil renunciar cuando te acostumbras, y hemos hecho
pruebas de conexiones tanto WIFI como Bluetooth.

Las WIFI nos permiten conectarnos a Internet con facilidad y podemos publicar pginas Web
con valores de nuestros sensores y Arduinos o simplemente acceder a estos Duinos y
pasarles parmetros u rdenes. EL BlueTooth es ideal si queremos controlar
nuestros Arduinos sin ms controlador que un mvil que ya llevamos habitualmente en el
bolsillo.

Pero tanto el BT como el WIFI tienen unas limitaciones considerables en lo que se refiere a la
distancia a la que podemos usarlo. No pasa ms all de 20 metros y eso en condiciones
ptimas, pero no es raro que necesitemos ms distancia, digamos 50 m, 0 200 m, y porque no
un kilmetro.

Como siempre, cuando hay una necesidad en el mercado, surge alguien dispuesto a ofrecer
una solucin en forma de electrnica, y en esta ocasin vamos a presentar una solucin
magnifica para el tipo de problema que planteamos. Un medio de dar rdenes a un Arduino o
similar, a una distancia que puede variar entre 50 metros y hasta digamos un kilmetro.

En esta sesin vamos a presentar y dar los primeros pasos con unos magnficos dispositivos
de radio basados en el chip de Nordic semiconductor NRF24, y que podemos encontrar en
multitud de mdulos de diferentes fabricantes, compatibles entre s, por muy poco dinero, que
es lo que nos gusta en esta casa.

Este dispositivo NRF2401, integra en un nico chip, toda la electrnica y bloques funcionales
precisos, para establecer comunicaciones RF (Radio Frecuencia) entre dos o ms puntos a
diferentes velocidades, (Hasta 2 Mb/seg) con correccin de errores y protocolo de reenvi
cuando es necesario, sin intervencin del control externo, lo que nos permite aislarnos de tobo
el trabajo sucio y complicado relacionado con la transmisin fsica.

Las caractersticas ms destacadas son:

Muy baratos, unos pocos dlares.


Operan en la banda de 2.4Ghz, que es de libre uso a nivel mundial.
Velocidad configurable de 250kb, 1 Mb o 2Mb por segundo.
Muy bajo consumo en Stand By (Cuando no se usan).
El alcance depende de si hay visin directa entre los nodos, o por el contrario hay obstculos,
pero nos ofrece un mnimo de unos 20 m hasta un mximo e 80m en ptimas circunstancias,
en el modelo bsico con la antena integrada.
Podemos encontrar modelos con antenas ms eficaces por un coste un poco superior (no
mucho no os asustis) que aumentan de forma importante el alcance hasta casi un km.
Si no queremos complicarnos la vida son muy fciles de usar y configurar y adems son los
enlaces ms baratos que podemos encontrar para vincular nuestros Arduinos.
Compatibles con todo un rango de modelos de diferentes tipos y fabricantes.

LAS ONDAS DE RADIO

A finales del siglo XIX, James C. Maxwell estableci las leyes del electromagnetismo que
describen la propagacin de las ondas electromagnticas y la relacin que existe entre los
campos magnticos y la electricidad (de ah el nombre) estableciendo una de las teoras
bsicas que regulan el funcionamiento del mundo moderno.

Todas la ubicuas emisiones de RF que nos rodean actualmente, fueron descritas


por Maxwell y sus ecuaciones hace ya ms de 100 aos, y eso incluye las emisiones de radio
en AM y FM, las de televisiones, tanto analgicas como digitales, la conexin de tu telfono
mvil y hasta las conexiones WIFI y Bluetooth de las que hemos hablado previamente.

Las primeras emisiones de radio viables se atribuyen en 1901 Guillermo Marconi y son el
precedente de toda la tecnologa de radio actual apoyndose en los trabajos
de Maxwell y Heinrich Hertz de quien deriva la unidad de medida de la frecuencia Hercios en
espaol (Hertz en ingls)

La descripcin de una onda de RF se realiza por su frecuencia, en Hercios, que indica el


nmero de pulsos por segundo a los que bate la seal, y por su amplitud que indica la
intensidad.

Ya hemos hablado antes del espectro de frecuencia y vamos a destacar que en la prctica
llamamos RF a las seales de frecuencia inferior a los 300Ghz
Como podis ver, el espectro de radiofrecuencias parece el camarote de los hermanos
Marx, con los servicios de radio, TV, telefona y dems por lo que es importante que los
dispositivos que usemos emitan en el rango de frecuencias libres, es decir, en las que se
permite que cualquiera emita y reciba, sin interferir con la operacin normal de emisiones que
operan los servicios sometidos a regulacin.

Nuestros humildes mdulos NRF2401 emiten a 2.4 GHz, lo que es banda libre y no requieren
de ningn permiso para usarse en ninguna parte del mundo (Por mucho que os quieran meter
miedo con esto). Pero a cambio, no tenemos garanta de que no haya alguien ms emitiendo
en esta banda en las cercanas, lo que puede producir interferencias con nuestra emisiones.

Cuando sintonizas tu emisora FM en el dial, digamos 103.4, es porque la emisora paga a la


administracin para ser la nica que pueda emitir legalmente en esa frecuencia y de ese modo
impida la interferencia de otros servicios comerciales.
Por eso el espectro de radiofrecuencias est sometido a un estricto control administrativo, en
todos los pases, para evitar que seales en competencia interfieran entre si anulando la
posibilidad de transmitir informacin valida.

DIAGRAMA DE CONEXIN DE UN MDULO NRF2401

Estos mdulos usan el bus SPI para acelerar la conexin con el micro controlador por lo que
vamos a ver la descripcin de los pines necesarios para su conexin, en vista superior:
Hay dos libreras bsicas para el manejo de los NRF2401s en Arduino, la NRF24 que es la
que vamos a usar aqu (Porque me parece ms sencilla) y la librera MIRF.

PIN NRF2401 ARDUINO UNO

GND 1 GND

VCC 2 3.3

CE 3 9

CSN 4 10

SCK 5 13

MOSI 6 11

MISO 7 12

IRQ 8 2

Es importante recalcar que estos mdulos funcionan a 3.3V; EL fabricante previene contra
conectarles a 5V so pena de achicharrarlos.
La librera MIRF espera que hagas unas conexiones de pines diferentes, as que no te
conviene usar este diagrama de conexin si pretendes utilizarla.
Tenis que comprender que los modelos UNO y MEGA usan diferentes pines para el control
del bus SPI y luego para rematar la faena, segn la librera cambian de nuevo.
Vamos con el esquema de conexin de protoboard:

Para poder emitir y recibir con estos mdulos vamos a necesitar dos Arduinos configurados
con estas conexiones a los que llamaremos emisor y receptor, porque inicialmente los
programas van a ser distintos.

Empezaremos haciendo la prueba ms sencilla posible. Uno de ellos, el emisor, radia una
serie de nmeros y el otro, el receptor, los recibe y muestra en la consola serie.

Aunque estos mdulos consumen muy poco en uso o en Stand by, pueden absorber en el
arranque ms de lo que la fuente de 3.3V de Arduino puede proporcionar, lo que impide que
arranque correctamente o que tenga un funcionamiento errtico, especialmente en el caso del
emisor.
Si buceis en Internet, veris cantidad de pginas recomendndoos usar
unos condensadores entre los pines tal y cual.
Aunque tomar precauciones nunca sobra, los vagos somos incapaces de hacer algo as,
mientras no se demuestre que es imprescindible.
En mi caso he comprobado que la manera ms sencilla de evitar problemas (Que los he
tenido) ha sido asegurarme de que el emisor tiene una alimentacin correcta y abundante,
mediante un alimentador externo de los tpicos. Esta sencilla precaucin ha hecho que en mi
caso los problemas se reduzcan hasta desaparecer.
PROGRAMANDO LAS RADIOS

Vamos a montar un primer ejemplo en el que crearemos dos programas diferentes que corren
en dos Arduino diferentes. El primero ser el programa emisor, que radiar nmeros en
secuencia desde 0 hasta el 255, y el segundo el programa receptor, que nos permitir
comunicarnos en una nica direccin inicialmente.

Vamos con el programa emisor y para ello necesitamos la librera RF24-master, cuya ltima
versin siempre podis encontrar en https://github.com/maniacbug/RF24. Empezamos con
unos cuantos includes, necesarios para el NRF2401 y para el bus SPI:

#include <nRF24L01.h>

#include <RF24.h>

#include <RF24_config.h>

#include <SPI.h>

Despus tenemos que crear una instancia de la radio, indicndole los pins de control, y la
siguiente lnea indica el pipe a utilizar, que podemos imaginar como uno de los diferentes
canales en los que la radio puede operar.

RF24 radio(9,10);

const uint64_t pipe = 0xE8E8F0F0E1LL;

El pipe es un numero de 64 bits, lo que indicamos con el tipo uint64_t , entero sin signo de
64 bits, y por si no estuviera suficientemente claro, le indicamos al compilador que se trata de
un LL al final del nmero, o sea LongLong = 64 bits.
Y ahora basta con inicializarla en el setup:

void setup(void)

{ Serial.begin(9600);

radio.begin();

radio.openWritingPipe(pipe);

En el programa principal, simplemente vamos incrementando una variable para luego


transmitirla por la radio

int msg[1] ;

void loop(void)

{ for (int x=0;x<2255;x++)

{ msg[0] = x ;

radio.write(msg, 1);

Aqui os dejo el programa completo Prog_79_1_Emisor

En cuanto al programa receptor Prog_79_1_Receptor, tenemos que empezar incluyendo las


mismas libreras, y un array mnimo para el entero a recibir, e instanciamos la radio como
radio

#include <nRF24L01.h>

#include <RF24.h>

#include <RF24_config.h>

#include <SPI.h>
RF24 radio(9,10);

const uint64_t pipe = 0xE8E8F0F0E1LL;

int msg[1];

El setup es casi el mismo.

void setup(void)

{ Serial.begin(9600);

radio.begin();

radio.openReadingPipe(1,pipe);

radio.startListening();

Pero en vez de usar radio radio.openWritingPipe(pipe) para escribir, usamos


radio.openReadingPipe(1,pipe) para poder leer y despus radio.startListening() nos permite
comenzar la escucha. Y ya solo falta el setup con el programa que recibe:

void loop(void)

{ if (radio.available())

{ int done = radio.read(msg, 1);

Serial.println(msg[0]);

Se nos ha vuelto a perder la parte difcil, porque no me digis que no es sencillo y elegante. El
tema no da para ms. Si corris los programas en Arduinos diferentes, la salida del receptor
debera ser algo as:
Programa por el que no ganaremos ningn premio, pero que ilustra a la perfeccin como emitir
datos numricos uno a uno entre emisor y receptor mediante radio frecuencia. Si habis
llegado hasta aqu, enhorabuena acabis de emitir por radio, vuestro primer mensaje.

Bueno, est bien. Enviar un carcter esta chupado, pero Que pasa si hay que enviar un
String completo, seguro que la cosa se complica?
Pues s. Para enviar un mensaje de texto tenemos que cambiar un par de cosas. Primero
definir un array de char suficiente para que quepa el mensaje:

char msg[16]="Prometec.net.\n" ;

Y despus cambiar el loop para que envi los 16 caracteres

void loop(void)

radio.write(msg, 16);

Y por supuesto hay que cambiar el programa del receptor

void loop(void)

{ if (radio.available())

{ int done = radio.read(msg, 16);


Serial.println(msg);

Basta con llamar a radio.write o radio.read con el array como parmetro y pasarle el nmero
de caracteres que queremos enviar o recibir. Aqu tenis el emisor y el receptor modificados.

Emisor_String

Receptor_String

He visto en Internet un programa que me encant, porque lo que hace es colocar un LED rojo
y uno Verde en los pines 3 y 5 de Arduino y despus emite nmeros entre 0 y 255 en el
emisor mientras en el receptor corre un programa que controla que los nmeros se reciban en
el orden adecuado.

Cuando es as, ilumina brevemente la luz verde, en caso contrario la roja. Lo bueno de esto es
que os sirve como ejemplo de si tenis una buena recepcin o no, ya que segn el baile de los
LEDs tenis una idea bastante aproximada de los errores de trasmisin que tenis en vuestra
zona.

Usad el programa Prog_79_1_Emisor para el emisor y este programa en el


receptor Prog_79_4.

RESUMEN DE LA SESIN
.

o Presentamos las unidades de radio NRF2401, que son ideales para muchos proyectos,
porque son buenas, bonitas y baratas.
o Vimos como conectarlas a nuestros Arduinos con confianza usando el SPI y un par de pines.
o Descargamos y usamos la librera RF24 para el manejo de las radios y vimos los comandos
bsicos para enviar y recibir.
o Hicimos un montaje de prueba con una comunicacin en una nica direccin.

Anterior
Siguiente

COMENTARIOS MS VIEJOS

(195) COMMENTS

Reply
o joaquin
o 07 Sep 2017
Hola!
Como siempre gracias por los tutoriales. Son de mucha ayuda. An as tengo un par de
consultas de los sketch anteriores: en el primero de ellos se dice que vamos a radiar del 0 al
255; sin embargo el sketch indica 2255. Al principio cre que poda ser una errata, pero
funciona enviando los nmeros del 0 a 255?!?! alguien puede indicar por qu no va hasta el
2255?
La segunda consulta es respecto del receptor string: qu funcin tiene el int done? por qu
no tiene que ser un char? en qu momento se almacena el valor de msg para que pueda
imprimirse por Serial?
Un milln de gracias por vuestras respuestas. Saludos!

Reply
o David
o 30 Ago 2017
Hola. Tanto el arduino mega como el uno y el nano tienen puerto ICSP. Por que no conectar
ah el mdulo nrf2401 ?? No es para esto?

o Reply
Ivan
30 Ago 2017
Efectivamente puedes usar los pines de ah que necesites.
Reply
o AUDATO
o 23 Ago 2017
Los #include son mismo del ejemplo, PROGRAMANDO LOS RADIOS.

Reply
o AUDATO
o 23 Ago 2017
Gracias por tu respuesta. te enviare el programa y al compilar en la instruccion bool done =
radio.read(datos, 3);, presenta lo siguiente:

if ( radio.available() )
{
//Leemos los datos y los guardamos en la variable datos[]
bool done = radio.read(datos, 3);

//reportamos por el puerto serial los datos recibidos


Serial.print(Dato0= );
Serial.print(datos[0]);

exit status 1
void value not ignored as it ought to be

envio programas >>>>>


EMISOR

// EMISOR

#include
#include
#include
#include

RF24 radio(9, 10);


const uint64_t pipe = 0xE8E8F0F0E1LL;

//vector con los datos a enviar


float datos[3];
void setup()
{
//inicializamos el puerto serie
Serial.begin(9600);

//inicializamos el NRF24L01
radio.begin();// Basically turn on communications with the device

//Abrimos el canal de Lectura


radio.openWritingPipe(pipe);//Set up the two way communications with the named device

}
void loop()
{

datos[0] = 1; //le puse valores fijos para asegurarme que funcionara


datos[1] = 2;
datos[2] = 3;

//reportamos por el puerto serial los datos enviados


radio.write(datos, 3);
Serial.print(Datos enviados: );
Serial.print(datos[0]);
Serial.print( , );
Serial.print(datos[1]);
Serial.print( , );
Serial.println(datos[2]);
delay(1000);
}

RECEPTOR

//RECEPTOR

#include
#include
#include
#include

RF24 radio(9, 10);


const uint64_t pipe = 0xE8E8F0F0E1LL;
//vector para los datos recibidos
float datos[3];

void setup()
{
//inicializamos el puerto serie
Serial.begin(9600);

//inicializamos el NRF24L01
radio.begin();

//Abrimos el canal de Lectura


radio.openReadingPipe(1, pipe);

//empezamos a escuchar por el canal


radio.startListening();//Give the module a kick
}
void loop()
{
uint64_t pipe;
// if ( radio.available() )
if ( radio.available() )
{
//Leemos los datos y los guardamos en la variable datos[]
bool done = radio.read(datos, 3);

//reportamos por el puerto serial los datos recibidos


Serial.print(Dato0= );
Serial.print(datos[0]);
Serial.print( V, );
Serial.print(Dato1= );
Serial.print(datos[1]);
Serial.print( ms, );
Serial.print(Dato2= );
Serial.println(datos[2]);
}
else
{
Serial.println(No hay datos de radio disponibles);
}
delay(1000);
}
SALUDOS A TODOS .CUALQUIER COMENTARIO SERA PROVECHOSO PARA TODA
LA COMUNIDAD DE PERSONAS QUE USAN ARDUINO. GRACIAS.

OBJETIVOS

o Seguimos probando los mdulos de radio NRF2401.


o Vemos porque no podemos enviar y recibir a la vez con ellos.
o Presentar un par de programas sencillos que nos permitan usarlos en nuestros proyectos para
enviar y recibir rdenes o datos en ambas direcciones y en ambos mdulos.

MATERIAL REQUERIDO.

Arduino UNO o equivalente.

Un par de mdulos de radio NRF2401,

Algunos cables de protoboard, preferiblemente Dupont m


una protoboard

LAS CONEXIONES DE RADIO


En la sesin anterior establecimos una comunicacin RF muy bsica entre un emisor y un
receptor de radio controlado con nuestros Arduinos.

Era un ejemplo muy sencillo, de hecho, procuramos que fuera la mnima expresin para
facilitar la comprensin del ejemplo y para combatir el miedo irracional que
las comunicaciones de radio parece producir en muchos aficionados competentes.

Nunca entend porqu. Parece que esa aura fantasmal que impregnaba las comunicaciones
de radiofrecuencia a principios del siglo XX sigue vivo en el XXI.

Pero en realidad, gracias a ingenieros annimos, como los que nos ofrecen las NRF24L01,
son muy fciles de utilizar sin ms que un pequeo empujn de ayuda, algo que por cierto
estara bien que nos dieran los ejemplos que vienen con la librera (Que hace falta ser
egiptlogo para descifrarlos)

Y es una pena, porque estos modulitos cumplen la regla de las 3 Bs, Bueno, bonito y Barato y
esto no es frecuente.

Por eso vamos a seguir incluyendo tutoriales de uso de estos mdulos RF, y como no poda
ser de otra manera, tenamos que ampliar el tutorial a un ejemplo que hiciera comunicacin
bidireccional (Dplex) de modo que un emisor enve una secuencia de datos, que se reciben
en un segundo nodo y nos responde para saber que ha llegado el mensaje.

Pero antes de empezar con el ejemplo tenis que saber que el mdulo NRF24L01 es
un transceptor y no un emisor receptor.

Un equipo emisor receptor puede enviar mensajes de radio y


recibirlos simultneamente porque ambos circuitos, aunque muy similares, estn aislados
uno del otro y pueden operarse independientemente.

Estos equipos se venden y estn disponibles en el mercado, Pero sabis que? Cuestan
pasta. Por eso cuando alguien quiere ahorrar unos euritos en la radio y dado que el emisor y
el receptor son bastante similares, se monta un circuito con partes comunes. De este modo
podemos emitir o recibir (Observad el uso de la disyuntiva no copulativa) pero, y este es el
truco, no a la vez.

No confundir con transponder o tranpondedor que es una cosa diferente. Aunque tambin
es un sistema de radio, el transponder emite una seal y espera una respuesta, que
dependiendo de la que sea puede poner o no en marcha una serie de acciones automticas,
como abrir la puerta de tu coche, o reclamar la identificar un avin en vuelo con su posicin.

Por eso nuestros mdulos NRF2401, pueden estar en modo recepcin o en modo emisin,
pero no en ambos. Aunque eso s, podemos cambiar de uno a otro a voluntad, muy al estilo de
las radios de aficionados que indican con un corto la intencin de cambiar de modo.

LAS INSTRUCCIONES BSICAS


Aunque ya vimos algunas en la pasada sesin, vamos a insistir con ellas. Lo primero es
incluir algunas libreras:

#include <SPI.h>

#include "nRF24L01.h"

#include "RF24.h"

Y despus inicializamos los pines de control del mdulo (Adems, claro, de los de control SPI,
de los que se encarga la librera):

RF24 radio(9,10);

En la ltima sesin dijimos que los pipes se pueden entender ms o menos como canales de
comunicacin que no se interfieren unos con otros y definimos uno para enviar nuestros
mensajes.

Como lo que queremos ahora es generar una comunicacin en ambos sentidos, vamos a
necesitar dos canales o pipes, por el primero hablar uno y escuchar el otro, y por el
segundo funcionar al revs. Pero recordad que no podemos hacerlo a la vez.

const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

Son un par de enteros de 64 bits y no os preocupis mucho por ellos. Para iniciar la radio
hacemos:

radio.begin();

Normalmente cuando envas un mensaje por radio, uno espera que llegue bien a la primera,
pero la realidad suele tener su propia opinin y hacer de las suyas. Por eso es buena idea que
si no recibimos un mensaje correctamente, se reenve para garantizar la entrega.

Hay una relacin muy estrecha entre las seales de radio frecuencia, la electricidad y el
electromagnetismo y generalmente cuando se produce una, tambin aparecen las otras.
Hay cantidad de fenmenos naturales que generan seales de RF espurias, como tormentas y
rayos o tormentas solares incidiendo en las capas superiores de la atmosfera, pero tambin se
generan por la actividades humanas tales como arrancar cualquier cosa elctrica, como
motores o lmparas fluorescentes.
Hay todo un muestrario de fenmenos que te producirn interferencias RF, antes o despus
y es mejor prevenirlo.

El problema es cuantas veces hacemos este reenvo y cada cuanto tiempo. Por ese tenemos
una instruccin como esta:
radio.setRetries(15,15);

Fija en el primer parmetro la pausa entre reintentos, en mltiplos de 250S, por eso 0 son
250S y 15 son 400S.(La radio funciona a velocidad de vrtigo)

El segundo parmetro indica cuantos reintentos se deben hacer hasta dejarlo, con un mximo
de 15.

Si bajamos estos valores, la velocidad de comunicacin sube, pero tambin los errores y
pueden perderse datos. Por eso si la velocidad no es una cuestin decisiva (Y
con Arduino rara vez lo ser) es preferible dejarlo en 15,15 y listo.

Tambin te interesa saber que independientemente de la longitud del mensaje que t quieras
enviar, el mdulo lo partir en paquetes de una longitud dada. Si no especificas un tamao, el
modulo usara 32 Bytes.

A esta longitud se le llama carga til del paquete o PayLoad, y en caso de que haya un error
en cualquiera de los bits de la transmisin, todo el paquete debe ser reenviado de nuevo (Pero
no te preocupes que el NRF2401 lo gestione en automtico por ti).

setPayloadSize (nmero de Bytes)

Si tienes muchos errores de transmisin, puedes bajar este nmero para evitar reintentos,
pero ten en cuenta que el paquete conlleva una carga propia entre las radios y psi lo bajas
mucho, puedes estar enviando muchos ms datos de control que de mensajes y esto es un
desperdicio.

Por ultimo tendremos que abrir los canales de comunicacin o pipes, uno para emitir y el otro
para recibir

radio.openWritingPipe(pipes[0]);

radio.openReadingPipe(1,pipes[1]);

Y a partir de ahora, ya podemos empezar a escribir lineas de cdigo.

PRGRAMANDO LA COMUNICACIN DE UN PAR DE MDULOS


NRF2401

Montaremos de nuevo un par de Arduinos conectados mediante los NRF2401, con el mismo
esquema que en la sesin anterior y que repito aqu para vagos y gente con muchas cosas
que hacer:
De nuevo tendremos dos roles diferenciados. Uno ser el emisor y el otro el receptor.
Comencemos con el programa del emisor Prog_79B_Emisor:

#include <SPI.h>

#include "nRF24L01.h"

#include "RF24.h"

RF24 radio(9,10);

const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

void setup(void)

{ pinMode(10, OUTPUT);

Serial.begin(9600);

radio.begin();
radio.setRetries(15,15); // Maximos reintentos

//radio.setPayloadSize(8); // Reduce el payload de 32 si tienes problemas

radio.openWritingPipe(pipes[0]);

radio.openReadingPipe(1,pipes[1]);

Nada nuevo en el setup. Veamos el loop:

void loop(void)

radio.stopListening(); // Paramos la escucha para poder hablar

unsigned long time = millis();

Serial.print("Enviando ") ; Serial.println(time) ;

bool ok = radio.write( &time, sizeof(unsigned long) );

if (ok)

Serial.println("ok...");

else

Serial.println("failed");

radio.startListening(); //Volvemos a la escucha

Dejamos de escuchar en la radio para poder emitir. Leemos el valor de millis (O de cualquier
otro parmetro que queramos enviar, como una temperatura) y lo enviamos para despus
testear si la emisin ha sido o no correcta.
unsigned long started_waiting_at = millis();

bool timeout = false;


while ( ! radio.available() && ! timeout ) // Esperamos 200ms

if (millis() - started_waiting_at > 200 )

timeout = true;

Esperamos la confirmacin de que han recibido el mensaje en destino, durante 200 ms. Y al
salir comprobamos si se acab el tiempo, o hemos recibido un mensaje.

Si ha disparado el timeout imprimimos un mensaje de error, y en caso contrario procesamos


el mensaje recibido.

if ( timeout )

Serial.println("Error, No ha habido respuesta a tiempo");

else

{ // Leemos el mensaje recibido

unsigned long got_time;

radio.read( &got_time, sizeof(unsigned long) );

Serial.print("Respuesta = ");

Serial.println(got_time);

delay(500);

Creo que no tendris problemas con este programa. Vamos con el


receptor Prog_79_B_receptor.

El setup es exactamente igual que en el emisor con una pequea diferencia clave,
los pipes de comunicacin se invierten, ya que si el emisor escucha por un canal, el receptor
necesariamente tiene que hablar por l y viceversa, para que se puedan poner de acuerdo.

Por eso, el receptor empieza a escuchar en el setup y define los pipes de lectura y escritura
invertidos con relacin al emisor:

radio.begin();
radio.startListening();

radio.openWritingPipe(pipes[1]);

radio.openReadingPipe(1,pipes[0]);

Y para el loop del receptor tenemos:

if ( radio.available() ) // Si hay datos disponibles

unsigned long got_time;

bool done = false;

while (!done) // Espera aqui hasta recibir algo

done = radio.read( &got_time, sizeof(unsigned long) );

Serial.print("Dato Recibido =");

Serial.println(got_time);

delay(20); // Para dar tiempo al emisor

radio.stopListening(); // Dejamos d escuchar para poder hablar

radio.write( &got_time, sizeof(unsigned long) );

Serial.println("Enviando Respuesta");

// Volvemos a la escucha para recibir mas paquetes

radio.startListening();
}

Aqu os pongo un pequeo video mostrando el resultado de la comunicacin:

He hecho una prueba usando estos programas dejando el emisor en mi PC y colocando el


receptor en mi porttil, para ver movindome por casa, hasta donde me he podido alejar sin
perder la seal.

El resultado ha sido bastante pobre, ya que en cuanto colocas paredes de por medio la
comunicaron se pierde con rapidez a partir de 10 metros, lo que no resulta extrao dado que
estoy usando mdulos con antena integrada.

Normalmente a estos mdulos se les asigna un alcance de 20 o 25 m sin obstculos y esta


distancia disminuye rpidamente a medidas que la seal encuentra obstculos, ya que la
potencia de emisin es muy baja y por tanto, el resultado de la prueba concuerda con esta
idea.

Si queremos ampliar el radio de cobertura tendremos que pasar a usar antenas amplificadas,
similares a estas:
Estos mdulos incluyen, no solo un adaptador de antena, adems llevan integrado
un amplificador de seal para potenciar la emisin y recepcin de seal, con lo que la
distancia til de transmisin crece hasta unos 100 metros (Segn he visto en Internet).
En las pruebas que hemos hecho nosotros usando un par de estos mdulos, puedes conectar
cualquier punto de una casa de tamao medio sin problemas, pero no los hemos podido
probar en el campo.

Por ltimo y para cerrar esta sesin, comentar que tambin existe disponibles
adaptadores USB con NRF2401 incluido, lo que nos permite enviar y recibir mensajes desde
nuestro PC a estos mdulos.

De hecho tengo uno de un fabricante chino, pero me temo que Windows se niega tercamente
a reconocerlo y la pgina del fabricante es un desastre en el que soy incapaz de encontrar
ningn driver para l.

Pero vale la pena comentar, que disponer de un medio de interactuar con estas radios desde
nuestros porttiles es una utilidad que amplia enormemente las posibilidades de comunicacin
y control de nuestros Arduinos.

Seguir insistiendo con l y si consigo arrancarlo, os lo hare saber.

RESUMEN DE LA SESIN

o Seguimos profundizando en los mdulos NRF24L01.


o Hemos visto ms comandos disponibles en la librera que nos ayudaran a minimizar los
problemas de interferencias y reenvos.
o Escribimos unos programa bsicos para comunicar dos de estos mdulos y establecer un
canal de ida y vuelta

OBJETIVOS

o Presentar unos mdulos de control remoto por RF.


o Introducir los integrados 2262 / 2272, encoder decoder.
o Un control sencillo mediante mando a distancia simple.

MATERIAL REQUERIDO.

2 x Arduino UNO o equivalente.

1 x Protoboard .

Algunos cables de protoboard, Dupont macho-hembra


Un emisor receptor de 315MHz con 2262/2272

LOS MDULOS RF

Hasta la fecha hemos ido dedicando toda una serie de sesiones a hablar de mdulos
de Radio Frecuencia RF, basados en diferentes normas y estndares que nos permitan
comunicar nuestros humildes Arduinos con un mundo exterior que suele ser ms o menos
confuso.

As hemos visto como enviar mensajes va TCPIP mediante mdulos WIFI del tipo del
ESP8266 en sus distintas variantes y tambin usar el Bluetooth de nuestros telfonos para
comunicarnos con nuestros proyectos.

A ms bajo nivel, presentamos los mdulos de radio NRF24L01 que tienen la enorme virtud de
tener un muy largo alcance si usamos la antena adecuada, mucho ms que el WIFI o el
Bluetooth y suelen ser ms baratos.

Pero todos estos sistemas adolecen de un problema comn: Que tenemos que construirnos
el mando a distancia. Cierto que tenemos todo lo necesario, pero al final nuestro mando
acaba pareciendo un cacharro salido de la pesadilla de un cientfico loco, por no hablar de la
probabilidad de que algo se suelte en el peor momento (Por la ley de Murphy, ya sabes).
En muchas de esas ocasiones, en que necesitamos simplemente un control remoto sin
complicaciones y con mucha frecuencia, de un alcance inferior a 15 metros, el tema de
conseguir un mando a distancia cmodo y barato puede convertirse en el principal problema.

Por eso me ha parecido que poda ser interesante presentaros algunos componentes muy
sencillos que por unos poco euros te resuelven la papeleta de conseguir un mando
remoto prctico y un circuito sencillo que te permita manipular algo a no demasiada distancia.

La idea de esta sesin es presentaros una pareja de mando a distancia de 4 canales con su
receptor correspondiente que podemos manejar en nuestros proyectos con la menor
complicacin, y para eso os tengo que hables de un par de chips que el mercado nos ofrece y
en los que se basan los productos de esta sesin.
LOS INTEGRADOS 2262/2272

En las comunicaciones a distancia siempre tenemos un problema parecido. Necesitamos un


emisor y un receptor y tener claro si la comunicacin es unidireccional: Solo uno enva y el
resto recibe, o si por el contrario la comunicacin es bidireccional: Uno enva, pero el que
recibe tiene que responder y por tanto ser tambin emisor.
Todas las sesiones previas que hemos presentado anteriormente, correspondan a mdulos
de comunicacin que permitan establecer una comunicacin bidireccional, y naturalmente
nos parece lo normal y que no tendra sentido otra cosa.

Pero lo cierto es que hay muchas ocasiones en las que no se requiere la comunicacin
bidireccional. Imagnate el mando a distancia de la tele o de la puerta de un garaje. Basta con
que el emisor enve la orden y que el receptor demuestre que no estaba sordo haciendo la
operacin requerida.

No es necesario que la puerta del garaje nos informe de que nos ha odo. Basta con que inicie
la apertura. Si trascurrido un par de segundos no vemos que nos haga caso, pulsamos de
nuevo el mando y punto. La bi direccionalidad de la comunicacin es superflua.

La ventaja de establecer comunicacin unidireccional es que los circuitos de control son


mucho ms sencillos y baratos y nos solemos ahorrar cantidad de complicaciones.

Por ello el mercado, siempre atento a la oportunidad de olfatear negocio, vio una ocasin para
proveernos con un par de chips que pretende esto exactamente, la pareja 2262 / 2272.

2262
2272

Estos son un par de chips de tecnologa CMOS, tipo encoder / decoder, pensados para
establecer una comunicacin sencilla entre dos puntos en modo unidireccional y tienen la
virtud de ser muy sencillos y baratos, y por eso hay cantidad de productos que se apoyan
ellos.

Desde mandos a distancia de infrarrojos hasta pequeos mdulos inalmbricos para puertas
de garaje y similares. De hecho hay bastantes posibilidades de que tengis alguno en casa o
en la puerta del garaje, pero no os asustis. Solo quera presentroslos y hablar de su utilidad.

Como el objetivo de estas pginas no es entrar en la electrnica de los integrados salvo que
sea muy interesante, vamos a pasar directamente a ver algn producto que los usan para
enviar seales sencillas que podamos usar en nuestros proyectos.

CONTROL REMOTO A 315 MHZ

Uno de los productos ms divertidos y sencillos que podis encontrar son esta pareja
de emisor receptor por RF, que son de lo ms molones para cualquier chapuza que os
planteis que necesite un control sencillo del tipo enciende apaga, son esta pareja:
Son bsicamente un emisor de 4 canales con formato llavero y con antena retrctil, y un
sencillo receptor basado en nuestro chip 2272, que activa uno de 4 pines en funcin del botn
que se pulse en el mando remoto. Fcil no?

Vamos a ver cmo se comporta el modulo receptor que podemos conectar a


nuestros Arduinos para controlar lo que os parezca, empecemos describiendo los pines:

Las conexiones son triviales. Conectar tensin y Ground y despus cuando se pulsa un botn
el mando remoto, si la comunicacin es correcta levanta el pin VT para indicar que ha
detectado una transmisin valida (Valid Trans).
Por otra parte, los pines D0, D1, D2, D3 se activan con un HIGH, cuando se pulsa el botn A,
B, C, D respectivamente, por lo que vamos a conectarlos a los pines digitales de Arduino 8, 9,
10, y 11. Y eso es todo, no tiene ms complicacin.
La conexin que vamos a usar en el programa ser as de sencilla:

ALIMENTACIN VALIDO DAT

MODULO RF GND Vcc VT D3 D2

ARDUINO GND 5V 7 11 10

Fijaros que adems el receptor requiere que le conectis una antena sencilla si os vais a
alejar unos cuantos metros. Para eso basta con que soldis un cable arrollado en espiral a la
conexin de antena que veis en la esquina superior izquierda.

En el vdeo de demostracin yo no voy a usar antena porque voy a emitir a 15 cm del receptor
y para ese viaje no se necesitan alforjas.
Podis hacerlo simplemente arrollando un cable conductor alrededor de un lpiz tal y como
indica Jess en este proyecto.
Esto es la electrnica que me gusta sin complicaciones superfluas. Hace lo que tiene que
hacer y punto.

EL PROGRAMA DE CONTROL
Como la seal que nos entregan los mdulos son muy simples el programa es igual de
sencillo y rpido de poner en marcha, no requiere libreras ni otras zarandajas, simplemente
leer y escribir pines digitales de Arduino. Sesion_129__1

Empezamos inicializando pines y puerta serie:

void setup()

{ Serial.begin (9600);

pinMode (13, OUTPUT) ;

pinMode (12, OUTPUT) ;

for (int i = 7 ; i < 12 ; i++)

pinMode(i, INPUT) ;

Y ahora leemos los pines sin ms:

void loop()

if (digitalRead(7) ) // Si hay dato valido

{ Serial.print("Valid trans. \t");

if (digitalRead(8))

Serial.print( "Boton A, pulsado");

if (digitalRead(9))

Serial.print( "Boton B, pulsado");

if (digitalRead(10))

Serial.print( "Boton C, pulsado");


digitalWrite (12, ! digitalRead(12)) ;

delay (500) ;

if (digitalRead(11))

Serial.print( "Boton D, pulsado");

digitalWrite (13, ! digitalRead(13)) ;

delay (500) ;

Serial.println("\t");

Comprobamos con el pin digital 7 si hay una entrada valida de datos, es decir, si se ha
pulsado un botn en el mando e imprimimos un mensaje de cdigo valido recibido.

Cuando es as, sacamos un mensaje simple indicando que botn se ha pulsado y poco ms.
Si el botn pulsado es el D o B, levantamos el pin 13 o 12, para excitar lo que tengamos
conectado, en mi caso un rel sencillo.

Adems saca por la consola informacin sobre el botn pulsado (No est muy pulido que
digamos).
Y para cerra aqu va un pequeo vdeo de muestra:

RESUMEN DE LA SESIN

o Hemos introducido muy por encima una pareja de chips 2262/ 2272 como encoder y decoder
pareados.
o Presentamos los mandos a distancia sencillos basados en estos chips.
o Vimos como utilizarlos en nuestros propios proyectos.
o Presentamos ejemplo de programacion con ellos.