in Arduino Spiegato Facile, Sensori Arduino

Sensori Arduino: sensore di movimento PIR HC-SR501

In questo primo articolo della nuova serie sui Sensori per Arduino andremo a descrivere le caratteristiche e il funzionamento del sensore di movimento PIR HC-SR501.

Partendo da alcuni aspetti fisici legati al suo funzionamento, illustreremo lo schema circuitale permettendone una comprensione approfondita, per poi concludere con un semplice esempio di utilizzo con Arduino. 

Sensore PIR HC-SR501, vista

Il sensore PIR (Passive InfraRed) è un sensore a infrarossi passivo in grado di fornire un segnale in uscita alto quando rileva nel suo campo visivo il movimento un corpo. 

Il principio di funzionamento si basa sul sensore di tipo piroelettrico, ovvero capace di generare un segnale a fronte di una fonte di calore. Tutto ciò che ci circonda emette energia sotto forma di radiazioni luminose. La maggior parte di queste radiazioni sono invisibili, in quanto a frequenza minore rispetto a quella dello spettro visibile.

Questi sensori sono invece in grado di apprezzare queste radiazioni nella banda dell’infrarosso emesse dai corpi e determinarne quindi il movimento. Le rilevazioni avvengono in conseguenza a repentine variazioni di temperatura: se infatti noi rimanessimo fermi per un po, il sensore non catturerebbe il nostro movimento! Ecco perchè sono spesso usati come sensori per sistemi antifurto.

” a nudo” senza la lente frontale: è possibile notare il sensore piroelettrico

Il termine passivo sta a indicare che il sensore non usa e/o emette alcuna energia per effettuare le rilevazioni (come ad esempio i sensori a ultrasuoni), ma al contrario misura le radiazioni IR emesse.

Il sistema a “finestre” usato per determinare il movimento.

Nel sensore sono presenti due “finestre” sensibili. Quando un corpo caldo passa difronte il sensore, intercetta inizialmente la prima finestra, provocando una differenza di potenziale. Successivamente intercetterà la seconda finestra, provocando una caduta di potenziale inversa, come illustrato di seguito.

Principio di funzionamento del sensore

Cambiando direzione, distanza o addirittura velocità del corpo in movimento, si nota un diverso segnale prodotto dal sensore, come illustrato di seguito (fonte: link): 

Segnale di uscita del sensore PIR al variare del movimento.

Le due “finestre” sensibili agli IR sono racchiuse in un contenitore metallico sigillato per desensibilizzare il sistema ai disturbi, alla temperatura e all’umidità. All’interno c’è un JFET utile ad adattare l’elevata impedenza dei sensori a favore dell’integrato di controllo.

Schema interno di un sensore piroelettrico (modello RE200B)

Il sensore in questione, modello HC-SR501 è realizzato su una scheda PCB: sul lato superiore si trova il vero e proprio sensore PIR coperto da una lente ottica, sul lato inferiore invece risiedono alcuni componenti e i pin per l’alimentazione e trasmissione dei dati. Tra i componenti visibili, si evidenziano due potenziometri (trimmer, in arancione) grazie ai quali è possibile variare, a seconda delle esigenze:

  • la distanza di sensibilità operativa del modulo, intervallo compreso tra 3-7 m;
  • i tempi di uscita del segnale, tra i 3-300 sec.

Inoltre, si può notare un jumper (o delle piazzole, a seconda della versione in possesso) a 3 poli grazie al quale si può commutare il funzionamento del modulo. In un caso (H), il segnale del sensore rimarrà alto fino a quando il movimento si arresta e solo se non viene rilevato un movimento, l’uscita diminuirà. Nell’altro caso (L), dopo alcuni secondi, determinati dal valore indicato dal trimmer, il segnale tornerà basso anche in presenza di movimento, per poi tornare alto.

La cupola è in realtà una lente di Fresnel per ottenere un migliore risultato di rilevazione da parte del sensore, collimando i raggi luminosi. Se utilizzato “a nudo”, l’area visiva si limiterebbe a quella definita dalle due “finestre”, rendendo quasi inservibile questo sensore. La presenza della lente amplia la visuale del sensore, estendendola di molto. Il fatto che non sia una lente normale, ma una lente di Fresnel, la rende sottile e facile da realizzare in plastica. Ma ancor più importante è la possibilità, con questa lente, di rilevare radiazioni provenienti da più direzioni possibili. 

