Nota

Ciao, benvenuto nella community di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirsi?

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

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

  • Anteprime esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime esclusive.

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

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

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

4.1.5 Benvenuto

Introduzione

In questo progetto, utilizzeremo il PIR per rilevare il movimento dei pedoni, e useremo servocomandi, LED e un cicalino per simulare il funzionamento della porta automatica di un negozio. Quando un pedone entra nel raggio di rilevamento del PIR, la spia luminosa si accenderà, la porta si aprirà e il cicalino suonerà il campanello di apertura.

Componenti necessari

In questo progetto, avremo bisogno dei seguenti componenti.

../_images/4.1.8_welcome_list.png

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

Nome

ELEMENTI NEL 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

LED

ACQUISTA

Modulo Sensore di Movimento PIR

-

Servo

ACQUISTA

Cicalino

ACQUISTA

Transistor

ACQUISTA

Diagramma schematico

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

../_images/4.1.8_welcome_schematic.png

Procedure Sperimentali

Passo 1: Monta il circuito.

../_images/4.1.8_welcome_circuit.png

Passo 2: Cambia la directory.

cd ~/raphael-kit/python-pi5

Passo 3: Esegui.

sudo python3 4.1.8_Welcome_zero.py

Dopo l’esecuzione del codice, se il sensore PIR rileva il passaggio di qualcuno, la porta si aprirà automaticamente (simulata dal servo), si accenderà l’indicatore e verrà riprodotta la melodia del campanello. Dopo che la melodia sarà terminata, il sistema chiuderà automaticamente la porta e spegnerà l’indicatore, aspettando il prossimo passaggio.

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

../_images/4.1.8_PIR_TTE.png

Avvertimento

Se viene visualizzato l’errore RuntimeError: Cannot determine SOC peripheral base address, fare riferimento a If gpiozero doesn’t work..

Code

Nota

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

#!/usr/bin/env python3

from gpiozero import LED, MotionSensor, Servo, TonalBuzzer
import time

# Configurazione dei pin GPIO per LED, sensore di movimento (PIR) e cicalino
ledPin = LED(6)
pirPin = MotionSensor(21)
buzPin = TonalBuzzer(27)

# Fattore di correzione della larghezza d'impulso per il servo e calcolo
myCorrection = 0.45
maxPW = (2.0 + myCorrection) / 1000  # Larghezza d'impulso massima
minPW = (1.0 - myCorrection) / 1000  # Larghezza d'impulso minima

# Inizializzazione del servo con larghezze d'impulso personalizzate
servoPin = Servo(25, min_pulse_width=minPW, max_pulse_width=maxPW)

# Melodia musicale per il cicalino, 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 ritardo 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 cicalino dopo la melodia

def closedoor():
    # Spegni il LED e muovi il servo per chiudere la porta
    ledPin.off()
    for i in range(180, -1, -1):
        setAngle(i)             # Muovi il servo da 180 a 0 gradi
        time.sleep(0.001)       # Breve ritardo per un movimento fluido
    time.sleep(1)               # Pausa dopo la chiusura della porta

def opendoor():
    # Accendi il LED, apri la porta (muovi il servo), riproduci la melodia e chiudi la porta
    ledPin.on()
    for i in range(0, 181):
        setAngle(i)             # Muovi il servo da 0 a 180 gradi
        time.sleep(0.001)       # Breve ritardo per un movimento fluido
    time.sleep(1)               # Pausa prima della melodia
    doorbell()                  # Riproduci la melodia
    closedoor()                 # Chiudi la porta dopo la melodia

def loop():
    # Ciclo principale per controllare il movimento e operare la porta
    while True:
        if pirPin.motion_detected:
            opendoor()               # Apri la porta se viene rilevato movimento
        time.sleep(0.1)              # Breve ritardo nel ciclo

try:
    loop()
