bclose

Los módulos de radio NRF2401

Usando radios para comunicar nuestros Arduinos

Objetivos

.

 
    • Presentar los módulos de radio NRF2401.
    • Describir la forma de conectarlos a nuestros Arduinos o similares.
    • Presentar un par de programas sencillos que nos permitan usarlos en nuestros proyectos para enviar y recibir órdenes o datos.
    • En este primer ejemplo de programa la comunicación será unidireccional..
 

 

Material requerido.

 

Imagen de Arduino UNO Arduino UNO o equivalente.
Transceptor de radio Un par de módulos de radio NRF2401,
conexiones Algunos cables de protoboard, preferiblemente Dupont macho/hembra más una protoboard

 

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:

 
  • Muy baratos, unos pocos dólares.
  • 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 visión directa entre los nodos, o por el contrario hay obstáculos, pero nos ofrece un mínimo de unos 20 m hasta un máximo e 80m en óptimas circunstancias, en el modelo básico con la antena integrada.
  • Podemos encontrar modelos con antenas más eficaces por un coste un poco superior (no mucho no os asustéis) que aumentan de forma importante el alcance hasta casi un km.
  • Si no queremos complicarnos la vida son muy fáciles de usar y configurar y además son los enlaces más 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 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)

 
  • La descripción de una onda de RF se realiza por su frecuencia, en Hercios, que indica el número de pulsos por segundo a los que bate la señal, y por su amplitud que indica la intensidad.
 

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

Reparto por finalidad

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.

 
  • Cuando sintonizas tu emisora FM en el dial, digamos 103.4, es porque la emisora paga a la administración 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 países,  para evitar que señales en competencia interfieran entre si anulando la posibilidad de transmitir información valida.
 

 

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:

Descripcion de pines para el NRF2401

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.

PINNRF2401Arduino UNOMEGA
GND1GNDGND
VCC23.33.3
CE39 9
CSN410 53
SCK51352
MOSI61151
MISO71250
IRQ82 –
 
  • Es importante recalcar que estos módulos funcionan a 3.3V; EL fabricante previene contra conectarles a 5V so pena de achicharrarlos.
  • La librería MIRF espera que hagas unas conexiones de pines diferentes, así que no te conviene usar este diagrama de conexión si pretendes utilizarla.
  • Tenéis que comprender que los modelos UNO y MEGA usan diferentes pines para el control del bus SPI y luego para rematar la faena, según la librería cambian de nuevo.
 

Vamos con el esquema de conexión de protoboard:

Diagrama 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.

 
  • Aunque estos módulos consumen muy poco en uso o en Stand by, pueden absorber en el arranque más de lo que la fuente de 3.3V de Arduino puede proporcionar, lo que impide que arranque correctamente o que tenga un funcionamiento errático, especialmente en el caso del emisor.
  • Si buceáis en Internet, veréis cantidad de páginas recomendándoos 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 más sencilla de evitar problemas (Que los he tenido) ha sido asegurarme de que el emisor tiene una alimentación correcta y abundante, mediante un alimentador externo de los típicos. Esta sencilla precaución ha hecho que en mi caso los problemas se reduzcan hasta desaparecer.

Power supply 

 

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;
 
  • 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 número, 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 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í:

Listado de numeros

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.

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 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

.

 
    • Presentamos las unidades de radio NRF2401, que son ideales para muchos proyectos, porque son buenas, bonitas y baratas.
    • Vimos como conectarlas a nuestros Arduinos con confianza usando el SPI y un par de pines.
    • Descargamos y usamos la librería RF24 para el manejo de las radios y vimos los comandos básicos para enviar y recibir.
    • Hicimos un montaje de prueba con una comunicación en una única dirección.
 

 

 

 

