Utilizzare un sensore PIR per creare un rilevatore di movimento per sistema di allarme

Un rilevatore di movimento è utile non solo per i sistemi di allarme domestici ma anche per rilevare animali che si intrufolano in ambienti chiusi o aperti.
La realizzazione di questo sistema è semplice e richiede un investimento esiguo. Ho acquistato per circa 8€ un sensore PIR (Passive Infra-Red) della Parallax molto compatto che dispone di una lente di Fresnel e di un circuito di amplificazione che lo rende molto sensibile e capace di rilevare corpi in movimento a distanze di qualche metro.
I pin di collegamento di questo modulo sono tre di cui due per l’alimentazione ed uno per l’uscita del segnale.

Sensore infrarosso di movimento

L’uscita è un singolo bit, alto quando viene rilevato un movimento e basso in mancanza di rilevamento. L’alimentazione del dispositivo può variare da 3 a 6 Vdc.
Il sensore dispone anche di un selettore per aumentare o diminuire la sua sensibilità.

Impiegare questo sensore in un circuito risulta veramente semplice sia nei collegamenti hardware sia nella gestione software.
Vediamo insieme come impiegarlo utilizzando Arduino UNO con lo schema seguente:

Arduino PIR Sensor

L’uscita del sensore è collegata al pin2 dell’Arduino UNO precedentemente configurato via software come ingresso. La resistenza da 10Kohm, posta tra il pin2 e la massa, serve per creare un riferimento verso certo (pull-down) per evitare false letture.

Il codice di esempio permette di leggere, a tempi ciclici, lo stato dell’uscita del sensore PIR e di spedire tramite seriale questo valore. L’invio del dato risulta interessante per creare un log dei rilevamenti del sensore, magari per creare dei grafici o memorizzarli per una futura consultazione.
Un sistema di allarme che si rispetti possiede giustamente un attuatore necessario a far demordere il tentativo di furto o intrusione tramite una sirena o degli indicatori luminosi. Questo può avvenire tramite i pin dell’Arduino non utilizzati per pilotare dei relè che agiscono sulla sirena o sulle luci.

int StatoSensore = 0;

void setup()
{
//Init Seriale
Serial.begin(9600);
//Config porta 2 come ingresso
pinMode(2, INPUT);

}

void loop()
{
//leggo segnale Sensore PIR
StatoSensore = digitalRead(2);
//Invio dati alla seriale
Serial.print(StatoSensore);
//Lettura ogni secondo
delay(1000);

}

 

Sebbene questo codice funzioni, risulta poco efficace in quanto l’invio dei dati avviene a prescindere dallo stato rilevato dal sensore quindi credo sia meglio inviarli solamente quando questo rileva un movimento. Aggiungendo un blocco if otteniamo questa funzionalità:

/*
Marco Lai
Ago 2011
PIR Sensor with Parallax 555-28027
*/

int StatoSensore = 0;

void setup()
{
//Init Seriale
Serial.begin(9600);
//Config porta 2 come ingresso
pinMode(2, INPUT);

}

void loop()
{
//leggo segnale Sensore PIR
StatoSensore = digitalRead(2);

//invia i dati solo se rilevo un movimento
if (StatoSensore == HIGH)
//Invio dati alla seriale
Serial.println("PIR ATTIVO");

//Lettura ogni mezzo secondo
delay(500);

}

 

Il dato viene inviato tramite la porta USB per ogni rilevazione di movimento. Questi dati possono essere acquisiti tramite un software capace di leggere dalla porta seriale. Il software deve semplicemente configurarsi per leggere dalla stessa porta che hai selezionato per programmare l’Arduino UNO:

Seleziona porta dove è collegato Arduino Uno

Arduino in Risorse del Computer

Nel mio caso è la COM4 e di seguito uno spezzone di codice C# utilizzato per leggere dalla porta:

//seleziono nome porta dove è mappato l'Arduino UNO
serialPort1.PortName = "COM4";
//apro la porta seriale
serialPort1.Open();
//creo un gestore di evento per la ricezione
serialPort1.DataReceived += new SerialDataReceivedEventHandler(Data_RX);

 

Data la sua utilità realizzare un sistema di allarme è, grazie a questo sensore, una procedura molto semplice e rapida da realizzare. Nulla ci vieta di utilizzare più sensori PIR per tenere sotto controllo più aree. Questo sensore avendo anche una buona corrente in uscita si presta ad essere collocato anche a diversi metri di distanza dalla board Arduino.