Nota

Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci l’esplorazione del Raspberry Pi, Arduino ed ESP32 con altri appassionati.

Perché unirti a noi?

  • Supporto esperto: Risolvi i problemi post-vendita e le sfide tecniche con l’aiuto della nostra comunità e del nostro team.

  • Impara e condividi: Scambia consigli e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Accedi in anteprima agli annunci di nuovi prodotti e alle anticipazioni esclusive.

  • Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni e omaggi festivi: Partecipa a omaggi e promozioni speciali durante le festività.

👉 Sei pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi stesso!

4.1.4 Fotocamera automatica di cattura

Introduzione

Quando sei fuori, gli scoiattoli del bosco potrebbero visitare il tuo davanzale. Creiamo una fotocamera automatica di cattura per immortalare queste piccole creature!

Componenti necessari

In questo progetto, avremo bisogno dei seguenti componenti.

../_images/3.1.18components.png

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

ELEMENTI IN QUESTO KIT

LINK

Kit Raphael

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE AI COMPONENTI

LINK PER L’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

Modulo Fotocamera

ACQUISTA

Modulo Sensore di Movimento PIR

-

Schema elettrico

T-Board Name

physical

wiringPi

BCM

GPIO17

Pin 11

0

17

../_images/1.1.18_schematic.png

Procedura sperimentale

Prima di iniziare questo progetto, assicurati di aver completato 3.1.1 Modulo Fotografico.

Passo 1: Costruisci il circuito.

../_images/3.1.18fritzing.png

Passo 2: Per collegare il modulo fotocamera e completare la configurazione, fai riferimento a: Modulo Fotocamera.

Passo 3: Accedi al Desktop del Raspberry Pi. Potresti aver bisogno di uno schermo per un’esperienza migliore, fai riferimento a: Connetti il tuo Raspberry Pi. Oppure accedi al desktop del Raspberry Pi da remoto, per un tutorial dettagliato fai riferimento a: Desktop Remoto.

Passo 4: Apri un Terminale ed entra nella cartella del codice.

cd ~/raphael-kit/python/

Passo 5: Esegui.

sudo python3 4.1.4_AutomaticCaptureCamera.py

Dopo l’esecuzione del codice, il PIR rileverà l’ambiente circostante e, se percepisce lo scoiattolo, la fotocamera scatterà una foto. L’intervallo tra le foto è di 3 secondi e il numero totale di foto scattate verrà mostrato nella finestra di stampa.

Ci sono due potenziometri sul modulo PIR: uno per regolare la sensibilità e l’altro per regolare la distanza di rilevamento. Per far funzionare meglio il modulo PIR, è necessario girarli entrambi completamente in senso antiorario.

../_images/PIR_TTE.png

Nota

Puoi anche aprire 4.1.4_AutomaticCaptureCamera.py nel percorso ~/raphael-kit/python/ utilizzando un IDE Python, clicca sul pulsante Esegui per eseguire e interrompi il codice con il pulsante Stop.

Codice

Nota

Puoi Modificare/Resettare/Copiare/Eseguire/Fermare il codice qui sotto. Ma prima di farlo, devi andare nel percorso del codice sorgente come raphael-kit/python. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l’effetto.

#!/usr/bin/env python3
import time
import os
import RPi.GPIO as GPIO
from picamera2 import Picamera2

# ----------------------------
# USER DIRECTORY
# ----------------------------
user = os.getlogin()
user_home = os.path.expanduser(f'~{user}')

# ----------------------------
# GPIO SETUP
# ----------------------------
PIR_PIN = 17  # PIR motion sensor connected to GPIO17

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIR_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

# ----------------------------
# CAMERA SETUP
# ----------------------------
camera = Picamera2()
camera.start()

print("Motion detection started. Press Ctrl+C to exit.")

# ----------------------------
# MAIN LOOP
# ----------------------------
try:
    i = 1
    while True:
        if GPIO.input(PIR_PIN) == GPIO.HIGH:
            filename = f"{user_home}/capture{i}.jpg"
            camera.capture_file(filename)
            print(f"Motion detected. Saved image #{i}: {filename}")
            time.sleep(3)
            i += 1
        else:
            print("waiting")
            time.sleep(0.5)

# ----------------------------
# KEYBOARD INTERRUPT
# ----------------------------
except KeyboardInterrupt:
    print("\nKeyboard interrupt received. Exiting program...")

# ----------------------------
# CLEANUP
# ----------------------------
finally:
    try:
        camera.close()
    except:
        pass

    GPIO.cleanup()
    print("Program exited cleanly.")

Spiegazione del Codice

  1. Legge la directory home dell’utente corrente per salvare le immagini catturate.

    user = os.getlogin()
    user_home = os.path.expanduser(f'~{user}')
    

    Questo ottiene il nome dell’utente attivo e costruisce il percorso completo della sua directory home.

  2. Configura i GPIO e imposta il sensore PIR su GPIO17 come ingresso.

    PIR_PIN = 17
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(PIR_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    

    L’uso di una resistenza di pull-down garantisce che il pin legga LOW quando non viene rilevato alcun movimento.

  3. Inizializza l’istanza di Picamera2 e avvia subito la fotocamera.

    camera = Picamera2()
    camera.start()
    

    La fotocamera viene attivata per essere pronta a catturare immagini non appena viene individuato un movimento.

  4. Rileva il movimento leggendo lo stato di ingresso del sensore PIR.

    if GPIO.input(PIR_PIN) == GPIO.HIGH:
    

    Quando il sensore PIR rileva un movimento, invia un segnale HIGH che avvia la procedura di cattura.

  5. Cattura un’immagine e la salva utilizzando un numero progressivo nel nome del file.

    filename = f"{user_home}/capture{i}.jpg"
    camera.capture_file(filename)
    

    Ogni rilevamento salva una nuova immagine con nomi come capture1.jpg, capture2.jpg e così via.

  6. Attende tre secondi dopo una cattura attivata dal movimento.

    time.sleep(3)
    

    Questo evita la cattura di più immagini troppo ravvicinate dopo un unico evento di movimento.

  7. Stampa “waiting” quando non viene rilevato movimento e controlla nuovamente dopo un breve ritardo.

    else:
        print("waiting")
        time.sleep(0.5)
    

    In questo modo il programma continua a monitorare costantemente senza usare inutilmente troppa CPU.

  8. Gestisce un’interruzione da tastiera (Ctrl+C) per uscire dal programma in sicurezza.

    except KeyboardInterrupt:
        print("\nKeyboard interrupt received. Exiting program...")
    

    Quando l’utente interrompe manualmente il programma, viene mostrato un messaggio di uscita pulita.

  9. Rilascia correttamente le risorse della fotocamera e dei GPIO prima di terminare.

    finally:
        camera.close()
        GPIO.cleanup()
    

    Questo garantisce che la fotocamera venga chiusa correttamente e che tutti i pin GPIO ritornino in uno stato sicuro.

Immagine del fenomeno

../_images/4.1.4spycamera.JPG