Usando NRF24L01 y Sensor PIR con Arduino

En este tutorial les enseñare como es el uso del sensor de movimiento PIR desde como funciona, como conectarlo y el como se programara en nuestro Arduino.

Podemos encontrar varios tutoriales sobre nuestro sensor de movimiento, pero nosotros haremos la diferencia ya que ademas de usar nuestro PIR usaremos un dispositivo de radio frecuencia  (NRF24l01) con el cual comunicaremos dos arduinos mientras usamos nuestro sensor, de igual forma que nuestro sensor te explicare lo básico sobre este componente .

Sensor de movimiento PIR

El sensor PIR “Passive Infra Red” es un dispositivo piroelectrico que mide cambios en los niveles de radiación infrarroja emitida por los objetos a su alrededor a una distancia máxima de 6 metros. Como respuesta al movimiento, el sensor cambia el nivel lógico de un “pin”, por lo cual, su uso es extremadamente simple.PIR

Características Técnicas

  • Voltaje de Alimentación = 5 VCD:
  • Rango de medición = hasta 6m
  • Salida = estado de un pin TTL.
  • Polaridad de activación de salida seleccionable
  • Mínimo tiempo de calibración

Bien ahora sabemos que nuestro sensor PIR mide los cambios de radiación infrarroja, solo queda indagar, ¿Cómo es la operación de nuestro PIR?

Todos los objetos con una temperatura por encima del cero absoluto emiten calor, la energía en forma de radiación. Por lo general, esta radiación es invisible para el ojo humano, ya que irradia en longitudes de onda infrarrojas, pero puede ser detectado por dispositivos electrónicos diseñados para tal propósito es ahí donde entra nuestro sensor PIR, este sensor posee elementos fabricados de un material cristalino que genera una carga eléctrica cuando se expone a la radiación infrarroja. Los cambios en la cantidad de radiación producen cambios de voltaje los cuales son medidos por un amplificador. Dicho dispositivo contiene unos filtros especiales llamados lentes de Fresnel que enfocan las señales infrarrojas sobre el elemento sensor. Cuando las señales infrarrojas del ambiente donde se encuentra el sensor cambian rápidamente, el amplificador activa la salida para indicar movimiento. Esta salida permanece activa durante algunos segundos permitiendo a nuestro Arduino saber si hubo movimiento.

Transceptor NRF24l01

Los transceptores NRF24L01 son una serie de módulos de radio de 2,4Ghz, El rango es muy dependiente de la situación de los transceptores y tienen mucho más alcance cuando están en la línea de visión, al aire libre que en interior, con obstáculos como paredes y otros materiales. La distancia normal que indican los distintos proveedores para el módulo de baja potencia es de unos 50 metros.

Ahora hay que identificar un poco más nuestro dispositivo empezando con sus pines, para lo cual te dejo esta pequeña tabla. Para identificar el orden de lo pines es de izquierda a derecha e iremos descendiendo, nuestro pin 1 será el que está encerrado por un cuadro blanco.

nrf24l01

Señal PIN
GND 1
VCC 2
CE 3
CSN 4
SCK 5
MOSI 6
MISO 7
IRQ 8

El 24l01 necesita una alimentación de 3.3v la cual podremos tomar de nuestro Arduino pero hay que tener en cuenta que estamos usando un dispositivo de baja potencia si nosotros llegamos a usar uno de alta potencia será necesario conectar una fuente de 3.3v externa. También cabe mencionar que por los picos de voltaje será necesario utilizar un capacitor  cerámico de 0.1uf.

Te daré una pequeña explicación de los demás pines pero si quieres tener una información más clara te dejo esta guía en donde podrás revisar más información  acerca del NRF24L01

CE: Este pin es usado para control de trasmisión recepciones según el modo en el que este se encuentre TX o RX, teniendo en cuenta que también se puede hacer la configuración para que pueda transmitir y recibir datos.

La interface de SPI usa cuatro pines los cuales son el CSN, MISO, MOSI Y EL IRQ los cuales son encargados de realizar la trasmisión y recepción.

CSN: Este pin es el encargado de dar al habilitación para el bus SPI, este pin trabaja con niveles bajos en donde estar en dicho estado se mandara a obtención de datos sobre el bus.

SCK: este pin es el reloj de serial para el bus SPI

MOSI: Significa “Maestro fuera, esclavo en” que quiere decir esto, tomándolo a perspectiva el maestro es el microcontrolador y el esclavo es el 24l01 .Esto porque el 24l01 nunca envía datos sin haber sido solicitado al microcontrolador

