.. note:: Ciao, benvenuto nella Community SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Approfondisci l’uso di Raspberry Pi, Arduino ed ESP32 con altri appassionati. **Perché unirsi?** - **Supporto tecnico**: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del team. - **Impara e condividi**: Scambia consigli e tutorial per migliorare le tue competenze. - **Anteprime esclusive**: Ottieni accesso anticipato a nuove presentazioni di prodotti. - **Sconti speciali**: Goditi sconti esclusivi sui nostri prodotti più recenti. - **Promozioni e omaggi**: Partecipa a promozioni e omaggi speciali. 👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso! 2.2.4 PIR =========== Introduzione --------------- In questo progetto, costruiremo un dispositivo utilizzando un sensore piroelettrico a infrarossi per il rilevamento del corpo umano. Quando qualcuno si avvicina al LED, questo si accenderà automaticamente. In assenza di movimento, il LED si spegnerà. Questo sensore di movimento a infrarossi è un tipo di sensore capace di rilevare l’infrarosso emesso da esseri umani e animali. Componenti -------------- .. image:: img/list_2.2.4_pir.png Principio ------------ Il sensore PIR rileva la radiazione infrarossa emessa dal calore corporeo, rendendolo adatto per rilevare la presenza di esseri viventi che emettono radiazione termica infrarossa. Il sensore PIR è suddiviso in due slot collegati a un amplificatore differenziale. Quando un oggetto stazionario si trova di fronte al sensore, i due slot ricevono la stessa quantità di radiazione e l'uscita è zero. Se un oggetto in movimento è davanti al sensore, uno degli slot riceve più radiazione dell’altro, provocando una variazione dell'uscita in alto o in basso. Questa variazione nella tensione di uscita indica la rilevazione di un movimento. .. image:: img/image211.png :width: 200 Dopo il collegamento del modulo di rilevamento, segue un periodo di inizializzazione di circa un minuto. Durante questa fase, il modulo potrebbe emettere segnali di uscita per 0~3 volte a intervalli. Successivamente, il modulo entra in modalità standby. È importante evitare che la luce o altre fonti di disturbo interferiscano con la superficie del modulo per evitare attivazioni accidentali dovute a segnali di interferenza. Anche il vento può interferire con il sensore, quindi è preferibile utilizzare il modulo in ambienti senza troppa corrente d’aria. .. image:: img/image212.png :width: 400 **Regolazione della distanza** Ruotando in senso orario la manopola del potenziometro di regolazione della distanza, il raggio di rilevamento aumenta, fino a un massimo di circa 7 metri. Ruotandola in senso antiorario, la distanza di rilevamento diminuisce fino a un minimo di circa 3 metri. **Regolazione del ritardo** Ruotando in senso orario la manopola del potenziometro di regolazione del ritardo, si aumenta il tempo di rilevamento, con un massimo di ritardo fino a 300 secondi. In senso antiorario, il ritardo diminuisce fino a un minimo di 5 secondi. Due modalità di attivazione: (selezionabili tramite il ponticello). - **H:** **Modalità di attivazione ripetibile**: dopo aver rilevato una persona, il modulo emette un segnale ad alto livello. Durante il periodo di ritardo, se qualcuno entra nel raggio di rilevamento, l'uscita rimarrà a livello alto. - **L:** **Modalità di attivazione non ripetibile**: emette un segnale ad alto livello quando rileva una persona. Dopo il ritardo, l'uscita passa automaticamente da alto a basso. Schema del circuito ------------------- .. image:: img/image327.png Procedure sperimentali ---------------------- **Step 1:** Costruire il circuito. .. image:: img/image214.png :width: 800 Per gli utenti di C ^^^^^^^^^^^^^^^^^^^^ **Step 2:** Vai alla cartella del codice. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/2.2.4/ **Step 3:** Compila il codice. .. raw:: html .. code-block:: gcc 2.2.4_PIR.c -lwiringPi **Step 4:** Esegui il file eseguibile. .. raw:: html .. code-block:: sudo ./a.out Dopo l’esecuzione del codice, il PIR rileva l'ambiente circostante e accende il LED RGB con un colore giallo se rileva qualcuno nelle vicinanze. Ci sono due potenziometri sul modulo PIR: uno per regolare la sensibilità e l'altro per la distanza di rilevamento. Per migliorare il funzionamento del modulo PIR, si consiglia di ruotarli entrambi in senso antiorario fino in fondo. .. image:: img/PIR_TTE.png .. note:: Se il codice non funziona o appare l'errore: \"wiringPi.h: No such file or directory\", consulta la sezione :ref:`faq_c_nowork`. **Codice** .. code-block:: c #include #include #include #define uchar unsigned char #define pirPin 0 // il PIR è collegato al GPIO0 #define redPin 1 #define greenPin 2 #define bluePin 3 void ledInit(void){ softPwmCreate(redPin, 0, 100); softPwmCreate(greenPin,0, 100); softPwmCreate(bluePin, 0, 100); } void ledColorSet(uchar r_val, uchar g_val, uchar b_val){ softPwmWrite(redPin, r_val); softPwmWrite(greenPin, g_val); softPwmWrite(bluePin, b_val); } int main(void) { int pir_val; if(wiringPiSetup() == -1){ // se l'inizializzazione fallisce, stampa un messaggio printf("setup wiringPi failed !"); return 1; } ledInit(); pinMode(pirPin, INPUT); while(1){ pir_val = digitalRead(pirPin); if(pir_val == 1){ // se il PIR rileva un livello alto ledColorSet(0xff,0xff,0x00); } else { ledColorSet(0x00,0x00,0xff); } } return 0; } **Spiegazione del Codice** .. code-block:: c void ledInit(void); void ledColorSet(uchar r_val, uchar g_val, uchar b_val); Queste funzioni sono usate per impostare il colore del LED RGB. Per ulteriori dettagli, fare riferimento a :ref:`1.1.2_rgb`. .. code-block:: c int main(void) { int pir_val; //…… pinMode(pirPin, INPUT); while(1){ pir_val = digitalRead(pirPin); if(pir_val == 1){ // se il PIR rileva un livello alto ledColorSet(0xff,0xff,0x00); } else { ledColorSet(0x00,0x00,0xff); } } return 0; } Quando il sensore PIR rileva lo spettro infrarosso umano, il LED RGB emette luce gialla; altrimenti emette luce blu. Per gli utenti Python ^^^^^^^^^^^^^^^^^^^^^^^^^ **Passaggio 2:** Vai alla cartella del codice. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python/ **Passaggio 3:** Esegui il file eseguibile. .. raw:: html .. code-block:: sudo python3 2.2.4_PIR.py Dopo l’esecuzione del codice, il sensore PIR rileva l’ambiente circostante e accende il LED RGB con una luce gialla se rileva qualcuno nelle vicinanze. Sul modulo PIR ci sono due potenziometri: uno per regolare la sensibilità e l'altro per la distanza di rilevamento. Per ottenere prestazioni ottimali dal modulo PIR, si consiglia di ruotarli entrambi completamente in senso antiorario. .. image:: img/PIR_TTE.png **Codice** .. note:: Puoi **Modificare/Reimpostare/Copiare/Eseguire/Interrompere** il codice qui sotto. Prima di procedere, però, assicurati di trovarti nel percorso del codice sorgente, ad esempio ``davinci-kit-for-raspberry-pi/python``. .. raw:: html .. code-block:: python import RPi.GPIO as GPIO import time rgbPins = {'Red':18, 'Green':27, 'Blue':22} pirPin = 17 # il sensore PIR è collegato al pin 17 def setup(): global p_R, p_G, p_B GPIO.setmode(GPIO.BCM) # Imposta la modalità GPIO su numerazione BCM GPIO.setup(pirPin, GPIO.IN) # Configura pirPin come input # Imposta tutti i LedPin come output e livello iniziale su Alto (3,3V) for i in rgbPins: GPIO.setup(rgbPins[i], GPIO.OUT, initial=GPIO.HIGH) # Configura ogni LED come canale PWM con frequenza di 2KHz p_R = GPIO.PWM(rgbPins['Red'], 2000) p_G = GPIO.PWM(rgbPins['Green'], 2000) p_B = GPIO.PWM(rgbPins['Blue'], 2000) # Inizializza il valore di tutti i LED a 0 p_R.start(0) p_G.start(0) p_B.start(0) # Definisce una funzione MAP per mappare i valori, ad esempio da 0~255 a 0~100 def MAP(x, in_min, in_max, out_min, out_max): return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min # Definisce una funzione per impostare i colori def setColor(color): # Configura la luminosità dei tre LED in base al valore colore in ingresso R_val = (color & 0xFF0000) >> 16 G_val = (color & 0x00FF00) >> 8 B_val = (color & 0x0000FF) >> 0 # Mappa i valori del colore da 0~255 a 0~100 R_val = MAP(R_val, 0, 255, 0, 100) G_val = MAP(G_val, 0, 255, 0, 100) B_val = MAP(B_val, 0, 255, 0, 100) # Assegna il valore del duty cycle mappato al corrispondente canale PWM per cambiare la luminosità p_R.ChangeDutyCycle(R_val) p_G.ChangeDutyCycle(G_val) p_B.ChangeDutyCycle(B_val) #print ("color_msg: R_val = %s, G_val = %s, B_val = %s"%(R_val, G_val, B_val)) def loop(): while True: pir_val = GPIO.input(pirPin) if pir_val==GPIO.HIGH: setColor(0xFFFF00) else : setColor(0x0000FF) def destroy(): p_R.stop() p_G.stop() p_B.stop() GPIO.cleanup() # Rilascia le risorse if __name__ == '__main__': # Inizio programma setup() try: loop() except KeyboardInterrupt: # Quando viene premuto 'Ctrl+C', viene eseguito destroy() destroy() **Spiegazione del Codice** .. code-block:: python rgbPins = {'Red':18, 'Green':27, 'Blue':22} def setup(): global p_R, p_G, p_B GPIO.setmode(GPIO.BCM) # …… for i in rgbPins: GPIO.setup(rgbPins[i], GPIO.OUT, initial=GPIO.HIGH) p_R = GPIO.PWM(rgbPins['Red'], 2000) p_G = GPIO.PWM(rgbPins['Green'], 2000) p_B = GPIO.PWM(rgbPins['Blue'], 2000) p_R.start(0) p_G.start(0) p_B.start(0) def MAP(x, in_min, in_max, out_min, out_max): return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min def setColor(color): ... Questi codici sono utilizzati per impostare il colore del LED RGB; per maggiori dettagli consulta :ref:`1.1.2_rgb`. .. code-block:: python def loop(): while True: pir_val = GPIO.input(pirPin) if pir_val==GPIO.HIGH: setColor(0xFFFF00) else : setColor(0x0000FF) Quando il PIR rileva lo spettro infrarosso di un essere umano, il LED RGB emette luce gialla; altrimenti emette luce blu. Immagine Dimostrativa ------------------------ .. image:: img/image215.jpeg