Il modello HC-SR501 è adatto per essere usato con le schede Arduino, con tensione di alimentazione a 5 volt e logica in uscita a 3.3 volt.

Vista inferiore del sensore PIR HC-SR501

Di seguito lo schematico del circuito:

Schematico del modulo PIR HC-SR501

Verso la fine dell’articolo farò alcune considerazioni sulla veridicità di questo schematico, in quanto non corrisponde esattamente al modello fisico in mio possesso. Ma per la maggior parte dell’articolo farò riferimento a lui fino a dove non espressamente indicato.

Oltre al sensore PIR, sul PCB sono presenti alcuni componenti SMD e non. Si nota la presenza dell’integrato BISS0001 (integrato U4) per la gestione dei segnali in gioco e il regolatore di tensione LDO HT7133. Collegato a quest’ultimo è possibile notare, sul pin Vin, la presenza di un diodo (D1) di protezione nel caso di polarizzazione inversa.

Controllando il datasheet del HT7133, si nota che è un regolatore di tensione CMOS in grado di gestire fino a 24V in ingresso (davvero tanti per applicazioni comuni, ma è sempre meglio mantenersi larghi). Le specifiche elettriche dichiarano un consumo in corrente ISS di 4μA e una caduta di tensione di 100mV. Valori tutto sommato interessanti per un regolatore di questo tipo. 

HT7133 specifiche elettriche

La presenza del regolatore è richiesta per alimentare l’integrato BISS0001 e il PIR stesso, come visibile dallo schematico. Il BISS0001 è un integrato realizzato ad hoc per applicazioni di Motion Detection con PIR, utilizzando tecniche sia analogiche che digitali. Implementa alcune funzioni davvero interessanti che andremo ora a vedere.

Pinout dell’integrato BISS0001

Schema a blocchi interno dell’integrato BISS0001

Come è possibile vedere dalle immagini prese direttamente dal datasheet, il BISS0001 integra on device alcuni stadi di amplificatori operazionali per il condizionamento del segnale ottenuto dal sensore piroelettrico. 

Il segnale del PIR entra nel pin 14 dell’integrato, ovvero nel primo stadio di amplificazione in configurazione non invertente. L’uscita, pin 16, attraversando alcuni componenti esterni, rientra in un secondo stadio di amplificazione in configurazione invertente, tramite il pin 13. Per avere una idea più chiara di questi passaggi, ho ricreato gli stadi nella seguente figura.

Circuito di condizionamento del segnale

Già da questo secondo stadio, è possibile notare l’utilizzo di alcuni segnali di riferimento (VH, VM, VL e VR) interni all’integrato, utili in fase di condizionamento.

L’uscita del circuito di condizionamento sarà poi valutata tramite due comparatori analogici.

Dettaglio dello schema a blocchi interno del BISS0001: comparatori

Il confronto avviene rispetto ai segnali di riferimento VL e VH interni, dove VH > VL. L’uscita di COP1 è alta solo se il segnale in ingresso è maggiore di VH, mentre l’uscita di COP2 è alta solo se il segnale in ingresso è minore di VL.

Le uscite andranno in ingresso ad una porta logica OR la cui uscita dipenderà dai valori assunti in ingresso secondo la seguente tabella di verità (somma logica):

Tabella di verità della porta logica OR

L’uscita della OR quindi è alta solo se almeno uno dei due segnali è alto. Tutto questo circuito si traduce in: se il segnale condizionato è maggiore di VH o minore di VL, l’uscita della OR è alta. Ciò permette di irrobustire il segnale, rendendolo meno ambiguo in quanto otterremo in uscita un segnale netto, alto o basso, facilmente interpretabile per la logica digitale dell’integrato.