MISO: Nuestro pin MISO en este caso será todo los contrario a nuestro pin MOSI en donde ahora nuestro esclavo mandara los datos al maestro

IRQ: Este pin es utilizado para generar interrupciones  en donde puedes llegar a configurar alarmas para cualquier combinación de los siguientes eventos, los datos recibidos, los datos transmitidos y el número máximo de trasmisión pero si no es utilizado lo recomendable es no conectarlo.

Teniendo en cuenta que hace cada uno de los pines tratemos de conectarlo a nuestro arduino. Para ello hay que tener en cuenta cual es la librería que queremos usar ya que dependiendo de la librería que usamos cambiaran un poco la forma de conexión de los pines.

Señal PIN Color de conexión Arduino pin para librería RF24 Arduino pin para  librería Mirf
GND 1 Negro GND GND
VCC 2 Rojo 3.3V 3.3V
CE 3 Azul 9 8
CSN 4 Café 10 7
SCK 5 Verde 13 13
MOSI 6 Blanco 11 11
MISO 7 Naranja 12 12
IRQ 8 2*

Para las descargas de la librería lo podrás hacer desde la página de arduino en donde podremos encontrar la descarga directa o en los repositorios de github. Recomendable que descarguen la Mirf ya que es la que utilizare en el tutorial.Como te comentaba ahora que observaste la tabla hay un cambio de pines si usamos la librería Mirf nuestro pin CE va en el pin 8 del arduino y el CSN va en el pin 7 en cambio sí usamos la librería RF24 nuestro CE cambiara al pin 9 del arduino y el CSN al 10.

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

conexion

Después de descargar la librería solo será necesario agregarla a nuestras librerías

Comenzaremos a armar, primero realizaremos uno usando el sensor de movimiento y después integraremos nuestro 24l01 en donde en un lado recibimos la señal del sensor y del otro lado encenderemos un led cuando se detecte movimiento.

Como vemos en el esquema, el sensor que estamos utilizando se alimenta directamente de los 5v que nos proporciona Arduino por lo que no será problema conectar su línea de señal directamente a un pin digital. Según las especificaciones del modelo la línea de señal en el sensor es 0 en estado de reposo y pasa a 1 cuando detecta movimiento así que podemos leer la señal como cualquier señal digital.

sensor

Ahora vallamos a nuestro Arduino y generemos nuestro código.

const int buttonPin = 2;
const int ledPin = 13; 
 
int buttonState = 0;
 
void setup() 
{
 pinMode(ledPin, OUTPUT); 
 pinMode(buttonPin, INPUT); 
 Serial.begin(9600);
}
 
void loop()
{
 buttonState = digitalRead(buttonPin);
 if (buttonState == HIGH) 
 { 
 digitalWrite(ledPin, HIGH); 
 } 
 else 
 {
 digitalWrite(ledPin, LOW); 
 }
 
 Serial.println(buttonState);
 
 delay(500);
}

El led que encenderá es que está integrado en nuestro Arduino, pero de igual forma puedes conectar un led para ver que encienda.

Hay que tener en cuenta que al energizarse el sensor PIR requiere de un tiempo de preparación para comenzar a operar de forma adecuada. Esto se debe a que tiene que ocurrir la adaptación a las condiciones propias de operación del ambiente donde fue instalado. Durante este periodo el sensor aprende a reconocer el estado de reposo o no movimiento del ambiente. La duración de esta calibración puede estar entre 10 y 60 segundos y es altamente recomendable la ausencia de personas mientras se calibra el sensor.

Ya que hemos utilizado nuestro sensor individual y comprobamos su funcionamiento correctamente. Integraremos nuestro nrf24l01 y para revisar que funciona adecuadamente dentro de los ejemplos que nos ofrece la librería Mirf abriremos el que se llama reg_read lo cargamos y cuando esté listo solo se necesitara abrir el puerto serial, este programa lo que ara es verificar el dispositivo si en la pantalla muestra un 1111 quiere decir que nuestro dispositivo está trabajando correctamente, si no lo muestra así puede ser que tengamos un error de conexión el cual hay que corregir.

Continuemos con la programación de nuestro emisor y receptor

bueno primero realicemos el programa de nuestro emisor te dejo una imagen de como se conecta por si tienes dudas

emisor

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

const int sensor=2;
int State=0;

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

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

 // Nombre que le vas a dar a ESTE NRF24L01. En el momento de tranmsitir al emisor tienes que señalarle este receptor

 // seria el equivalente a la ip de un ordenador. 5 bytes maximo.
 Mirf.setRADDR((byte *)"RX_99");

