.. note::
Bonjour et bienvenue dans la communauté SunFounder des passionnés de Raspberry Pi, Arduino et ESP32 sur Facebook ! Plongez au cœur du Raspberry Pi, de l’Arduino et de l’ESP32 aux côtés d’autres passionnés.
**Pourquoi nous rejoindre ?**
- **Support d'experts** : Résolvez les problèmes post-vente et les défis techniques grâce à l'aide de notre communauté et de notre équipe.
- **Apprendre et partager** : Échangez des astuces et des tutoriels pour perfectionner vos compétences.
- **Avant-premières exclusives** : Accédez en avant-première aux annonces de nouveaux produits et aux aperçus.
- **Réductions spéciales** : Profitez de remises exclusives sur nos derniers produits.
- **Promotions festives et concours** : Participez à des tirages au sort et à des promotions spéciales.
👉 Prêt à explorer et créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez-nous dès aujourd'hui !
.. _py_pi5_alarm:
3.1.3 Alarme de Recul
========================
Introduction
---------------
Dans ce projet, nous allons utiliser un écran LCD, un buzzer et des capteurs
ultrasoniques pour créer un système d’assistance au stationnement en marche
arrière. Nous pourrons le placer sur un véhicule télécommandé pour simuler le
processus réel de recul d’une voiture dans un garage.
Composants Nécessaires
-------------------------
Pour ce projet, nous aurons besoin des composants suivants :
.. image:: ../python_pi5/img/4.1.9_reversing_alarm_list.png
:width: 800
:align: center
.. C'est certainement plus pratique d'acheter un kit complet, voici le lien :
.. .. list-table::
.. :widths: 20 20 20
.. :header-rows: 1
.. * - Nom
.. - COMPOSANTS DANS CE KIT
.. - LIEN
.. * - Kit Raphael
.. - 337
.. - |link_Raphael_kit|
.. Vous pouvez également les acheter séparément aux liens ci-dessous.
.. .. list-table::
.. :widths: 30 20
.. :header-rows: 1
.. * - INTRODUCTION DU COMPOSANT
.. - LIEN D'ACHAT
.. * - :ref:`gpio_extension_board`
.. - |link_gpio_board_buy|
.. * - :ref:`breadboard`
.. - |link_breadboard_buy|
.. * - :ref:`wires`
.. - |link_wires_buy|
.. * - :ref:`resistor`
.. - |link_resistor_buy|
.. * - :ref:`buzzer`
.. - \-
.. * - :ref:`transistor`
.. - |link_transistor_buy|
.. * - :ref:`ultrasonic_sensor`
.. - |link_ultrasonic_buy|
.. * - :ref:`i2c_lcd1602`
.. - |link_i2clcd1602_buy|
Schéma de Câblage
----------------------
Le capteur ultrasonique détecte la distance entre lui-même et l'obstacle, qui
sera affichée sur l'écran LCD sous forme de valeur numérique. Simultanément,
le capteur active le buzzer, émettant des sons d’alerte de fréquences différentes
selon la valeur de la distance.
============ ======== ======== ===
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
Procédures Expérimentales
-----------------------------
**Étape 1 :** Montez le circuit.
.. image:: ../python_pi5/img/4.1.9_reversing_alarm_circuit.png
:align: center
**Étape 2 :** Changez le répertoire.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python-pi5
**Étape 3 :** Exécutez le programme.
.. raw:: html
.. code-block::
sudo python3 3.1.3_ReversingAlarm.py
Lorsque le programme s’exécute, le module de capteur ultrasonique détecte la
distance jusqu’à l’obstacle, affiche l’information sur l’écran LCD1602 et émet
des tonalités d’avertissement dont la fréquence varie en fonction de la distance détectée.
.. note::
* Si vous recevez l'erreur ``FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1'``, veuillez consulter :ref:`i2c_config` pour activer l'I2C.
* Si vous recevez l'erreur ``ModuleNotFoundError: No module named 'smbus2'``, exécutez la commande ``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 qu’il est défectueux.
* Si le code et le câblage sont corrects, mais que l'écran LCD n'affiche toujours pas de contenu, vous pouvez tourner le potentiomètre à l'arrière pour augmenter le contraste.
.. warning::
Si un message d'erreur du type ``RuntimeError: Cannot determine SOC peripheral base address`` apparaît, veuillez vous référer à :ref:`faq_soc`.
**Code**
.. note::
Vous pouvez **modifier/réinitialiser/copier/exécuter/arrêter** le code ci-dessous. Cependant, avant cela, assurez-vous d'être dans le répertoire source comme ``davinci-kit-for-raspberry-pi/python-pi5``. Après modification, vous pouvez exécuter le code pour observer les résultats.
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
import LCD1602
import time
from gpiozero import DistanceSensor, Buzzer
# Initialisation du capteur ultrasonique avec les broches GPIO
sensor = DistanceSensor(echo=24, trigger=23) # Broche Echo : GPIO 24, Broche Trigger : GPIO 23
# Initialisation du buzzer connecté à la broche GPIO 17
buzzer = Buzzer(17)
def lcdsetup():
# Initialisation de l'écran LCD avec l'adresse I2C et activation du rétroéclairage
LCD1602.init(0x27, 1) # 0x27 est l'adresse I2C de l'écran LCD
LCD1602.clear() # Effacer l'écran LCD
# Affichage des messages de démarrage sur l'écran LCD
LCD1602.write(0, 0, 'Ultrasonic Starting')
LCD1602.write(1, 1, 'By SunFounder')
time.sleep(2) # Attendre 2 secondes
def distance():
# Calculer et retourner la distance mesurée par le capteur
dis = sensor.distance * 100 # Convertir la distance en centimètres
print('Distance: {:.2f} cm'.format(dis)) # Afficher la distance avec deux décimales
time.sleep(0.3) # Attendre 0,3 seconde avant la prochaine mesure
return dis
def loop():
# Mesurer la distance en continu et mettre à jour l'écran LCD et le buzzer
while True:
dis = distance() # Obtenir la distance actuelle
# Afficher la distance et gérer les alertes en fonction de celle-ci
if dis > 400: # Vérifier si la distance est hors de portée
LCD1602.clear()
LCD1602.write(0, 0, 'Error')
LCD1602.write(3, 1, 'Out of range')
time.sleep(0.5)
else:
# Afficher la distance actuelle sur l'écran LCD
LCD1602.clear()
LCD1602.write(0, 0, 'Distance is')
LCD1602.write(5, 1, str(round(dis, 2)) + ' cm')
# Ajuster la fréquence du buzzer en fonction de la distance
if dis >= 50:
time.sleep(0.5)
elif 20 < dis < 50:
# Distance moyenne : fréquence moyenne du buzzer
for _ in range(2):
buzzer.on()
time.sleep(0.05)
buzzer.off()
time.sleep(0.2)
elif dis <= 20:
# Distance proche : fréquence élevée du buzzer
for _ in range(5):
buzzer.on()
time.sleep(0.05)
buzzer.off()
time.sleep(0.05)
try:
lcdsetup() # Configurer l'écran LCD
loop() # Démarrer la boucle de mesure
except KeyboardInterrupt:
# Éteindre le buzzer et effacer l'écran LCD en cas d'interruption par l'utilisateur (ex. Ctrl+C)
buzzer.off()
LCD1602.clear()
**Explication du Code**
#. Ce script utilise plusieurs bibliothèques pour son bon fonctionnement. La bibliothèque ``LCD1602`` gère l'affichage de l'écran LCD, tandis que ``time`` fournit les fonctions liées au temps. La bibliothèque ``gpiozero`` est essentielle pour les interactions avec les broches GPIO du Raspberry Pi, en particulier pour contrôler le capteur de distance et le buzzer.
.. code-block:: python
#!/usr/bin/env python3
import LCD1602
import time
from gpiozero import DistanceSensor, Buzzer
#. Le capteur ultrasonique est configuré avec ses broches Echo et Trigger connectées respectivement aux broches GPIO 24 et 23. De plus, un buzzer est connecté à la broche GPIO 17.
.. code-block:: python
# Initialisation du capteur ultrasonique avec les broches GPIO
sensor = DistanceSensor(echo=24, trigger=23) # Broche Echo : GPIO 24, Broche Trigger : GPIO 23
# Initialisation du buzzer connecté à la broche GPIO 17
buzzer = Buzzer(17)
#. L'initialisation de l'écran LCD consiste à le configurer, à effacer l'affichage et à afficher un message de démarrage.
.. code-block:: python
def lcdsetup():
# Initialisation de l'écran LCD avec l'adresse I2C et activation du rétroéclairage
LCD1602.init(0x27, 1) # 0x27 est l'adresse I2C de l'écran LCD
LCD1602.clear() # Effacer l'écran LCD
# Affichage des messages de démarrage sur l'écran LCD
LCD1602.write(0, 0, 'Ultrasonic Starting')
LCD1602.write(1, 1, 'By SunFounder')
time.sleep(2) # Attendre 2 secondes
#. La fonction ``distance`` calcule la distance mesurée par le capteur ultrasonique et l'affiche, puis retourne la valeur en centimètres.
.. code-block:: python
def distance():
# Calculer et retourner la distance mesurée par le capteur
dis = sensor.distance * 100 # Convertir la distance en centimètres
print('Distance: {:.2f} cm'.format(dis)) # Afficher la distance avec deux décimales
time.sleep(0.3) # Attendre 0,3 seconde avant la prochaine mesure
return dis
#. La boucle principale mesure continuellement la distance, met à jour l'écran LCD et le buzzer. Elle gère les différentes plages de distance avec des actions spécifiques, comme l'affichage de messages d'erreur ou la variation de la fréquence du buzzer en fonction de la distance mesurée.
.. code-block:: python
def loop():
# Mesurer continuellement la distance et mettre à jour l'écran LCD et le buzzer
while True:
dis = distance() # Obtenir la distance actuelle
# Afficher la distance et gérer les alertes en fonction de celle-ci
if dis > 400: # Vérifier si la distance est hors de portée
LCD1602.clear()
LCD1602.write(0, 0, 'Error')
LCD1602.write(3, 1, 'Out of range')
time.sleep(0.5)
else:
# Afficher la distance actuelle sur l'écran LCD
LCD1602.clear()
LCD1602.write(0, 0, 'Distance is')
LCD1602.write(5, 1, str(round(dis, 2)) + ' cm')
# Ajuster la fréquence du buzzer en fonction de la distance
if dis >= 50:
time.sleep(0.5)
elif 20 < dis < 50:
# Distance moyenne : fréquence moyenne du buzzer
for _ in range(2):
buzzer.on()
time.sleep(0.05)
buzzer.off()
time.sleep(0.2)
elif dis <= 20:
# Distance proche : fréquence élevée du buzzer
for _ in range(5):
buzzer.on()
time.sleep(0.05)
buzzer.off()
time.sleep(0.05)
#. Lors de l'exécution, le script initialise l'écran LCD et entre dans la boucle principale. Il peut être interrompu par une commande clavier (Ctrl+C), ce qui éteint le buzzer et efface l'écran LCD.
.. code-block:: python
try:
lcdsetup() # Configurer l'écran LCD
loop() # Démarrer la boucle de mesure
except KeyboardInterrupt:
# Éteindre le buzzer et effacer l'écran LCD en cas d'interruption par l'utilisateur (ex. Ctrl+C)
buzzer.off()
LCD1602.clear()