(117) Comments

    • Brunswick Gauss

    Antes que nada quiero felicitarlos por tan excelente sitio y comunicarle que el mismo redujo enormemente mi curva de aprendisaje en el mundo de los microcontroladores atmel, y luego para preguntarte si tu los haz utilizado con attiny85, he leido por muchas partes y no consigo ponerlos a trabajar con el NRF24L01, podrías indicarme un tip ?

    P.D. en el campo de abajo tuve que poner el sitio de arduino para poder enviar este mensaje

    • Hola Brunswick,

      Aunque twngo un Atiny por aqui, no los he utilizado nunca y voy a serte de poca ayuda. Se que son bastante compatibles pero tambien que tienen sus manias y poco mas

  • Hola, tengo una duda, tengo una aplicacion en la cual se reciben los datos del transmisor el problema o la duda que tengo es que al activar una alarma en la parte del emisor me sale envio de datos interrumpido, alguna idea de como separar funciones de un programa para que no pase esto y siga enviando sin que le afecte la alarma?

    • ¿EStas usando interrupciones tuyas?

  • Cordial saludo, Observo que el PIN IRQ del modulo NRF24L01, no se conecta en el diagrama esquemático, pero en la tabla dice que debe ir conectado al PIN2 del Arduino Uno y en el Mega no se usa, entonces cual es el fin de este pin. Gracias

    • Hola Félix, el Pin IRQ sirve para utilizarlo para las interrupciones. Se activa por nivel bajo y se activa por tres razones: dato recibido, dato transmitido o número de reintentos de transmisión alcanzados.

      Un saludo!

  • Hola, me surge una duda he investigado que estos modulos pueden trabajar en red, la idea que tengo es poner dos emisores uno con cada sensor en diferentes puntos y que un receptor los escuche alguna idea de como se podria hacer ? se puede?

    • Hola Tomas, no veo ningun problema en lo que planteas. Echa una ojeada a los ejemplos de transmision duplex y sencilla que ponemos en las sesiones de NRF2401 y creo que encontraras als claves para sacar tu proyecto

  • Hola, me surge un problema con mis módulos nrf24L01 con amplificador y antena, uno lo tengo de emisor en un Arduino Uno, estoy ejecutando el primer sketch del tutorial para probar la pareja, yo creo que este va bien, se enciende la luz de transmisión, mi duda surge (y mi problema) porque de receptor tengo un mega, si dejo el programa tal cual, los pines de control (el CSN) sería diferente al del sketch, debería ser el 53, bueno pues dejando los pines (9,10 sin cable a este último pin) me recibe una seria de caracteres extraños y si cambio el 10 por el 53 no recibe nada, he comprobado la librería y no veo claro si el fallo está aquí. Muchas gracias

  • Hola!! buena información pero tengo una duda, tengo la entrada de 2 sensores, como podria hacer para que esas lecturas se envien, he intentado pero no me da

    • Hola Ivan, no se si quieres enviarlos a la vez que podrias conseguirlo montando un string unico con ambos valores o quizas en casacada

    • Hola Ivan, no tengo módulos radio para probar, pero si no consigues enviarlos por separado se me ocurre que podrías guardas los valores en un String y enviarlo como está explicado en el tutorial.

    • Bruno

    hola, tengo una estacion meteorológica hecha en arduino con el sensor DHT!!, como podria usar este modulo para que me envie los datos de ese sensor a mi ordenador ?? un saludo y muchas gracias

    • Hola bruno, quizas lo mas facil sea conectar via TCPIP mediante WIFI y enviar un mensaje directo a una aplicacion en tu pc

      • pero no me da el alcance wifi, ya que esa estación la tengo montada en un dron, y mi dron tiene de alcance hasta 6 km….muchas gracias de antemano.

    • CARO

    Hola, gracias por el tutorial. Estoy teniendo problemas en el código receptor, me da un error al compilar :
    “exit status 1
    void value not ignored as it ought to be”
    Haciendo referencia a esta linea del Código:
    int done = radio.read(msg, 1);

    • Parece que es un error bastante frecuente y un tanto aleatorio. Prueba a descargar la última versión de la librería y actualiza también el IDE a la última versión y nos cuentas. He leído por ahí que incluso hay gente a la que se le ha arreglado al reiniciar el ordenador. Un saludo!

    • Alberto

    Buenas, sabes si con estos componentes se puede saber la intensidad de la señal que hay entre ellos?

    Tengo como idea establecer 4 receptores en un vehículo y un emisor, y que por medio de las intensidades detecte hacia dónde está el emisor

    Un saludo

    • hola alberto, me suena que la libreria tenia una llamada que te daba una intensidad de la señal, pero habria qje confirmarlo. echa jna ojeada a la documentacion sobre esta libreria en github

Give a Reply

WordPress Anti-Spam by WP-SpamShield