// payload de un byte
 Mirf.payload = 1;

 // indicamos el canal
Mirf.channel = 32;

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

// Set 1MHz data rate
Serial.print("iniciando..."); 
}

void loop()
{
 State=digitalRead(sensor);
Serial.println(State);

// nombre del NRF24l01 al que vamos a emitir. Del NRF24L01 DESTINO. 
Mirf.setTADDR((byte *)"TX_01");

//ahora vamos a emitir
Mirf.send((byte*)&State);

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

ahora que tenemos nuestro programa de el emisor empezamos con nuestro receptor igual te anexo una imagen de conexión

 

.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 vas a dar a ESTE NRF24L01. Si el alguien quiere emitir a ESTE equipo tiene que referirse a este nombre

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

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

// Payload, en bytes, a transmitir. Si quiere mandar dos datos, dos por por ejemplo, usa 2. 3 para tres... hasta 32

Mirf.payload = 1;
 
// el canal por el cual estaremos transmitiendo

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.printlnx(c);
}
}

Ahora tengan en cuenta que para cargar el programa lo pueden hacer uno por uno ó si tienen los dos conectados lo único que tendrán que hacer es cambiar el puerto serial  en el que se encuentra el Arduino.

Bueno si ya cargaste tus programas correctamente es hora de probarlos.

Espero y les funcione estaremos cargando el video en el canal de youtube de The Inventor´s House y nos vemos en el próximo tutorial no olviden dejar sus comentarios

