.. note:: 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 [|link_sf_facebook|] e unisciti oggi stesso! .. _4.1.4_py: 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. .. image:: ../img/3.1.18components.png :width: 800 :align: center È sicuramente conveniente acquistare un kit completo, ecco il link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nome - ELEMENTI IN QUESTO KIT - LINK * - Kit Raphael - 337 - |link_Raphael_kit| Puoi anche acquistarli separatamente dai link sottostanti. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUZIONE AI COMPONENTI - LINK PER L'ACQUISTO * - :ref:`cpn_gpio_extension_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_camera_module` - |link_camera_buy| * - :ref:`cpn_pir` - \- Schema elettrico ----------------------- ============ ======== ======== === T-Board Name physical wiringPi BCM GPIO17 Pin 11 0 17 ============ ======== ======== === .. image:: ../img/1.1.18_schematic.png :width: 400 :align: center Procedura sperimentale ------------------------------ Prima di iniziare questo progetto, assicurati di aver completato :ref:`3.1.1_py`. **Passo 1:** Costruisci il circuito. .. image:: ../img/3.1.18fritzing.png :width: 800 :align: center **Passo 2:** Per collegare il modulo fotocamera e completare la configurazione, fai riferimento a: :ref:`cpn_camera_module`. **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: :ref:`remote_desktop`. **Passo 4:** Apri un Terminale ed entra nella cartella del codice. .. raw:: html .. code-block:: cd ~/raphael-kit/python/ **Passo 5:** Esegui. .. raw:: html .. code-block:: 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. .. image:: ../img/PIR_TTE.png :width: 400 :align: center .. note:: 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** .. note:: 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. .. raw:: html .. code-block:: python #!/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** #. Legge la directory home dell’utente corrente per salvare le immagini catturate. .. code-block:: python 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. #. Configura i GPIO e imposta il sensore PIR su ``GPIO17`` come ingresso. .. code-block:: python 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. #. Inizializza l’istanza di Picamera2 e avvia subito la fotocamera. .. code-block:: python camera = Picamera2() camera.start() La fotocamera viene attivata per essere pronta a catturare immagini non appena viene individuato un movimento. #. Rileva il movimento leggendo lo stato di ingresso del sensore PIR. .. code-block:: python if GPIO.input(PIR_PIN) == GPIO.HIGH: Quando il sensore PIR rileva un movimento, invia un segnale ``HIGH`` che avvia la procedura di cattura. #. Cattura un’immagine e la salva utilizzando un numero progressivo nel nome del file. .. code-block:: python 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. #. Attende tre secondi dopo una cattura attivata dal movimento. .. code-block:: python time.sleep(3) Questo evita la cattura di più immagini troppo ravvicinate dopo un unico evento di movimento. #. Stampa “waiting” quando non viene rilevato movimento e controlla nuovamente dopo un breve ritardo. .. code-block:: python else: print("waiting") time.sleep(0.5) In questo modo il programma continua a monitorare costantemente senza usare inutilmente troppa CPU. #. Gestisce un’interruzione da tastiera (Ctrl+C) per uscire dal programma in sicurezza. .. code-block:: python except KeyboardInterrupt: print("\nKeyboard interrupt received. Exiting program...") Quando l’utente interrompe manualmente il programma, viene mostrato un messaggio di uscita pulita. #. Rilascia correttamente le risorse della fotocamera e dei GPIO prima di terminare. .. code-block:: python 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 --------------------------- .. image:: ../img/4.1.4spycamera.JPG :align: center