Nota

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

Perché unirti a noi?

  • Supporto esperto: Risolvi i problemi post-vendita e le sfide tecniche grazie all’aiuto della nostra comunità e del nostro team.

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

  • Anteprime esclusive: Ottieni l’accesso anticipato agli annunci dei 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 festive.

👉 Pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi!

3.1.3 Allarme Retromarcia

Introduzione

In questo progetto, utilizzeremo un display LCD, un buzzer e sensori a ultrasuoni per creare un sistema di assistenza alla retromarcia. Puoi installarlo su un veicolo telecomandato per simulare il processo di retromarcia in un garage.

Componenti necessari

Per questo progetto, abbiamo bisogno dei seguenti componenti.

../_images/4.1.9_reversing_alarm_list.png

Schema elettrico

Il sensore a ultrasuoni rileva la distanza tra sé e l’ostacolo, visualizzando il risultato sul display LCD in forma numerica. Allo stesso tempo, il sensore ultrasuoni attiva il buzzer, emettendo suoni di allerta con frequenze differenti a seconda della distanza rilevata.

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

../_images/4.1.9_reversing_alarm_schematic.png

Procedura sperimentale

Passo 1: Costruisci il circuito.

../_images/4.1.9_reversing_alarm_circuit.png

Passo 2: Cambia la directory.

cd ~/davinci-kit-for-raspberry-pi/python-pi5

Passo 3: Esegui il programma.

sudo python3 3.1.3_ReversingAlarm.py

Durante l’esecuzione del codice, il modulo del sensore a ultrasuoni rileva la distanza dall’ostacolo e visualizza le informazioni relative alla distanza su LCD1602; inoltre, il buzzer emette un segnale di avviso la cui frequenza varia con la distanza.

Nota

  • Se ricevi l’errore FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1', fai riferimento a Configurazione I²C per abilitare I2C.

  • Se compare l’errore ModuleNotFoundError: No module named 'smbus2', esegui sudo apt install python3-smbus2.

  • Se ricevi l’errore OSError: [Errno 121] Remote I/O error, significa che il modulo è cablato male o danneggiato.

  • Se il codice e il cablaggio sono corretti, ma il display LCD non mostra contenuti, prova a regolare il contrasto girando il potenziometro sul retro.

Avvertimento

Se appare l’errore RuntimeError: Cannot determine SOC peripheral base address, fai riferimento a Se gpiozero non funziona.

Codice

Nota

Puoi Modificare/Reimpostare/Copiare/Eseguire/Arrestare il codice qui sotto. Prima di farlo, assicurati di essere nella directory del codice sorgente come davinci-kit-for-raspberry-pi/python-pi5. Dopo aver modificato il codice, potrai 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 buzzer collegato al pin GPIO 17
buzzer = Buzzer(17)

def lcdsetup():
    # Inizializza il display LCD con l'indirizzo I2C e attiva la retroilluminazione
    LCD1602.init(0x27, 1)  # 0x27 è l'indirizzo I2C dell'LCD
    LCD1602.clear()  # Cancella il display LCD
    # Visualizza i messaggi di avvio sul display LCD
    LCD1602.write(0, 0, 'Ultrasonic Starting')
    LCD1602.write(1, 1, 'By SunFounder')
    time.sleep(2)  # Attesa di 2 secondi

def distance():
    # Calcola e restituisce la distanza misurata dal sensore
    dis = sensor.distance * 100  # Converte la distanza in centimetri
    print('Distance: {:.2f} cm'.format(dis))  # Stampa la distanza con due cifre decimali
    time.sleep(0.3)  # Attesa di 0,3 secondi prima della prossima misurazione
    return dis

def loop():
    # Misura continuamente la distanza e aggiorna LCD e buzzer
    while True:
        dis = distance()  # Ottiene la distanza corrente
        # Visualizza la distanza e gestisce gli avvisi in base alla distanza
        if dis > 400:  # Verifica se la distanza è fuori portata
            LCD1602.clear()
            LCD1602.write(0, 0, 'Error')
            LCD1602.write(3, 1, 'Out of range')
            time.sleep(0.5)
        else:
            # Visualizza la distanza corrente sul display LCD
            LCD1602.clear()
            LCD1602.write(0, 0, 'Distance is')
            LCD1602.write(5, 1, str(round(dis, 2)) + ' cm')
            # Regola la frequenza del buzzer in base alla distanza
            if dis >= 50:
                time.sleep(0.5)
            elif 20 < dis < 50:
                # Distanza media: frequenza media del buzzer
                for _ in range(2):
                    buzzer.on()
                    time.sleep(0.05)
                    buzzer.off()
                    time.sleep(0.2)
            elif dis <= 20:
                # Distanza ravvicinata: frequenza alta del buzzer
                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:
    # Spegne il buzzer e cancella l'LCD all'interruzione dell'utente (es. Ctrl+C)
    buzzer.off()
    LCD1602.clear()