Un ultimo step prevede il passaggio per una porta logica AND a tre ingressi, che implementa una funzione interessante. Gli ingressi sono:

  • l’uscita ottenuta dalla OR, il nostro segnale;
  • direttamente controllato dall’integrato, per poter abilitare o disabilitare internamente il segnale in input;
  • uscita di un comparatore (COP3) i cui ingressi sono un segnale di riferimento VR (di valore molto basso) e il pin 9 dell’integrato.

Tralasciando momentaneamente l’ultimo ingresso, andiamo a concludere il path del segnale di ingresso fino all’integrato.

Una AND a 3 ingressi è descritto  dalla seguente tabella di verità (prodotto logico):

Tabella di verità della porta logica AND a 3 ingressi

Si deduce che l’uscita della AND è alta solo se tutti i segnali in ingresso sono alti. Questa porta logica torna utile per disabilitare totalmente l’ingresso all’IC da parte del sensore PIR, tramite l’ingresso controllato dall’IC stesso. 

Ma è presente un altro ingresso, quello riferito al pin 9. Di cosa si tratta?

Questo modulo PIR implementa un ulteriore funzione di disable input controllato esternamente, proprio tramite questo pin. La scheda prevede l’uso di un fotoresistore (LDR, dall’inglese Light Decreasing Resistance): sullo schematico è presente proprio il simbolo di un LDR connesso al pin 9 tramite un resistore da 1MΩ.

Nonostante la predisposizione, sulle schede in commercio non è presente alcun fotoresistore, ma solo le piazzole in cui saldarlo.

Ed è proprio in questa parte del circuito che ho trovato alcune incongruenze sullo schematico mostrato inizialmente. Un collegamento del genere, così com’è riferito a GND, non ha utilità. La variazione di resistenza del fotoresistore dovuta a più o meno luminosità non è rilevabile senza una tensione applicata.

Riferendosi invece allo schema di esempio applicativo fornito nel datasheet dell’integrato BISS0001, si nota che il resistore è in realtà un pull-up verso l’alimentazione a 3,3V creando così un partitore con il fotoresistore. Ho potuto confermare questo collegamento andando ad analizzare direttamente il PCB stampato. Di seguito, lo schema di utilizzo tipico a cui faccio riferimento:

Schema di esempio applicativo dell’integrato BISS0001

Con l’aggiunta di un fotoresistore introduciamo la funzionalità di disable input controllata dalla luce esterna: maggiore è l’intensità luminosa, più basso sarà il valore di resistenza ad esso associato.

Se c’è sufficiente luce, il pin 9 sarà portato a potenziale basso, in quanto il fotoresistore offrirà bassa resistenza; altrimenti il pin 9 sarà alto. Ciò influenzerà l’uscita della porta AND analizzata precedentemente e permetterà o meno la rilevazione del movimento. Dal datasheet:

  • Quando VC> 0,2 * VCC (= 0,66 V), il controller è abilitato
  • Quando VC <0,2 * VCC (= 0,66 V), il controller è disabilitato

Applicando la formula del partitore di tensione e le indicazioni fornite dal datasheet, si ha:

{ V }_{ C }=\frac { { R }_{ LDR } }{ { R }_{ LDR }+{ R }_{ 1M } } { V }_{ CC }=0,2{ V }_{ CC }

Da questa equivalenza, ricaviamo:

\frac { { R }_{ LDR } }{ { R }_{ LDR }+{ R }_{ 1M } } =0,2

da cui, tramite semplici passaggi matematici, otteniamo:

{ R }_{ LDR }=250k\Omega

Ovvero il valore di soglia di resistenza assunta dal LDR per far commutare lo stato da abilitato a non.

Questa funzione è molto utile nei casi in cui è richiesta l’attivazione del sensing solo in assenza di luce. Collegando ad esempio il sensore PIR ad un sistema di iluminazione, non vorremmo che la luce si accenda anche quando, di luce, già ce n’è! In questo caso la luce verrà accesa solo quando, notando un movimento, la luce sarà molto bassa.

L’introduzione di un LDR non influenza comunque la chiusura della lente, integrandosi perfettamente con gli spazi. Di seguito, un esempio:

” a nudo” senza la lente frontale: la presenza del LDR non disturba il sensore piroelettrico

