Objetivos
Material requerido.
Arduino Uno o similar. | |
Modulo NRF2401 | |
Cables Dupont Macho-Hembra |
Las conexiones de radio
Hemos visto en anteriores sesiones, que poder usar conexiones inalámbricas nos ofrece unas posibilidades a las que resulta difícil 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 páginas Web con valores de nuestros sensores y Arduinos o simplemente acceder a estos Duinos y pasarles parámetros u órdenes. EL BlueTooth es ideal si queremos controlar nuestros Arduinos sin más controlador que un móvil 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 más allá de 20 metros y eso en condiciones óptimas, pero no es raro que necesitemos más distancia, digamos 50 m, 0 200 m, y porque no un kilómetro.
Como siempre, cuando hay una necesidad en el mercado, surge alguien dispuesto a ofrecer una solución en forma de electrónica, y en esta ocasión vamos a presentar una solución 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 kilómetro.
En esta sesión vamos a presentar y dar los primeros pasos con unos magníficos dispositivos de radio basados en el chip de Nordic semiconductor NRF24, y que podemos encontrar en multitud de módulos 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 electrónica y bloques funcionales precisos, para establecer comunicaciones RF (Radio Frecuencia) entre dos o más puntos a diferentes velocidades, (Hasta 2 Mb/seg) con corrección de errores y protocolo de reenvió cuando es necesario, sin intervención del control externo, lo que nos permite aislarnos de tobo el trabajo sucio y complicado relacionado con la transmisión física.
Las características más destacadas son:
Las ondas de radio
A finales del siglo XIX, James C. Maxwell estableció las leyes del electromagnetismo que describen la propagación de las ondas electromagnéticas y la relación que existe entre los campos magnéticos y la electricidad (de ahí el nombre) estableciendo una de las teorías básicas 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 más de 100 años, y eso incluye las emisiones de radio en AM y FM, las de televisiones, tanto analógicas como digitales, la conexión de tu teléfono móvil 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 tecnología de radio actual apoyándose en los trabajos de Maxwell y Heinrich Hertz de quien deriva la unidad de medida de la frecuencia Hercios en español (Hertz en inglés)
Ya hemos hablado antes del espectro de frecuencia y vamos a destacar que en la práctica llamamos RF a las señales de frecuencia inferior a los 300Ghz
Como podéis ver, el espectro de radiofrecuencias parece el camarote de los hermanos Marx, con los servicios de radio, TV, telefonía y demás 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 operación normal de emisiones que operan los servicios sometidos a regulación.
Nuestros humildes módulos NRF2401 emiten a 2.4 GHz, lo que es banda libre y no requieren de ningún permiso para usarse en ninguna parte del mundo (Por mucho que os quieran meter miedo con esto). Pero a cambio, no tenemos garantía de que no haya alguien más emitiendo en esta banda en las cercanías, lo que puede producir interferencias con nuestra emisiones.
Diagrama de conexión de un módulo NRF2401
Estos módulos usan el bus SPI para acelerar la conexión con el micro controlador por lo que vamos a ver la descripción de los pines necesarios para su conexión, en vista superior:
Hay dos librerías básicas para el manejo de los NRF2401s en Arduino, la NRF24 que es la que vamos a usar aquí (Porque me parece más sencilla) y la librería MIRF.
PIN | NRF2401 | Arduino UNO | MEGA |
---|---|---|---|
GND | 1 | GND | GND |
VCC | 2 | 3.3 | 3.3 |
CE | 3 | 9 | 9 |
CSN | 4 | 10 | 53 |
SCK | 5 | 13 | 52 |
MOSI | 6 | 11 | 51 |
MISO | 7 | 12 | 50 |
IRQ | 8 | 2 | – |
Vamos con el esquema de conexión de protoboard:
Para poder emitir y recibir con estos módulos 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 más sencilla posible. Uno de ellos, el emisor, radia una serie de números y el otro, el receptor, los recibe y muestra en la consola serie.
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á números en secuencia desde 0 hasta el 255, y el segundo el programa receptor, que nos permitirá comunicarnos en una única dirección inicialmente.
Vamos con el programa emisor y para ello necesitamos la librería RF24-master, cuya última versión siempre podéis 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>
Después tenemos que crear una instancia de la radio, indicándole los pins de control, y la siguiente línea 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;
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 librerías, y un array mínimo 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 después 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 difícil, porque no me digáis que no es sencillo y elegante. El tema no da para más. Si corréis los programas en Arduinos diferentes, la salida del receptor debería ser algo así:
Programa por el que no ganaremos ningún premio, pero que ilustra a la perfección como emitir datos numéricos uno a uno entre emisor y receptor mediante radio frecuencia. Si habéis llegado hasta aquí, enhorabuena acabáis de emitir por radio, vuestro primer mensaje.
Bueno, está bien. Enviar un carácter 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 después 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 parámetro y pasarle el número de caracteres que queremos enviar o recibir. Aquí tenéis el emisor y el receptor modificados.
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 después emite números entre 0 y 255 en el emisor mientras en el receptor corre un programa que controla que los números 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 tenéis una buena recepción o no, ya que según el baile de los LEDs tenéis una idea bastante aproximada de los errores de trasmisión que tenéis 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 sesión