.. note::
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 [|link_sf_facebook|] e unisciti oggi!
.. _4.1.9_py_pi5:
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.
.. image:: ../python_pi5/img/4.1.9_reversing_alarm_list.png
:width: 800
:align: center
È sicuramente conveniente acquistare un intero kit, ecco il link:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Nome
- OGGETTI NEL KIT
- LINK
* - Kit Raphael
- 337
- |link_Raphael_kit|
Puoi anche acquistarli separatamente dai link qui sotto.
.. list-table::
:widths: 30 20
:header-rows: 1
* - INTRODUZIONE AI COMPONENTI
- LINK PER L'ACQUISTO
* - :ref:`cpn_gpio_extension_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_buzzer`
- \-
* - :ref:`cpn_transistor`
- |link_transistor_buy|
* - :ref:`cpn_ultrasonic_sensor`
- |link_ultrasonic_buy|
* - :ref:`cpn_i2c_lcd`
- |link_i2clcd1602_buy|
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
============ ======== ======== ===
.. image:: ../python_pi5/img/4.1.9_reversing_alarm_schematic.png
:align: center
Procedure sperimentali
---------------------------
**Passo 1:** Costruisci il circuito.
.. image:: ../python_pi5/img/4.1.9_reversing_alarm_circuit.png
:align: center
**Passo 2:** Cambia directory.
.. raw:: html
.. code-block::
cd ~/raphael-kit/python-pi5
**Passo 3:** Esegui.
.. raw:: html
.. code-block::
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.
.. note::
* Se ricevi l'errore ``FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1'``, devi fare riferimento a :ref:`i2c_config` per abilitare l'I2C.
* Se ottieni l'errore ``ModuleNotFoundError: No module named 'smbus2'``, esegui ``sudo 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.
.. warning::
Se viene visualizzato l'errore ``RuntimeError: Cannot determine SOC peripheral base address``, fare riferimento a :ref:`faq_soc`.
**Code**
.. note::
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.
.. raw:: html
.. code-block:: python
#!/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 ``LCD1602`` gestisce il display LCD, mentre ``time`` fornisce funzioni legate al tempo. La libreria ``gpiozero`` è essenziale per l'interazione con i pin GPIO del Raspberry Pi, in particolare per operare il sensore di distanza e il cicalino.
.. code-block:: python
#!/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.
.. code-block:: python
# 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.
.. code-block:: python
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 ``distance`` calcola la distanza misurata dal sensore a ultrasuoni e la restituisce, mostrando il valore in centimetri.
.. code-block:: python
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.
.. code-block:: python
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.
.. code-block:: python
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()