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.
È sicuramente comodo acquistare un kit completo, ecco il link:
Nome |
ELEMENTI NEL KIT |
LINK |
|---|---|---|
Kit Raphael |
337 |
Puoi anche acquistarli separatamente dai link sottostanti.
INTRODUZIONE AI COMPONENTI |
LINK PER L’ACQUISTO |
|---|---|
- |
|
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 |
Procedure Sperimentali
Passo 1: Monta il circuito.
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.
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
Lo script inizia importando i moduli necessari. La libreria
gpiozeroviene utilizzata per interfacciarsi con il LED, il sensore di movimento, il motore servo e il cicalino tonale. Il modulotimeserve per gestire le funzioni legate al tempo.#!/usr/bin/env python3 from gpiozero import LED, MotionSensor, Servo, TonalBuzzer import time
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)
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
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)
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)]
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
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
Funzioni per aprire e chiudere la porta utilizzando il motore servo. La funzione
opendooraccende 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
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
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()