Site icon Meccanismo Complesso

Il PIR motion detector – un sensore di movimento per Raspberry (parte 2)

Meccanismo Complesso - The PIR motion detector banner 3
Meccanismo Complesso - The PIR motion detector banner

Questa è la seconda parte dell’articolo pubblicato che riguardava i sensori di movimento PIR, spiegandone i dettagli tecnici sul loro utilizzo e funzionamento (vedi qui). In questo articolo, continueremo l’argomento vedendo come utilizzarli in modo pratico utilizzando una scheda Raspberry (nel mio caso un Raspberry Pi Model B+).

[wpda_org_chart tree_id=24 theme_id=50]

Connettere il PIR al Raspberry

Continuiamo quindi, precisamente dal punto in cui avevamo interrotto l’articolo, cioè con lo schema di connessione realizzato con il software Fritzing. Ma questa volta lo vediamo con la scheda Raspberry Pi. Realizziamo quindi il circuito referendoci allo schema sottostante.

Nel precedente articolo avevamo visto che a seconda del modello di PIR, il colore, la funzionalità e la disposizione dei tre cavi in uscita potrebbe variare. Quindi, prima di fare qualsiasi collegamento, è importante controllare sul datasheet del modello in possesso.

Nello schema appena mostrato ho basato i collegamenti sul mio tipo di PIR, il modello SE-10. Se il vostro modello dovesse risultare diverso, e soprattutto avere dei cavi diversi, modificate i collegamenti di conseguenza. Nello schema il cavo rosso rappresenta l’alimentazione +5V, il bianco il GROUND, ed il nero l’ALARM che è il segnale di rilevazione proveniente dal sensore. Dallo schema potete notare l’utilizzo anche di una resistenza, questa deve essere da 1KΩ.

Per costruire tutti i collegamenti tra il sensore PIR e i pin GPIO su Raspberry Pi, utilizzeremo una breadboard. Prendiamo poi il sensore PIR e facciamo i seguenti collegamenti dei tre cavi:

Adesso prendiamo altri tre cavetti jumper, cercando di far corrispondere i colori alla loro funzione.

Inseriamo poi una resistenza da 1kΩ nella breadboard facendo in modo che un’estremità sia inserita nel rail con i due cavetti neri e l’altra estremità con un altro rail vuoto. Infine connettiamo questo rail vuoto al rail positivo (+) utilizzando possibilmente un altro cavetto jumper di colore Rosso (5V).

Se abbiamo seguito correttamente tutte le operazioni dovremmo ottenere un circuito identico a quello rappresentato nello schema di Fritzing precedente. Nel mio caso ho realizzato il circuito come nella figura seguente.

Adesso che il lavoro per preparare i collegamenti è terminato, passiamo alla parte dello sviluppo del codice in Python. Questo codice attiverà il sensore PIR collegato al Raspberry e tramite il canale ALM ci invierà un segnale ogni volta che rileverà un qualsiasi movimento.

Più precisamente, dovremo dapprima impostare il pin GPIO 7 come input e poi leggere, durante l’esecuzione del programma, lo stato voltaggio di questo pin. Questo assumerà due stati: LOW o HIGH. Lo stato HIGH (3.3V) viene assunto quanto il PIR non rileva alcun movimento, lo stato LOW (0V) invece quando un movimento viene rilevato.

Primo esempio: segnalazione di un movimento rilevato.

Come primo esempio, scriveremo un semplicissimo programma per segnalare su riga di comando quando viene rilevato un movimento e quando no. Quindi passiamo direttamente alla parte di codice. Apriamo un qualsiasi editor di testo e nomiamo il file come pir01.py.

La prima cosa da fare è quella di importare le librerie necessarie per lavorare con le GPIO su Python. Importiamo anche la libreria time, che ci servirà per alcune sue funzioni per gestire i tempi di esecuzione. Infine impostiamo il tipo di numerazione dei pin GPIO.

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

Ora impostiamo il il pin GPIO 7 come canale di input ( quello che dovrà leggere lo stato HIGH o LOW del sensore PIR).

pirPin = 7
GPIO.setup(pirPin, GPIO.IN)

Abbiamo detto che Raspberry dovrà leggere in continuazione lo stato del sensore PIR e quindi abbiamo bisogno di inserire la lettura all’interno di un ciclo di iterazione infinito (loop).

while True:
    if GPIO.input(pirPin) == GPIO.LOW
         print "Motion detected!"
    else:
         print "No motion"
    time.sleep(0.2)

Se lo stato del canale ALM del PIR è LOW, la condizione sarà soddisfatta e quindi stamperemo un messaggio per segnalare che un movimento è stato rilevato. Se invece la lettura si trova nello stato HIGH, la condizione if non è soddisfatta e si stamperà un altro messaggio.

Questo è il cuore del programma. Infatti in casi più complessi, nei vostri esperimenti a casa, potrete inserire l’azione da effettuare in risposta ad un movimento rilevato, all’interno della condizione if, come per esempio, lo scatto di una foto nella stanza per vedere cosa o chi si è mosso.

Il codice completo dovrebbe apparire quanto segue. Abbiamo aggiunto un try-except per gestire in modo pulito l’uscita dal programma in loop (CTRL+Z), e resettare lo stato dei pin della GPIO.

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
pirPin = 7
GPIO.setup(pirPin, GPIO.IN)

try:
    while True:
        if GPIO.input(pirPin) == GPIO.LOW:
            print "Motion Detected!"
        else:
            print "No motion"
        time.sleep(0.2)
except KeyboardInterrupt:
    GPIO.cleanup()

Una volta completato il programma, possiamo eseguirlo. Tramite una sessione SSH, lancio il programma da remoto (su un PC) scrivendo a riga di comando

$ sudo python pir01.py

Immediatamente il programma comincerà a scrivere “No Motion”. Ogni volta che effettuo un movimento con il braccio o con la testa otterrò la scritta “Motion Detected!”.

Exit mobile version