.. note::
Bonjour et bienvenue dans la Communauté Facebook des passionnés de Raspberry Pi, Arduino et ESP32 de SunFounder ! Plongez plus profondément dans l'univers des Raspberry Pi, Arduino et ESP32 avec d'autres passionnés.
**Pourquoi rejoindre ?**
- **Support d'experts** : Résolvez les problèmes après-vente et les défis techniques avec l'aide de notre communauté et de notre équipe.
- **Apprendre et partager** : Échangez des astuces et des tutoriels pour améliorer vos compétences.
- **Aperçus exclusifs** : Accédez en avant-première aux annonces de nouveaux produits et aux aperçus.
- **Réductions spéciales** : Profitez de réductions exclusives sur nos produits les plus récents.
- **Promotions festives et cadeaux** : Participez à des cadeaux et des promotions de vacances.
👉 Prêt à explorer et à créer avec nous ? Cliquez [|link_sf_facebook|] et rejoignez-nous aujourd'hui !
.. _4.1.9_py_pi5:
4.1.6 Alarme de Recul
======================================
Introduction
-------------
Dans ce projet, nous utiliserons un écran LCD, un buzzer et des capteurs à
ultrasons pour créer un système d'assistance au recul. Nous pouvons le placer
sur une voiture télécommandée pour simuler le processus réel de recul de la
voiture dans le garage.
Composants nécessaires
------------------------------
Pour ce projet, nous avons besoin des composants suivants.
.. image:: ../python_pi5/img/4.1.9_reversing_alarm_list.png
:width: 800
:align: center
Il est certainement pratique d'acheter un kit complet, voici le lien :
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Nom
- ÉLÉMENTS DANS CE KIT
- LIEN
* - Kit Raphael
- 337
- |link_Raphael_kit|
Vous pouvez également les acheter séparément via les liens ci-dessous.
.. list-table::
:widths: 30 20
:header-rows: 1
* - INTRODUCTION AUX COMPOSANTS
- LIEN D'ACHAT
* - :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|
Schéma
--------------------
Le capteur à ultrasons détecte la distance entre lui-même et l'obstacle,
qui sera affichée sur l'écran LCD sous forme de code. En même temps, le
capteur à ultrasons fait émettre au buzzer un son d'alerte de fréquence
différente selon la valeur de la distance.
============ ======== ======== ===
Nom T-Board Physique 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
Procédures expérimentales
--------------------------------
**Étape 1 :** Construire le circuit.
.. image:: ../python_pi5/img/4.1.9_reversing_alarm_circuit.png
:align: center
**Étape 2 :** Changer de répertoire.
.. raw:: html
.. code-block::
cd ~/raphael-kit/python-pi5
**Étape 3 :** Exécuter.
.. raw:: html
.. code-block::
sudo python3 4.1.9_ReversingAlarm_zero.py
Lorsque le code s'exécute, le module de capteur à ultrasons détecte la
distance à l'obstacle et affiche l'information sur la distance sur l'écran
LCD1602 ; de plus, le buzzer émet un son d'alerte dont la fréquence change
en fonction de la distance.
.. note::
* Si vous obtenez l'erreur ``FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1'``, vous devez vous référer à :ref:`i2c_config` pour activer l'I2C.
* Si vous obtenez l'erreur ``ModuleNotFoundError: No module named 'smbus2'``, veuillez exécuter ``sudo apt install python3-smbus2``.
* Si l'erreur ``OSError: [Errno 121] Remote I/O error`` apparaît, cela signifie que le module est mal câblé ou que le module est défectueux.
* Si le code et le câblage sont corrects, mais que l'écran LCD ne montre toujours pas de contenu, vous pouvez tourner le potentiomètre à l'arrière pour augmenter le contraste.
.. warning::
Si vous recevez le message d'erreur ``RuntimeError: Cannot determine SOC peripheral base address``, veuillez consulter :ref:`faq_soc`
**Code**
.. note::
Vous pouvez **Modifier/Réinitialiser/Copier/Exécuter/Arrêter** le code ci-dessous. Mais avant cela, vous devez accéder au chemin du code source comme ``raphael-kit/python-pi5``. Après avoir modifié le code, vous pouvez l'exécuter directement pour voir l'effet.
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
import LCD1602
import time
from gpiozero import DistanceSensor, Buzzer
# Initialize the ultrasonic sensor with GPIO pins
sensor = DistanceSensor(echo=24, trigger=23) # Echo pin is GPIO 24, Trigger pin is GPIO 23
# Initialize the buzzer connected to GPIO pin 17
buzzer = Buzzer(17)
def lcdsetup():
# Initialize the LCD with I2C address and enable backlight
LCD1602.init(0x27, 1) # 0x27 is the I2C address of the LCD
LCD1602.clear() # Clear the LCD display
# Display startup messages on LCD
LCD1602.write(0, 0, 'Ultrasonic Starting')
LCD1602.write(1, 1, 'By SunFounder')
time.sleep(2) # Wait for 2 seconds
def distance():
# Calculate and return the distance measured by the sensor
dis = sensor.distance * 100 # Convert distance to centimeters
print('Distance: {:.2f} cm'.format(dis)) # Print distance with two decimal places
time.sleep(0.3) # Wait for 0.3 seconds before next measurement
return dis
def loop():
# Continuously measure distance and update LCD and buzzer
while True:
dis = distance() # Get the current distance
# Display distance and handle alerts based on distance
if dis > 400: # Check if distance is out of range
LCD1602.clear()
LCD1602.write(0, 0, 'Error')
LCD1602.write(3, 1, 'Out of range')
time.sleep(0.5)
else:
# Display current distance on LCD
LCD1602.clear()
LCD1602.write(0, 0, 'Distance is')
LCD1602.write(5, 1, str(round(dis, 2)) + ' cm')
# Adjust buzzer frequency based on distance
if dis >= 50:
time.sleep(0.5)
elif 20 < dis < 50:
# Medium distance: medium buzzer frequency
for _ in range(2):
buzzer.on()
time.sleep(0.05)
buzzer.off()
time.sleep(0.2)
elif dis <= 20:
# Close distance: high buzzer frequency
for _ in range(5):
buzzer.on()
time.sleep(0.05)
buzzer.off()
time.sleep(0.05)
try:
lcdsetup() # Setup the LCD display
loop() # Start the measurement loop
except KeyboardInterrupt:
# Turn off buzzer and clear LCD on user interrupt (e.g., Ctrl+C)
buzzer.off()
LCD1602.clear()
**Explication du code**
#. Ce script utilise plusieurs bibliothèques pour son fonctionnement. La bibliothèque ``LCD1602`` gère l'affichage LCD, tandis que ``time`` fournit des fonctions liées au temps. La bibliothèque ``gpiozero`` est essentielle pour les interactions avec les broches GPIO du Raspberry Pi, en particulier pour l'utilisation du capteur de distance (DistanceSensor) et du buzzer.
.. code-block:: python
#!/usr/bin/env python3
import LCD1602
import time
from gpiozero import DistanceSensor, Buzzer
#. Le capteur à ultrasons est configuré avec ses broches écho et trigger connectées aux broches GPIO 24 et 23, respectivement. De plus, un buzzer est connecté à la broche GPIO 17.
.. code-block:: python
# Initialize the ultrasonic sensor with GPIO pins
sensor = DistanceSensor(echo=24, trigger=23) # Echo pin is GPIO 24, Trigger pin is GPIO 23
# Initialize the buzzer connected to GPIO pin 17
buzzer = Buzzer(17)
#. L'initialisation de l'écran LCD implique de l'effacer et d'afficher un message de démarrage.
.. code-block:: python
def lcdsetup():
# Initialize the LCD with I2C address and enable backlight
LCD1602.init(0x27, 1) # 0x27 is the I2C address of the LCD
LCD1602.clear() # Clear the LCD display
# Display startup messages on LCD
LCD1602.write(0, 0, 'Ultrasonic Starting')
LCD1602.write(1, 1, 'By SunFounder')
time.sleep(2) # Wait for 2 seconds
#. La fonction ``distance`` calcule la distance mesurée par le capteur à ultrasons et l'affiche, en renvoyant la valeur en centimètres.
.. code-block:: python
def distance():
# Calculate and return the distance measured by the sensor
dis = sensor.distance * 100 # Convert distance to centimeters
print('Distance: {:.2f} cm'.format(dis)) # Print distance with two decimal places
time.sleep(0.3) # Wait for 0.3 seconds before next measurement
return dis
#. La boucle principale mesure continuellement la distance, mettant à jour à la fois l'écran LCD et le buzzer. Elle gère différentes plages de distance avec des actions spécifiques, comme l'affichage de messages d'erreur ou la variation des fréquences du buzzer en fonction de la distance mesurée.
.. code-block:: python
def loop():
# Continuously measure distance and update LCD and buzzer
while True:
dis = distance() # Get the current distance
# Display distance and handle alerts based on distance
if dis > 400: # Check if distance is out of range
LCD1602.clear()
LCD1602.write(0, 0, 'Error')
LCD1602.write(3, 1, 'Out of range')
time.sleep(0.5)
else:
# Display current distance on LCD
LCD1602.clear()
LCD1602.write(0, 0, 'Distance is')
LCD1602.write(5, 1, str(round(dis, 2)) + ' cm')
# Adjust buzzer frequency based on distance
if dis >= 50:
time.sleep(0.5)
elif 20 < dis < 50:
# Medium distance: medium buzzer frequency
for _ in range(2):
buzzer.on()
time.sleep(0.05)
buzzer.off()
time.sleep(0.2)
elif dis <= 20:
# Close distance: high buzzer frequency
for _ in range(5):
buzzer.on()
time.sleep(0.05)
buzzer.off()
time.sleep(0.05)
#. Lors de l'exécution, le script configure l'écran LCD et entre dans la boucle principale. Il peut être interrompu avec une commande clavier (Ctrl+C), ce qui éteint le buzzer et efface l'écran LCD.
.. code-block:: python
try:
lcdsetup() # Setup the LCD display
loop() # Start the measurement loop
except KeyboardInterrupt:
# Turn off buzzer and clear LCD on user interrupt (e.g., Ctrl+C)
buzzer.off()
LCD1602.clear()