Oltre alle piazzole per inserire e saldare il fotoresistore, sono presenti altre due piazzole vuote indicate sul PCB con RT: si tratta di una predisposizione per un termistore o un resistore sensibile alla temperatura. L’aggiunta di un termistore permette al modulo HC-SR501 di essere utilizzato in condizioni estreme. All’aumentare della temperatura ambientale, la distanza di rilevamento del movimento è inferiore. La presenza del termistore permette la compensazione della temperatura, mantenendo prestazioni accettabili.

Lo stadio di uscita integra due timer, Tx e Ti:

  • Tx indica per quanto tempo l’uscita rimane alta dopo aver rilevato il movimento
  • Ti indica per quanto tempo il LED è spento quando non c’è movimento. 

Come riportato sul datasheet:

Il resistore R10 corrisponde, nel secondo schema di esempio, al trimmer discusso inizialmente. Agendo su di esso, andremo a variare proprio questo timer. Questo trimmer risulta connesso in serie ad un resistore da 10kΩ. Considerando i valori utilizzati con C6=0,01uF, ruotando totalmente in senso orario (ovvero R10=1MΩ) avremo:

{ T }_{ x }=24576\cdot (1M\Omega +10k\Omega )\cdot 0,01\mu F\approx 250\quad secondi

Nel caso in cui il trimmer sia totalmente ruotato in senso antiorario (R10=0Ω) avremo:

{ T }_{ x }=24576\cdot (0\Omega +10k\Omega )\cdot 0,01\mu F\approx 2,50\quad secondi

Otteniamo un intervallo di tempi ampio, permettendo interessanti applicazioni. Ad esempio, mantenere accesa la luce per x secondi dall’ultimo movimento rilevato.

Il timer Ti non espone alcun trimmer e non può essere regolato. Considerando i valori utilizzati con R9= e C7= avremo:

{ T }_{ i }=24\cdot 1M\Omega \cdot 0,1\mu F\approx 2,40\quad secondi

L’uscita è portata al pin OUT tramite un resistore da 1kΩ.

Per quanto visto fino ad ora, il sensore fornisce in uscita un segnale di tipo digitale, facilmente utilizzabile da un microcontrollore basato ad esempio su Arduino.

Realizziamo un piccolo esempio con il sensore PIR e il microcontrollore. Il collegamento ad Arduino risulta estremamente semplice, come in figura:

Circuito realizzato

Si collega l’alimentazione (5V e GND) direttamente ad Arduino e l’uscita del segnale del sensore ad un pin digitale, ad esempio il pin D2.

Un codice base di funzionamento può essere il seguente:

int pir = 2;
int stato;
int led = 3;

void setup() {
Serial.begin(9600);
pinMode(pir, INPUT);
pinMode(led, OUTPUT);
}

void loop() {
stato = digitalRead(pir);
Serial.println(stato);
if (stato == HIGH) {
Serial.println("movimento rilevato");
digitalWrite(led, HIGH);
} else {
Serial.println("nessun movimento rilevato");
digitalWrite(led, LOW);
}
}

Effettuate le connessioni e caricato il codice, è possibile testarne il funzionamento. Al passaggio di un corpo, il sensore ne rileva il movimento e accende il led. L’uscita rimarrà alta seguento le tempistiche del timer regolate dal trimmer: in questo esempio ho dato il valor minimo per rendere visibile il risultato. Il jumper è impostato su H, quindi il timer si aggiorna ad ogni rilevazione di movimento, come illustrato nel seguente video:

Un esempio più sicuramente più utile e complesso è stato illustrato in un articolo della serie Antima for IoT, con un sacco di spunti e perfettamente descritto, raggiungibile da questo link.


Per questo articolo è tutto.

Per dubbi, errori o semplicemente ringraziamenti, puoi contattarci attraverso i nostri contatti social.

Puoi seguirci sul sito: www.antima.it
Instagram: https://www.instagram.com/antima.it/
Facebook: https://www.facebook.com/Antima.it/
Youtube: https://www.youtube.com/channel/UC-D8OGdMdveQILJeQvh8atQ

Scrivi un commento

Commento