Módulo NRF24L01

Tutorial Arduino: Módulo NRF24L01

Hola tecnólogos, en nuestro post de hoy, pondremos en marcha el módulo de radiofrecuencia NRF01L24. Este módulo es un recurso muy útil para la transmisión de datos entre dos Arduinos de forma inhalámbrica. Sin embargo aun hay poca información sobre el en internet.
Para dar nuestros primeros pasos con el NRF24L01, haremos un proyecto en el que activaremos un led a distancia pulsando un boton instalado en el Arduino emisor.

Materiales necesarios:

2 x Arduino UNO
2 x Modulo RF NRF24L01
2 x Protoboard
1 x Pulsador
1 x Led
1 x Resistencias
1 x Cables de conexión

Conozcamos mejor el NRF24L01.

Este módulo puede funcionar como emisor y como receptor. Fácil de usar con cualquier tipo de microcontrolador AVR, ARM, Arduino, Raspberry Pi…

Características.

-Frecuencia: 2.4 GHz ~ 2.5 GHz
-Tensión de funcionamiento: 3 ~ 3.6V Max 
-Corriente: 115 mA 
-Multi-frecuencia: 125 Frecuencias
-Alcance: 700-1000 metros para la versión con amplificador y 20-30 metros para la versión sin amplificador.

-Soporta hasta seis canales de recepción de datos

Posición de pines

Vista inferior del módulo NRF24L01.Vista superior del módulo NRF24L01.
pines nrf24l01arduino nrf24l01

Esquema de conexión con Arduino

Este esquema de conexión es común para todos los proyectos en los que se necesite el módulo de radiofrecuencia NRF24L01. En nuestro caso, lo usaremos tanto para el emisor como para el receptor.

conexion nrf24l01

Practicando con el NRF24L01

Esta es la parte que más nos gusta a todos, la parte en la que ponemos en marcha nuestros cacharros. 
En esta práctica encenderemos un led a distancia instalado en el Arduino receptor, accionando un pulsador conectado a nuestro arduino emisor y transmietiendo esta acción por radiofrecuencia con la ayuda del modulo NRF24L01.
El primer paso para realizar el proyector es montar nuestro emisor y nuestro receptor como nos indica los siguientes esquemas.

NOTA: En nuestro caso, para hacer las prácticas, usamos el NRF24L01 con amplificador y antena, aun así este tutorial tambien nos ayudará a usar el NRF24L01 sin amplificador ya que la forma de manejarlo es exatamente la misma.

Conexiones.

NOTA: El módulo NRF24L01 se conecta a Arduino del mismo modo que vimos en el esquema de más arriba.

Conexión del pulsador del sistema emisor.Conexión del led del sistema receptor.
pulsador arduinoled arduino

Código.

Una vez montado los dos sistemas procedemos a cargar el código correspondiente en cada uno de ellos.

Código emisor.

/**
Tutorial Arduino: Módulo NRF24L01
Más información en:
http://www.leantec.es/blog/44_Tutorial-Arduino--Modulo-NRF24L01.html

 * Pins del SPI:
 * Hardware SPI:
 * MISO -> 12
 * MOSI -> 11
 * SCK -> 13
 */
 
//Incluimos las librerías necesarias
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

void setup(){
  Serial.begin(9600);
  Mirf.cePin = 8;                  // Cambiamos el pin CE al 8
  Mirf.csnPin = 7;                // Cambiamos el pin CSN al 7
  Mirf.spi = &MirfHardwareSpi;     // Configuramos el SPI de Arduino por Hardware
  Mirf.init();                     // Inciamos el módulo de RF
  Mirf.setRADDR((byte *)"clie1");  // Indicamos la dirección para recibir datos
  Mirf.payload = 1;                // Indicamos el número de datos que se espera recibir
  Mirf.config();     // Configuramos el módulo de RF 
  pinMode(3, INPUT); //Configuramos el pin 3 como entrada para leer el estado del pulsador
}

void loop(){
  uint8_t estadoPulsador[1];        // Variables modificadas según valor del pulsador
  estadoPulsador[0]=digitalRead(7); // Leemos el pulsador

  Mirf.setTADDR((byte *)"serv1");  // Configuramos la dirección a donde vamos a enviar los datos
  Mirf.send(estadoPulsador);       // Enviamos los datos 
  while(Mirf.isSending()){}        // Esperamos que termine la emisión
}
  

Código recpetor.

/**
  Tutorial Arduino: Módulo NRF24L01
  Más información en:
http://www.leantec.es/blog/44_Tutorial-Arduino--Modulo-NRF24L01.html

 * Pins:
 * Hardware SPI:
 * MISO -> 12
 * MOSI -> 11
 * SCK -> 13
 *
 * Configurable:
 * CE -> 8
 * CSN -> 7
 *
 */

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

int led=4; //Declaramos el led en el pin 4
unsigned long time=0;// Variable para controlar el tiempo entre dato y dato
int estadoled=0;   //Variable para almacenar el estado del rele

//----------------------------- Configuramos Ardunio ---------------------------------------
//------------------------------------------------------------------------------------------
void setup(void){
  Serial.begin(9600);
  Mirf.cePin = 8;                // Cambiamos el pin CE al pin 8 de arduino
  Mirf.csnPin = 7;              //Cambiamos el pin CSN al pin 7 de arduino
  Mirf.spi = &MirfHardwareSpi;    // Configuramos el SPI de Arduino por Hardware
  Mirf.init();                    // Inciamos el módulo de RF
  Mirf.setRADDR((byte *)"serv1"); // Indicamos la dirección para recibir datos
  Mirf.payload = 1;// Indicamos datos que se espera recibir(1, estado del pusador)
  Mirf.config();                  // Configuramos el módulo de RF
  time=0;                         // Ponemos a 0 el tiempo
  pinMode(led, OUTPUT);             // Configuramos el pin 6 como salida del led

}
//--------------------------- Arrancamos el programa ---------------------------------------
//------------------------------------------------------------------------------------------
void loop()
{
  byte datos[1];      // Buffer para almacenar los datos
  if(!Mirf.isSending() && Mirf.dataReady()){ // Esperamos recibir un dato
    Mirf.getData(datos);       // Copiamos al buffer los datos recibidos
    time = millis();           // Almacenamos el tiempo en la variable

    if(datos[0]==1){ //El estado del led cambia cada vez que el pulsador esta activado(una sola vez)
      estadoled=!estadoled;
      digitalWrite(led, estadoled);
      while(datos[0] == 1){
        Mirf.getData(datos);       // Copiamos al buffer los datos recibidos
      }
    }  
  }

  if ( ( millis() - time ) > 1000 ) {//Comprobamos si desde la última vez que recibimos un dato hasta ahora ha pasado mas de 1 seg

    Serial.println("Error de recepcion de datos"); //Línea para ver en el terminal que recibe  
    delay(500);                         //Paramos 0,5 seg 
  }
  else{                                 //Si todo está correcto y estamos recibiendo datos, seguimos

  }

}

Al igual que podemos encender un led, este sistema nos puede ayudar, por ejemplo a activar un rele a distancia, o enviar datos de sensores al Arduino receptor, controlar un vihículo con control remoto…etc.

Etiquetas: , , ,

4 Comments

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *