Nota
Ciao, benvenuto nella comunità SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 con altri appassionati.
Perché unirti a noi?
Supporto esperto: Risolvi problemi post-vendita e 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: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime.
Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
Promozioni festive e giveaway: Partecipa a concorsi e promozioni festive.
👉 Pronto per esplorare e creare con noi? Clicca [Qui] e unisciti oggi!
4.1.6 Sistema di allarme per retromarcia
Introduzione
In questo progetto, utilizzeremo un display LCD, un cicalino e sensori ad ultrasuoni per realizzare un sistema di assistenza alla retromarcia. Possiamo installarlo su un veicolo telecomandato per simulare il processo reale di parcheggio in retromarcia in un garage.
Componenti necessari
In questo progetto, abbiamo bisogno dei seguenti componenti.
È sicuramente conveniente acquistare un intero kit, ecco il link:
Nome |
OGGETTI NEL KIT |
LINK |
|---|---|---|
Kit Raphael |
337 |
Puoi anche acquistarli separatamente dai link qui sotto.
INTRODUZIONE AI COMPONENTI |
LINK PER L’ACQUISTO |
|---|---|
- |
|
Schema elettrico
Il sensore ad ultrasuoni rileva la distanza tra sé stesso e l’ostacolo, che verrà visualizzata sul display LCD sotto forma di codice. Allo stesso tempo, il sensore ad ultrasuoni farà emettere al cicalino un segnale acustico con frequenze diverse a seconda del valore della distanza.
T-Board Name |
physical |
wiringPi |
BCM |
GPIO23 |
Pin 16 |
4 |
23 |
GPIO24 |
Pin 18 |
5 |
24 |
GPIO17 |
Pin 11 |
0 |
17 |
SDA1 |
Pin 3 |
||
SCL1 |
Pin 5 |
Procedure sperimentali
Passo 1: Costruisci il circuito.
Passo 2: Cambia directory.
cd ~/raphael-kit/python-pi5
Passo 3: Esegui.
sudo python3 4.1.9_ReversingAlarm_zero.py
Quando il codice viene eseguito, il modulo del sensore ad ultrasuoni rileva la distanza dall’ostacolo e visualizza l’informazione della distanza sul display LCD1602; inoltre, il cicalino emette un tono di avviso la cui frequenza varia in base alla distanza.
Nota
Se ricevi l’errore
FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1', devi fare riferimento a Configurazione I²C per abilitare l’I2C.Se ottieni l’errore
ModuleNotFoundError: No module named 'smbus2', eseguisudo apt install python3-smbus2.Se compare l’errore
OSError: [Errno 121] Remote I/O error, significa che il modulo è cablato male o il modulo è guasto.Se il codice e il cablaggio sono corretti, ma l’LCD continua a non visualizzare contenuti, puoi regolare il potenziometro sul retro per aumentare il contrasto.
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/Reimpostare/Copiare/Eseguire/Interrompere il codice qui sotto. Ma prima di tutto, devi andare nel percorso del codice come raphael-kit/python-pi5. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l’effetto.
#!/usr/bin/env python3
import LCD1602
import time
from gpiozero import DistanceSensor, Buzzer
# Inizializza il sensore a ultrasuoni con i pin GPIO
sensor = DistanceSensor(echo=24, trigger=23) # Pin Echo è GPIO 24, Pin Trigger è GPIO 23
# Inizializza il cicalino collegato al pin GPIO 17
buzzer = Buzzer(17)
def lcdsetup():
# Inizializza l'LCD con l'indirizzo I2C e attiva la retroilluminazione
LCD1602.init(0x27, 1) # 0x27 è l'indirizzo I2C dell'LCD
LCD1602.clear() # Pulisci il display LCD
# Mostra messaggi di avvio sull'LCD
LCD1602.write(0, 0, 'Ultrasonic Starting')
LCD1602.write(1, 1, 'By SunFounder')
time.sleep(2) # Attendi 2 secondi
def distance():
# Calcola e restituisci la distanza misurata dal sensore
dis = sensor.distance * 100 # Converti la distanza in centimetri
print('Distance: {:.2f} cm'.format(dis)) # Stampa la distanza con due decimali
time.sleep(0.3) # Attendi 0,3 secondi prima della prossima misurazione
return dis
def loop():
# Misura continuamente la distanza e aggiorna l'LCD e il cicalino
while True:
dis = distance() # Ottieni la distanza attuale
# Mostra la distanza e gestisci gli avvisi in base alla distanza
if dis > 400: # Controlla se la distanza è fuori dal range
LCD1602.clear()
LCD1602.write(0, 0, 'Error')
LCD1602.write(3, 1, 'Out of range')
time.sleep(0.5)
else:
# Mostra la distanza attuale sull'LCD
LCD1602.clear()
LCD1602.write(0, 0, 'Distance is')
LCD1602.write(5, 1, str(round(dis, 2)) + ' cm')
# Regola la frequenza del cicalino in base alla distanza
if dis >= 50:
time.sleep(0.5)
elif 20 < dis < 50:
# Distanza media: frequenza media del cicalino
for _ in range(2):
buzzer.on()
time.sleep(0.05)
buzzer.off()
time.sleep(0.2)
elif dis <= 20:
# Distanza ravvicinata: alta frequenza del cicalino
for _ in range(5):
buzzer.on()
time.sleep(0.05)
buzzer.off()
time.sleep(0.05)
try:
lcdsetup() # Configura il display LCD
loop() # Avvia il ciclo di misurazione
except KeyboardInterrupt:
# Spegni il cicalino e pulisci l'LCD all'interruzione dell'utente (es. Ctrl+C)
buzzer.off()
LCD1602.clear()
Spiegazione del Codice
Questo script utilizza diverse librerie per il suo funzionamento. La libreria
LCD1602gestisce il display LCD, mentretimefornisce funzioni legate al tempo. La libreriagpiozeroè essenziale per l’interazione con i pin GPIO del Raspberry Pi, in particolare per operare il sensore di distanza e il cicalino.#!/usr/bin/env python3 import LCD1602 import time from gpiozero import DistanceSensor, Buzzer
Il sensore a ultrasuoni è configurato con i suoi pin echo e trigger collegati rispettivamente ai pin GPIO 24 e 23. Inoltre, un cicalino è collegato al pin GPIO 17.
# Inizializza il sensore a ultrasuoni con i pin GPIO sensor = DistanceSensor(echo=24, trigger=23) # Pin Echo è GPIO 24, Pin Trigger è GPIO 23 # Inizializza il cicalino collegato al pin GPIO 17 buzzer = Buzzer(17)
L’inizializzazione del display LCD comporta la sua pulizia e la visualizzazione di un messaggio di avvio.
def lcdsetup(): # Inizializza l'LCD con l'indirizzo I2C e attiva la retroilluminazione LCD1602.init(0x27, 1) # 0x27 è l'indirizzo I2C dell'LCD LCD1602.clear() # Pulisci il display LCD # Mostra messaggi di avvio sull'LCD LCD1602.write(0, 0, 'Ultrasonic Starting') LCD1602.write(1, 1, 'By SunFounder') time.sleep(2) # Attendi 2 secondi
La funzione
distancecalcola la distanza misurata dal sensore a ultrasuoni e la restituisce, mostrando il valore in centimetri.def distance(): # Calcola e restituisci la distanza misurata dal sensore dis = sensor.distance * 100 # Converti la distanza in centimetri print('Distance: {:.2f} cm'.format(dis)) # Stampa la distanza con due decimali time.sleep(0.3) # Attendi 0,3 secondi prima della prossima misurazione return dis
Il ciclo principale misura continuamente la distanza, aggiornando sia l’LCD che il cicalino. Gestisce diverse gamme di distanza con azioni specifiche, come la visualizzazione di messaggi di errore o la variazione della frequenza del cicalino in base alla distanza misurata.
def loop(): # Misura continuamente la distanza e aggiorna l'LCD e il cicalino while True: dis = distance() # Ottieni la distanza attuale # Mostra la distanza e gestisci gli avvisi in base alla distanza if dis > 400: # Controlla se la distanza è fuori dal range LCD1602.clear() LCD1602.write(0, 0, 'Error') LCD1602.write(3, 1, 'Out of range') time.sleep(0.5) else: # Mostra la distanza attuale sull'LCD LCD1602.clear() LCD1602.write(0, 0, 'Distance is') LCD1602.write(5, 1, str(round(dis, 2)) + ' cm') # Regola la frequenza del cicalino in base alla distanza if dis >= 50: time.sleep(0.5) elif 20 < dis < 50: # Distanza media: frequenza media del cicalino for _ in range(2): buzzer.on() time.sleep(0.05) buzzer.off() time.sleep(0.2) elif dis <= 20: # Distanza ravvicinata: alta frequenza del cicalino for _ in range(5): buzzer.on() time.sleep(0.05) buzzer.off() time.sleep(0.05)
All’esecuzione, lo script configura l’LCD e entra nel ciclo principale. Può essere interrotto con un comando da tastiera (Ctrl+C), che spegne il cicalino e pulisce l’LCD.
try: lcdsetup() # Configura il display LCD loop() # Avvia il ciclo di misurazione except KeyboardInterrupt: # Spegni il cicalino e pulisci l'LCD all'interruzione dell'utente (es. Ctrl+C) buzzer.off() LCD1602.clear()