.. note:: Ciao, benvenuto nella Community su Facebook per gli appassionati di SunFounder Raspberry Pi, Arduino ed ESP32! Esplora più a fondo Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati. **Perché unirsi?** - **Supporto Esperto**: Risolvi problemi post-vendita e sfide tecniche con l'aiuto della nostra comunità e del nostro team. - **Impara e Condividi**: Scambia suggerimenti e tutorial per migliorare le tue competenze. - **Anteprime Esclusive**: Ottieni accesso anticipato agli annunci dei nuovi prodotti e anticipazioni. - **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti. - **Promozioni Festive e Giveaway**: Partecipa a giveaway e promozioni festive. 👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi! .. _py_pi5_welcome: 3.1.2 Benvenuto ===================================== Introduzione ------------- In questo progetto, utilizzeremo un sensore PIR per rilevare il movimento dei passanti, e useremo un servo, un LED e un buzzer per simulare il funzionamento della porta automatica di un negozio. Quando un passante entra nel raggio di rilevamento del PIR, la luce di indicazione si accenderà, la porta si aprirà e il buzzer riprodurrà il suono del campanello d’apertura. Componenti Necessari ------------------------------ In questo progetto, ci servono i seguenti componenti. .. image:: ../python_pi5/img/4.1.8_welcome_list.png :width: 100% :align: center .. È certamente 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 singolarmente dai link qui sotto. .. .. list-table:: .. :widths: 30 20 .. :header-rows: 1 .. * - INTRODUZIONE COMPONENTE .. - LINK DI ACQUISTO .. * - :ref:`scheda_estensione_gpio` .. - |link_gpio_board_buy| .. * - :ref:`breadboard` .. - |link_breadboard_buy| .. * - :ref:`fili` .. - |link_wires_buy| .. * - :ref:`resistenza` .. - |link_resistor_buy| .. * - :ref:`led` .. - |link_led_buy| .. * - :ref:`pir` .. - \- .. * - :ref:`servo` .. - |link_servo_buy| .. * - :ref:`Buzzer` .. - |link_passive_buzzer_buy| .. * - :ref:`transistor` .. - |link_transistor_buy| Schema Elettrico ------------------- ============ ======== ======== === T-Board Name physical wiringPi BCM GPIO18 Pin 12 1 18 GPIO17 Pin 11 0 17 GPIO27 Pin 13 2 27 GPIO22 Pin 15 3 22 ============ ======== ======== === .. image:: ../python_pi5/img/4.1.8_welcome_schematic.png :align: center Procedura Sperimentale ------------------------- **Passo 1:** Monta il circuito. .. image:: ../python_pi5/img/4.1.8_welcome_circuit.png :align: center **Passo 2:** Cambia directory. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python-pi5 **Passo 3:** Esegui il file. .. raw:: html .. code-block:: sudo python3 3.1.2_Welcome.py Dopo aver eseguito il codice, se il sensore PIR rileva una persona in avvicinamento, la porta si aprirà automaticamente (simulata dal servo), accenderà l’indicatore luminoso e suonerà il campanello d’ingresso. Al termine del suono del campanello, il sistema chiuderà automaticamente la porta e spegnerà la luce indicatrice, attendendo il passaggio successivo. Sul modulo PIR ci sono due potenziometri: uno per regolare la sensibilità e l'altro per regolare la distanza di rilevamento. Per far funzionare meglio il modulo PIR, è consigliabile ruotarli entrambi in senso antiorario fino alla fine. .. image:: ../python_pi5/img/4.1.8_PIR_TTE.png :width: 400 :align: center .. warning:: Se compare un errore con il messaggio ``RuntimeError: Cannot determine SOC peripheral base address``, fai riferimento a :ref:`faq_soc` **Codice** .. note:: Puoi **Modificare/Reimpostare/Copiare/Eseguire/Interrompere** il codice qui sotto. Prima di procedere, assicurati di essere nel percorso sorgente, ad esempio ``davinci-kit-for-raspberry-pi/python-pi5``. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l’effetto. .. raw:: html .. code-block:: python #!/usr/bin/env python3 from gpiozero import LED, MotionSensor, Servo, TonalBuzzer import time # Configurazione dei pin GPIO per LED, sensore di movimento (PIR) e buzzer ledPin = LED(6) pirPin = MotionSensor(21) buzPin = TonalBuzzer(27) # Fattore di correzione per larghezza impulso del servo e calcolo myCorrection = 0.45 maxPW = (2.0 + myCorrection) / 1000 # Larghezza massima impulso minPW = (1.0 - myCorrection) / 1000 # Larghezza minima impulso # Inizializza servo con larghezze impulso personalizzate servoPin = Servo(25, min_pulse_width=minPW, max_pulse_width=maxPW) # Melodia per il buzzer, con note e durate tune = [('C#4', 0.2), ('D4', 0.2), (None, 0.2), ('Eb4', 0.2), ('E4', 0.2), (None, 0.6), ('F#4', 0.2), ('G4', 0.2), (None, 0.6), ('Eb4', 0.2), ('E4', 0.2), (None, 0.2), ('F#4', 0.2), ('G4', 0.2), (None, 0.2), ('C4', 0.2), ('B4', 0.2), (None, 0.2), ('F#4', 0.2), ('G4', 0.2), (None, 0.2), ('B4', 0.2), ('Bb4', 0.5), (None, 0.6), ('A4', 0.2), ('G4', 0.2), ('E4', 0.2), ('D4', 0.2), ('E4', 0.2)] def setAngle(angle): """ Move the servo to a specified angle. :param angle: Angle in degrees (0-180). """ value = float(angle / 180) # Converte l'angolo in valore per il servo servoPin.value = value # Imposta la posizione del servo time.sleep(0.001) # Breve pausa per il movimento del servo def doorbell(): """ Play a musical tune using the buzzer. """ for note, duration in tune: buzPin.play(note) # Riproduce la nota time.sleep(float(duration)) # Durata della nota buzPin.stop() # Ferma il buzzer dopo la melodia def closedoor(): # Spegne il LED e muove il servo per chiudere la porta ledPin.off() for i in range(180, -1, -1): setAngle(i) # Muove il servo da 180 a 0 gradi time.sleep(0.001) # Breve pausa per movimento fluido time.sleep(1) # Attesa dopo la chiusura della porta def opendoor(): # Accende il LED, apre la porta (muove il servo), riproduce la melodia e chiude la porta ledPin.on() for i in range(0, 181): setAngle(i) # Muove il servo da 0 a 180 gradi time.sleep(0.001) # Breve pausa per movimento fluido time.sleep(1) # Attesa prima di riprodurre la melodia doorbell() # Riproduce la melodia del campanello closedoor() # Chiude la porta dopo la melodia def loop(): # Loop principale per controllare il movimento e operare la porta while True: if pirPin.motion_detected: opendoor() # Apre la porta se viene rilevato movimento time.sleep(0.1) # Breve pausa nel loop try: loop() except KeyboardInterrupt: # Pulisce i GPIO in caso di interruzione (es. Ctrl+C) buzPin.stop() ledPin.off() **Spiegazione del Codice** #. Lo script inizia importando i moduli necessari. La libreria ``gpiozero`` è utilizzata per interfacciarsi con il LED, il sensore di movimento, il motore servo e il buzzer tonale. Il modulo ``time`` è impiegato per gestire le funzioni legate al timing. .. code-block:: python #!/usr/bin/env python3 from gpiozero import LED, MotionSensor, Servo, TonalBuzzer import time #. Inizializza il LED, il sensore di movimento PIR e il buzzer tonale sui rispettivi pin GPIO. .. code-block:: python # Configurazione dei pin GPIO per LED, sensore di movimento (PIR) e buzzer ledPin = LED(6) pirPin = MotionSensor(21) buzPin = TonalBuzzer(27) #. Calcola la larghezza degli impulsi massima e minima per il motore servo, incorporando un fattore di correzione per una regolazione più precisa. .. code-block:: python # Fattore di correzione per la larghezza degli impulsi del servo myCorrection = 0.45 maxPW = (2.0 + myCorrection) / 1000 # Larghezza massima dell'impulso minPW = (1.0 - myCorrection) / 1000 # Larghezza minima dell'impulso #. Inizializza il motore servo sul pin GPIO 25 con le larghezze di impulso personalizzate per un posizionamento accurato. .. code-block:: python # Inizializzazione del servo con larghezze di impulso personalizzate servoPin = Servo(25, min_pulse_width=minPW, max_pulse_width=maxPW) #. La melodia è definita come una sequenza di note (frequenze) e durate (secondi). .. code-block:: python # Melodia per il buzzer, con note e durate tune = [('C#4', 0.2), ('D4', 0.2), (None, 0.2), ('Eb4', 0.2), ('E4', 0.2), (None, 0.6), ('F#4', 0.2), ('G4', 0.2), (None, 0.6), ('Eb4', 0.2), ('E4', 0.2), (None, 0.2), ('F#4', 0.2), ('G4', 0.2), (None, 0.2), ('C4', 0.2), ('B4', 0.2), (None, 0.2), ('F#4', 0.2), ('G4', 0.2), (None, 0.2), ('B4', 0.2), ('Bb4', 0.5), (None, 0.6), ('A4', 0.2), ('G4', 0.2), ('E4', 0.2), ('D4', 0.2), ('E4', 0.2)] #. Funzione per muovere il servo a un angolo specificato. Converte l'angolo in un valore tra 0 e 1 per il servo. .. code-block:: python def setAngle(angle): """ Move the servo to a specified angle. :param angle: Angle in degrees (0-180). """ value = float(angle / 180) # Converte l'angolo in valore per il servo servoPin.value = value # Imposta la posizione del servo time.sleep(0.001) # Breve pausa per il movimento del servo #. Funzione per riprodurre una melodia usando il buzzer. Scorre la lista ``tune`` riproducendo ciascuna nota per la durata specificata. .. code-block:: python def doorbell(): """ Play a musical tune using the buzzer. """ for note, duration in tune: buzPin.play(note) # Riproduce la nota time.sleep(float(duration)) # Durata della nota buzPin.stop() # Ferma il buzzer dopo la melodia #. Funzioni per aprire e chiudere la porta usando il motore servo. La funzione ``opendoor`` accende il LED, apre la porta, riproduce la melodia e poi chiude la porta. .. code-block:: python def closedoor(): # Spegne il LED e muove il servo per chiudere la porta ledPin.off() for i in range(180, -1, -1): setAngle(i) # Muove il servo da 180 a 0 gradi time.sleep(0.001) # Breve pausa per movimento fluido time.sleep(1) # Attesa dopo la chiusura della porta def opendoor(): # Accende il LED, apre la porta (muove il servo), riproduce la melodia, chiude la porta ledPin.on() for i in range(0, 181): setAngle(i) # Muove il servo da 0 a 180 gradi time.sleep(0.001) # Breve pausa per movimento fluido time.sleep(1) # Attesa prima della melodia doorbell() # Riproduce la melodia del campanello closedoor() # Chiude la porta dopo la melodia #. Loop principale che controlla costantemente il rilevamento di movimento. Quando viene rilevato movimento, attiva la funzione ``opendoor``. .. code-block:: python def loop(): # Loop principale per verificare movimento e operare la porta while True: if pirPin.motion_detected: opendoor() # Apre la porta se rileva movimento time.sleep(0.1) # Breve pausa nel loop #. Esegue il loop principale e garantisce che lo script possa essere interrotto con un comando di tastiera (Ctrl+C), spegnendo il buzzer e il LED per un’uscita pulita. .. code-block:: python try: loop() except KeyboardInterrupt: # Pulisce i GPIO in caso di interruzione (es. Ctrl+C) buzPin.stop() ledPin.off()