28 opiniones en “Usando NRF24L01 y Sensor PIR con Arduino”

  1. Hola amigo existe algún inconveniente si utilizo el arduino Mega, porque ya cheque todas las conexiones y al momento de conectarlo con el ejemplo reg_read siempre aparece un 0, cuento con 2 rNF24 y sucede lo mismo con ambos

    1. Qtal amigo, mira la única diferencia de cuando usas el arduino mega es que los pines de conexión de nuestro dispositivo nrf cambian aquí te dejo las conexiones para el mega y espero que todo funcione bien.
      VCC- 3.3
      GND- GND
      MISO- 50
      MOSI- 51
      SCK- 52
      CE- 8
      CSN- 7

      1. You get a better quality insurance companies, surefind advanced driver’s program. It is because you made the decision making will then be stuck paying your bills on a young driver, you will realize in enough random fees theyand college students might need a preliminary guide. When you are likely to get my car was given a fake social number which is significantly higher premiums. Regardless of your Manyinsurance and ask your insurer that charges additional fees involved with any breakdown. Hence, it is a huge selection of insurers that offer a way to do a search that aremore: Actually, it’s not an easy step to getting the coverage that is affordable enough if ever that you are a web site where you live and park your caravan housedalso differ. A little investigation you can obtain car insurance premiums is very simple steps to take care of any mishap and will also supply accident services to the amount coverageHowever, one of those auto insurance won’t cover you. Other than having them to be safer and more people are now given themselves wonderful and delightful auto insurance quote from sameown car and if you are trying to build and maintain. But like everything else is being conscious of current car insurance policies. Firstly, they are earning enough they go onehundreds of dollars every year, killing more than one vehicle in an accident.

  2. Amigo, existe la manera de reemplazar el módulo bluetootoh por el módulo wifi NRF24L01? He desarrollado un carro con arduino uno y lo controlo con mi celular a através de un app creada en app inventor. Sin embargo deseo crear una aplicación y controlar vía wifi. Podrías ayudarme con ello?

  3. Hola,
    Tu tutorial es excelente y me ha funcionado a la perfección, pero he tratado de implementar mas nodos (módulos) para recibir información de varios emisores en un receptor y no lo he logrado. Podrías orientarme como puedo hacerlo. Gracias

  4. Alguien puede explicarme más o menos para que es necesario el capacitor de 0.1uf?

    Entiendo que es para proteger la placa de quemarla por las variaciones del voltaje, si es algo básico, porque es la primera vez que lo veo?

    En el resto de guías/tutoriales que he estado visitando no aparecen nunca.

    Gracias y un saludo.

    1. Me respondo a mi mismo 30 segundos después (irónicamente a pesar de buscar la respuesta y no encontrarla, publiqué el comentario preguntando mi duda, y justo después en la siguiente página que abrí me “medio aclararon” la duda).

      He leído que es para filtrar ruido, con esta información ya puedo seguir informandome.

  5. Hola,muy buena explicación de como utilizar el modulo con la librería Mirf, no lo eh probado todavía, y tengo una duda, la linea de receptor, donde dice “byte c;” y después se almacena en C también (Mirf.getData(&c);), que quiere decir esa letra “c”, es un valor que doy yo, y utilizo como valor para almacenar un dato? Y por cierto, si quiero prender por ejemplo dos leds, tendría que usar otro byte con otra letra para almacenarlo también?
    Muchas gracias.

    1. hola marcos excelente, gracias por tu explicación, pero puedes ayudarme ;
      como puedo enviar una letra para que el receptor prenda esa luz.
      gracias lo e intentado muchas veces pero no funciona( remplazar el pir por letras)
      viña del mar chile

  6. Amigo no sabes cuanto me funciono este tutorial, eres magnifico muchas gracias, precisamente voy a trabajar mi tesis de grado con este modulo, tenia muchas dudas de la programacion y conexion y sobre todo la libreria, ya que he encontrado muchas y no sabia cual escojer, pero con este tutorial se me despejaron todas las dudas, esta buenisimo MUCHAS GRACIAS MY BRO (Y)

  7. Buenas.
    Por si os sirve. He conectado el modulo al arduino nano con cables que tenia por ahi, de distinto tipo, largo, etc., y con muchos problemas. El programa reg_read me daba 0 y luego 0 y aveces 111111 (ojo 6 1s). Cambie los cables por latiguillos macho hembra (comprados) y funciono, sin necesidad de capacitores me da siempre 1111 el reg_read.
    La misma conexión con el mega el reg_read entrega siempre 1111.

    El problema es que no logro comunicar los 2, el emisor y receptor de esta pagina.
    El receptor lo dejo igual, pero el emisor he cambiado la lógica para que no funcione con el PIR y siempre cada 500ms envié un 1 al receptor. Pero al receptor no llega nada.

    Alguna forma de validar que cada uno funciona ok por separado aparte del reg_read.

    un saludo

  8. Hola, muchisimasss gracias me ha venido “al pelo” como decimos en mi tierra, voy a empezar un proyecto de una alarma con esto que nos habéis facilitado, espero que hagáis más y si me permitís la sugerencia, explicando un poco el tema de las funciones de la librería, vamos un poco más extenso y metido en materia.Saludos.

  9. hola amigo tengo un proyecto que no se como terminar no soy bueno en la programacion.. tengo un sensor pir un sensor de sonido un servo motor y varios led que debo instalar e configurar.. y no se como pero megustaria que me ayuden con la programacion si se puede gracias.

  10. Hola, del proyecto “Usando NRF24L01 y Sensor PIR con Arduino”.
    En la última línea del listado de la parte receptor, concretamente “Serial.printlnx(c);”, ¿ sobra la “x”?, si la mantengo al compilar me da error, y si la quito no.
    Muchas gracias.

  11. Buenas… Ya lo intente de mil maneras, pero no manda ni recibe, el recpetor prende el led en momentos y estando el emiso desconectado… Lo estoy haciendo con arduino nano.

  12. Hola, gracias por súper tutorial, lo siento mi español no es tan bueno.
    Por desgracia consigo al compilar el destinatario de este mensaje de error:

    se trata de la última línea:
    // imprimiremos en el puerto serial el estado que recibimos del PIR
    Serial.printlnx(c);

    sketch_feb18a_pir_empf:56: error: ‘class HardwareSerial’ has no member named ‘printlnx’
    Serial.printlnx(c);
    ^
    exit status 1
    ‘class HardwareSerial’ has no member named ‘printlnx’

    ¿me pueden ayudar tal vez

    muchas gracias

  13. Muchas Gracias
    Me funciono perfectamente con Arduino Mega como Receptor y un Arduino UNO como Emisor.
    Voy por un proyecto de controlar un Papalote (AeroMotor) controlado con 2 Arduinos .
    Uno para medir el nivel del tanque de agua y el otro para detener o activar el papalote, checando el nivel de agua del pozo..
    Salu2

  14. Hi,

    Agradecido por compartir su proyecto. Tengo este error boceto transmisor os mientras se verifican .
    estado de salida 1
    “Estado” no lo hace un tipo

    Se Alguien sabe cómo borrar esto?

    Muchas gracias,

    Chris
    (sorry for the mistakes ….translate from google translate)

  15. hola .. muy bueno el proyecto esta .. estoy asiendo un proyecto .. y es lo qe necesito grasias a ustedes voy a poder usarlo….

    pero tengo un problema con la programacion qe dejaron porqe cuando lo compilo me sale error .. osea qe algo esta mal ..
    me pueden decir porqe pasa eso ..?
    porfavor respondan
    gracias

Deja un comentario

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