sábado, 7 de mayo de 2016

Arduino Tutorial 24: Enviar datos digitales mediante NRF24L01

En esta entrada vamos a usar el módulo NRF24L01. Con este módulo podemos llevar a cabo comunicaciones inalámbricas entre 100 y 200 metros de longitud máxima. El precio es realmente bajo, se pueden encontrar por menos de 2€. Los podéis conseguir en tiendas de electrónica, en Ebay y en Amazon.
Podéis consultar el datasheet del integrado en el siguiente link. Además os dejo el enlace de la librería que usamos en el siguiente link.

Para esta entrada necesitamos:
  • 2  módulos NRF24L01
  • 2 arduinos
  • 1 led
  • 1 pulsador

Lo primero que tenemos que saber es como conectar el módulo NRF24L01 al arduino:

Módulo NRF24L01 

La columna que indica los colores, es referente a la forma de como se conectara nuestro dispositivo con respecto a la imagen que dejare anexada.

Una vez conocidos los pines, tenemos que descargarnos la libreria que he dejado al principio de la entrada y agregarla a las librerias de vuestro arduino.

Por otro lado, en el arduino que elijáis como emisor, debereís conectar el pulsador, en este caso al pin 2, y en el receptor el led al pin 2.

A continuación os dejo el montaje y el código del emisor y del receptor:


EMISOR:




//exportamos la libreria mirf de nuestras librerias
#include <Mirf.h>
#include <MirfHardwareSpiDriver.h>
#include <nRF24L01.h>
#include <SPI.h>

int pulsador = 2;

void setup()
{
 Serial.begin(9600);
  pinMode(pulsador, INPUT);

 // Iniciamos el modo de trasmision
 Mirf.spi=&MirfHardwareSpi;
 Mirf.init();

 // Nombre que le vas a dar a este modulo NRF24L01
 // sería el equivalente a la IP de un ordenador. 5 bytes maximo.

 Mirf.setRADDR((byte *)"RX_99");

// payload de un byte (es decir, un número entre 0 y 255). Si quiere mandar dos datos, ponemos un 2 (en vez de un 1), y así hasta cuantos datos queramos enviar
 Mirf.payload = 1;

 // indicamos el canal por el cual vamos a enviar la información. En el receptor tenemos que poner el mismo canal
Mirf.channel = 32;

// a configurar y vaciar cola FIFO
Mirf.config();

Serial.println("iniciando...");
}

void loop()
{
  int estado = digitalRead(pulsador);
  Serial.print("Valor pulsador: ");  
  Serial.println(estado);

// nombre del NRF24l01 al que vamos a emitir. (nombre del receptor el cual se configura en el programa arduino del receptor)
Mirf.setTADDR((byte *)"TX_01");

//ahora emitimos
Mirf.send((byte*)&estado);

//esperamos a que termine de emitir
while( Mirf.isSending() ) ;
delay(1000);
}


RECEPTOR:



#include <Mirf.h>
#include <MirfHardwareSpiDriver.h>
#include <nRF24L01.h>
#include <SPI.h>

const int led=2;

void setup()
{
 Serial.begin(9600);
pinMode(led,OUTPUT);
Mirf.spi=&MirfHardwareSpi;
Mirf.init();

// Nombre que le damos a este módulo NRF24L01.

// seria el equivalente a la ip de un ordenador. 5 bytes maximo.

Mirf.setRADDR((byte *)"TX_01");

// Payload, en bytes, a transmitir (es decir, un número entre 0 y 255). Si quiere mandar dos datos, ponemos un 2 (en vez de un 1), y así hasta cuantos datos queramos enviar

Mirf.payload = 1;

// el canal por el cual estaremos transmitiendo (el mismo que hemos puesto en el emisor)
Mirf.channel = 32;

// Esto inicia el mirf y borra la lista FIFO
Mirf.config();

}

void loop()
{
byte c;
// comprobamos que no hay datos a recibir.

if( Mirf.dataReady() )
{
// recibimos la información  y lo almacenamos en c

Mirf.getData(&c);

if(c==1)
{
digitalWrite(led,HIGH);
}

else
{
digitalWrite(led,LOW);
}

// imprimiremos en el puerto serial el estado que recibimos del PIR
Serial.print("El valor es: ");
Serial.println(c);
}
}


A continuación os dejo un vídeo con la demostración:



Como hemos comentado en el código, enviamos un byte, es decir, un número entre 0 y 255. Para este ejemplo no hemos tenido problemas ya que enviabamos un 0 ó un 1. Si queremos enviar señales analógicas, lo mejor es realizar una escala de 0 a 100 para poder enviarlo, es decir, convertir el valor analógico en el programa del emisor, enviarlo y si luego se desea, desconvertir el valor en el programa del receptor.
El código para realizar esta conversión es:

position = map(humedad, 0, 1023, 0, 100);

Los dos primeros valores indican el valor mínimo y máximo que alcanza el instrumento analógico y los dos siguientes valores indican el valor mínimo y máximo que queremos que alcancen. En este caso el 0 analógico equivaldria a 0% y el 1023 analógico a 100%.