.. note:: Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad 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 a nuovi annunci di prodotti e anteprime speciali. - **Sconti speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti. - **Promozioni festive e omaggi**: Partecipa a concorsi e promozioni durante le festività. 👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso! .. _4.1.9_py: 4.1.9 Allarme di Retromarcia ====================================== Introduzione ---------------- In questo progetto, utilizzeremo un display LCD, un buzzer e sensori a ultrasuoni per creare un sistema di assistenza alla retromarcia. Possiamo posizionarlo su un'auto telecomandata per simulare il processo reale di retromarcia in un garage. Componenti necessari ------------------------------ In questo progetto, avremo bisogno dei seguenti componenti. .. image:: ../img/list_Reversing_Alarm.png :align: center È sicuramente conveniente acquistare un kit completo, ecco il link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nome - ELEMENTI IN QUESTO KIT - LINK * - Kit Raphael - 337 - |link_Raphael_kit| Puoi anche acquistarli separatamente dai link sottostanti. .. 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 a ultrasuoni rileva la distanza tra sé stesso e l'ostacolo, che viene visualizzata sul display LCD sotto forma di codice. Allo stesso tempo, il sensore a ultrasuoni fa emettere al buzzer un segnale acustico la cui frequenza varia in base alla 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 ============ ======== ======== === .. image:: ../img/Schematic_three_one3.png :align: center Procedure sperimentali -------------------------- **Passo 1:** Costruisci il circuito. .. image:: ../img/image242.png :width: 700 :align: center **Passo 2:** Cambia directory. .. raw:: html .. code-block:: cd ~/raphael-kit/python/ **Passo 3:** Esegui. .. raw:: html .. code-block:: sudo python3 4.1.9_ReversingAlarm.py Una volta eseguito il codice, il modulo sensore a ultrasuoni rileverà la distanza dall'ostacolo e visualizzerà l'informazione sul display LCD1602. Inoltre, il buzzer emetterà un segnale acustico di avvertimento la cui frequenza cambierà in base alla distanza. .. note:: * Se compare 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 compare l'errore ``ModuleNotFoundError: No module named 'smbus2'``, esegui il comando ``sudo apt install python3-smbus2``. * Se compare l'errore ``OSError: [Errno 121] Remote I/O error``, significa che il modulo è cablato male o danneggiato. * Se il codice e i collegamenti sono corretti ma il display LCD non mostra nulla, puoi regolare il contrasto ruotando il potenziometro sul retro del modulo. **Codice** .. note:: Puoi **Modificare/Resettare/Copiare/Eseguire/Fermare** il codice qui sotto. Ma prima di farlo, devi accedere al percorso del codice sorgente come ``raphael-kit/python``. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l'effetto. .. raw:: html .. code-block:: python import LCD1602 import time import RPi.GPIO as GPIO TRIG = 16 ECHO = 18 BUZZER = 11 def lcdsetup(): LCD1602.init(0x27, 1) # init(indirizzo slave, retroilluminazione) LCD1602.clear() LCD1602.write(0, 0, 'Ultrasonic Starting') LCD1602.write(1, 1, 'By SunFounder') time.sleep(2) def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(TRIG, GPIO.OUT) GPIO.setup(ECHO, GPIO.IN) GPIO.setup(BUZZER, GPIO.OUT, initial=GPIO.LOW) lcdsetup() def distance(): GPIO.output(TRIG, 0) time.sleep(0.000002) GPIO.output(TRIG, 1) time.sleep(0.00001) GPIO.output(TRIG, 0) while GPIO.input(ECHO) == 0: a = 0 time1 = time.time() while GPIO.input(ECHO) == 1: a = 1 time2 = time.time() during = time2 - time1 return during * 340 / 2 * 100 def destroy(): GPIO.output(BUZZER, GPIO.LOW) GPIO.cleanup() LCD1602.clear() def loop(): while True: dis = distance() print (dis, 'cm') print ('') GPIO.output(BUZZER, GPIO.LOW) if (dis > 400): LCD1602.clear() LCD1602.write(0, 0, 'Error') LCD1602.write(3, 1, 'Out of range') time.sleep(0.5) else: LCD1602.clear() LCD1602.write(0, 0, 'Distance is') LCD1602.write(5, 1, str(round(dis,2)) +' cm') if(dis>=50): time.sleep(0.5) elif(dis<50 and dis>20): for i in range(0,2,1): GPIO.output(BUZZER, GPIO.HIGH) time.sleep(0.05) GPIO.output(BUZZER, GPIO.LOW) time.sleep(0.2) elif(dis<=20): for i in range(0,5,1): GPIO.output(BUZZER, GPIO.HIGH) time.sleep(0.05) GPIO.output(BUZZER, GPIO.LOW) time.sleep(0.05) if __name__ == "__main__": setup() try: loop() except KeyboardInterrupt: destroy() **Spiegazione del Codice** .. code-block:: python def lcdsetup(): LCD1602.init(0x27, 1) # init(indirizzo slave, retroilluminazione) def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(TRIG, GPIO.OUT) GPIO.setup(ECHO, GPIO.IN) GPIO.setup(BUZZER, GPIO.OUT, initial=GPIO.LOW) lcdsetup() In questo programma, utilizziamo componenti già impiegati precedentemente. Qui utilizziamo buzzer, LCD e sensore a ultrasuoni. Li possiamo inizializzare nello stesso modo già visto in precedenza. .. code-block:: python dis = distance() print (dis, 'cm') print ('') GPIO.output(BUZZER, GPIO.LOW) if (dis > 400): LCD1602.clear() LCD1602.write(0, 0, 'Error') LCD1602.write(3, 1, 'Out of range') time.sleep(0.5) else: LCD1602.clear() LCD1602.write(0, 0, 'Distance is') LCD1602.write(5, 1, str(round(dis,2)) +' cm') Qui otteniamo i valori del sensore a ultrasuoni e calcoliamo la distanza. Se la distanza supera l'intervallo rilevabile, un messaggio di errore viene visualizzato sul display LCD. Se la distanza è all'interno dell'intervallo di lavoro, verranno visualizzati i risultati corrispondenti. .. code-block:: python LCD1602.write(5, 1, str(round(dis,2)) +' cm') Poiché l'LCD supporta solo caratteri, dobbiamo usare **str()** per convertire i valori numerici in stringhe. Applichiamo un arrotondamento a due decimali. .. code-block:: python if(dis>=50): time.sleep(0.5) elif(dis<50 and dis>20): for i in range(0,2,1): GPIO.output(BUZZER, GPIO.HIGH) time.sleep(0.05) GPIO.output(BUZZER, GPIO.LOW) time.sleep(0.2) elif(dis<=20): for i in range(0,5,1): GPIO.output(BUZZER, GPIO.HIGH) time.sleep(0.05) GPIO.output(BUZZER, GPIO.LOW) time.sleep(0.05) Questa condizione viene utilizzata per controllare il suono del buzzer. In base alla distanza rilevata, possiamo distinguere tre casi con frequenze sonore diverse. Tutti gli intervalli di ritardo totali sono di 500ms, sufficienti per permettere al sensore a ultrasuoni di funzionare correttamente. Immagine del fenomeno ----------------------------- .. image:: ../img/image243.jpeg :align: center