except KeyboardInterrupt:
    # Pulizia dei GPIO in caso di interruzione dell'utente (ad es., Ctrl+C)
    buzPin.stop()
    ledPin.off()

Spiegazione del Codice

  1. Lo script inizia importando i moduli necessari. La libreria gpiozero viene utilizzata per interfacciarsi con il LED, il sensore di movimento, il motore servo e il cicalino tonale. Il modulo time serve per gestire le funzioni legate al tempo.

    #!/usr/bin/env python3
    from gpiozero import LED, MotionSensor, Servo, TonalBuzzer
    import time
    
  2. Inizializza il LED, il sensore di movimento PIR e il cicalino tonale sui rispettivi pin GPIO.

    # Configurazione dei pin GPIO per LED, sensore di movimento (PIR) e cicalino
    ledPin = LED(6)
    pirPin = MotionSensor(21)
    buzPin = TonalBuzzer(27)
    
  3. Calcola la larghezza d’impulso massima e minima per il motore servo, incorporando un fattore di correzione per la regolazione fine.

    # Fattore di correzione della larghezza d'impulso per il servo e calcolo
    myCorrection = 0.45
    maxPW = (2.0 + myCorrection) / 1000  # Larghezza d'impulso massima
    minPW = (1.0 - myCorrection) / 1000  # Larghezza d'impulso minima
    
  4. Inizializza il motore servo sul pin GPIO 25 con larghezze d’impulso personalizzate per un posizionamento preciso.

    # Inizializzazione del servo con larghezze d'impulso personalizzate
    servoPin = Servo(25, min_pulse_width=minPW, max_pulse_width=maxPW)
    
  5. La melodia è definita come una sequenza di note (frequenze) e durate (secondi).

    # Melodia musicale per il cicalino, 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)]
    
  6. Funzione per muovere il servo ad un angolo specificato. Converte l’angolo in un valore compreso tra 0 e 1 per il servo.

    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 ritardo per il movimento del servo
    
  7. Funzione per riprodurre una melodia utilizzando il cicalino. Scorre l’elenco tune, riproducendo ogni nota per la sua durata specificata.

    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 cicalino dopo la melodia
    
  8. Funzioni per aprire e chiudere la porta utilizzando il motore servo. La funzione opendoor accende il LED, apre la porta, riproduce la melodia e poi chiude la porta.

    def closedoor():
        # Spegni il LED e muovi il servo per chiudere la porta
        ledPin.off()
        for i in range(180, -1, -1):
            setAngle(i)             # Muovi il servo da 180 a 0 gradi
            time.sleep(0.001)       # Breve ritardo per un movimento fluido
        time.sleep(1)               # Pausa dopo la chiusura della porta
    
    def opendoor():
        # Accendi il LED, apri la porta (muovi il servo), riproduci la melodia e chiudi la porta
        ledPin.on()
        for i in range(0, 181):
            setAngle(i)             # Muovi il servo da 0 a 180 gradi
            time.sleep(0.001)       # Breve ritardo per un movimento fluido
        time.sleep(1)               # Pausa prima della melodia
        doorbell()                  # Riproduci la melodia
        closedoor()                 # Chiudi la porta dopo la melodia
    
  9. Ciclo principale che controlla costantemente il rilevamento del movimento. Quando viene rilevato un movimento, attiva la funzione opendoor.

    def loop():
        # Ciclo principale per controllare il movimento e operare la porta
        while True:
            if pirPin.motion_detected:
                opendoor()               # Apri la porta se viene rilevato movimento
            time.sleep(0.1)              # Breve ritardo nel ciclo
    
  10. Esegue il ciclo principale e garantisce che lo script possa essere interrotto con un comando da tastiera (Ctrl+C), spegnendo il cicalino e il LED per una chiusura pulita.

    try:
        loop()
    except KeyboardInterrupt:
        # Pulizia dei GPIO in caso di interruzione dell'utente (ad es., Ctrl+C)
        buzPin.stop()
        ledPin.off()