Spiegazione del Codice

  1. Questo script utilizza diverse librerie per le sue funzionalità. La libreria LCD1602 gestisce il display LCD, mentre time fornisce funzioni legate alla temporizzazione. La libreria gpiozero è essenziale per le interazioni con i pin GPIO del Raspberry Pi, in particolare per operare il sensore di distanza e il buzzer.

    #!/usr/bin/env python3
    import LCD1602
    import time
    from gpiozero import DistanceSensor, Buzzer
    
  2. Il sensore a ultrasuoni è configurato con i suoi pin echo e trigger collegati ai pin GPIO 24 e 23, rispettivamente. Inoltre, un buzzer è 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 buzzer collegato al pin GPIO 17
    buzzer = Buzzer(17)
    
  3. L’inizializzazione del display LCD prevede la pulizia del display e la visualizzazione di un messaggio di avvio.

    def lcdsetup():
        # Inizializza il display LCD con l'indirizzo I2C e attiva la retroilluminazione
        LCD1602.init(0x27, 1)  # 0x27 è l'indirizzo I2C dell'LCD
        LCD1602.clear()  # Cancella il display LCD
        # Visualizza i messaggi di avvio sul display LCD
        LCD1602.write(0, 0, 'Ultrasonic Starting')
        LCD1602.write(1, 1, 'By SunFounder')
        time.sleep(2)  # Attesa di 2 secondi
    
  4. La funzione distance calcola la distanza misurata dal sensore a ultrasuoni, la visualizza e restituisce il valore in centimetri.

    def distance():
        # Calcola e restituisce la distanza misurata dal sensore
        dis = sensor.distance * 100  # Converte la distanza in centimetri
        print('Distance: {:.2f} cm'.format(dis))  # Stampa la distanza con due cifre decimali
        time.sleep(0.3)  # Attesa di 0,3 secondi prima della prossima misurazione
        return dis
    
  5. Il ciclo principale misura continuamente la distanza, aggiornando sia l’LCD che il buzzer. Gestisce diversi intervalli di distanza con azioni specifiche, come la visualizzazione di messaggi di errore o la variazione della frequenza del buzzer in base alla distanza misurata.

    def loop():
        # Misura continuamente la distanza e aggiorna LCD e buzzer
        while True:
            dis = distance()  # Ottiene la distanza corrente
            # Visualizza la distanza e gestisce gli avvisi in base alla distanza
            if dis > 400:  # Verifica se la distanza è fuori portata
                LCD1602.clear()
                LCD1602.write(0, 0, 'Error')
                LCD1602.write(3, 1, 'Out of range')
                time.sleep(0.5)
            else:
                # Visualizza la distanza corrente sul display LCD
                LCD1602.clear()
                LCD1602.write(0, 0, 'Distance is')
                LCD1602.write(5, 1, str(round(dis, 2)) + ' cm')
                # Regola la frequenza del buzzer in base alla distanza
                if dis >= 50:
                    time.sleep(0.5)
                elif 20 < dis < 50:
                    # Distanza media: frequenza media del buzzer
                    for _ in range(2):
                        buzzer.on()
                        time.sleep(0.05)
                        buzzer.off()
                        time.sleep(0.2)
                elif dis <= 20:
                    # Distanza ravvicinata: frequenza alta del buzzer
                    for _ in range(5):
                        buzzer.on()
                        time.sleep(0.05)
                        buzzer.off()
                        time.sleep(0.05)
    
  6. Al momento dell’esecuzione, lo script configura l’LCD e avvia il ciclo principale. Può essere interrotto con un comando da tastiera (Ctrl+C), che spegne il buzzer e cancella l’LCD.

    try:
        lcdsetup()  # Configura il display LCD
        loop()      # Avvia il ciclo di misurazione
    except KeyboardInterrupt:
        # Spegne il buzzer e cancella l'LCD all'interruzione dell'utente (es. Ctrl+C)
        buzzer.off()
        LCD1602.clear()