.. note::
Bonjour, bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 sur Facebook ! Plongez dans l’univers du Raspberry Pi, de l’Arduino et de l’ESP32 avec d’autres passionnés.
**Pourquoi nous rejoindre ?**
- **Assistance 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 conseils et des tutoriels pour améliorer vos compétences.
- **Aperçus exclusifs** : Bénéficiez d’un accès anticipé aux annonces de nouveaux produits et à des avant-premières exclusives.
- **Réductions spéciales** : Profitez de remises exclusives sur nos derniers produits.
- **Promotions festives et cadeaux** : Participez à des promotions festives et à des concours pour gagner des cadeaux.
👉 Prêt à explorer et à créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez-nous dès aujourd’hui !
.. _py_pi5_welcome:
3.1.2 Bienvenue
===============================
Introduction
----------------
Dans ce projet, nous utiliserons un capteur PIR pour détecter les mouvements des
piétons et utiliserons des servos, une LED et un buzzer pour simuler le fonctionnement
d’une porte automatique de magasin. Lorsque le piéton entre dans la zone de détection
du PIR, le voyant s’allume, la porte s’ouvre et le buzzer joue une mélodie d’accueil.
Composants nécessaires
------------------------------
Pour ce projet, nous aurons besoin des composants suivants.
.. image:: ../python_pi5/img/4.1.8_welcome_list.png
:width: 100%
:align: center
.. Il est plus pratique d’acheter un kit complet, voici le lien :
.. .. list-table::
.. :widths: 20 20 20
.. :header-rows: 1
.. * - Nom
.. - ARTICLES 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:`gpio_extension_board`
.. - |link_gpio_board_buy|
.. * - :ref:`breadboard`
.. - |link_breadboard_buy|
.. * - :ref:`wires`
.. - |link_wires_buy|
.. * - :ref:`resistor`
.. - |link_resistor_buy|
.. * - :ref:`led`
.. - |link_led_buy|
.. * - :ref:`pir`
.. - \-
.. * - :ref:`servo`
.. - |link_servo_buy|
.. * - :ref:`Buzzer`
.. - |link_passive_buzzer_buy|
.. * - :ref:`transistor`
.. - |link_transistor_buy|
Schéma de câblage
---------------------
============ ======== ======== ===
T-Board Name physical wiringPi BCM
GPIO18 Pin 12 1 18
GPIO17 Pin 11 0 17
GPIO27 Pin 13 2 27
GPIO22 Pin 15 3 22
============ ======== ======== ===
.. image:: ../python_pi5/img/4.1.8_welcome_schematic.png
:align: center
Procédure expérimentale
----------------------------
**Étape 1 :** Construisez le circuit.
.. image:: ../python_pi5/img/4.1.8_welcome_circuit.png
:align: center
**Étape 2 :** Changez de répertoire.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python-pi5
**Étape 3 :** Exécutez le fichier.
.. raw:: html
.. code-block::
sudo python3 3.1.2_Welcome.py
Une fois le code exécuté, si le capteur PIR détecte le passage de quelqu’un,
la porte s’ouvre automatiquement (simulée par le servo), le voyant s’allume et
la mélodie de la sonnette retentit. Après la mélodie, le système fermera
automatiquement la porte, éteindra le voyant et attendra le passage de la
prochaine personne.
Il y a deux potentiomètres sur le module PIR : l’un ajuste la sensibilité et
l’autre la distance de détection. Pour optimiser le fonctionnement du module PIR,
tournez-les tous les deux dans le sens inverse des aiguilles d'une montre jusqu'à la butée.
.. image:: ../python_pi5/img/4.1.8_PIR_TTE.png
:width: 400
:align: center
.. warning::
Si un message d’erreur ``RuntimeError: Cannot determine SOC peripheral base address`` apparaît, 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 source comme ``davinci-kit-for-raspberry-pi/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
from gpiozero import LED, MotionSensor, Servo, TonalBuzzer
import time
# Configuration des broches GPIO pour la LED, le capteur de mouvement (PIR) et le buzzer
ledPin = LED(6)
pirPin = MotionSensor(21)
buzPin = TonalBuzzer(27)
# Facteur de correction de la largeur d'impulsion du servo et calcul
myCorrection = 0.45
maxPW = (2.0 + myCorrection) / 1000 # Largeur d'impulsion maximale
minPW = (1.0 - myCorrection) / 1000 # Largeur d'impulsion minimale
# Initialisation du servo avec des largeurs d'impulsion personnalisées
servoPin = Servo(25, min_pulse_width=minPW, max_pulse_width=maxPW)
# Mélodie musicale pour le buzzer, avec les notes et les durées correspondantes
tune = [('C#4', 0.2), ('D4', 0.2), (None, 0.2),
('Eb4', 0.2), ('E4', 0.2), (None, 0.6),
('F#4', 0.2), ('G4', 0.2), (None, 0.6),
('Eb4', 0.2), ('E4', 0.2), (None, 0.2),
('F#4', 0.2), ('G4', 0.2), (None, 0.2),
('C4', 0.2), ('B4', 0.2), (None, 0.2),
('F#4', 0.2), ('G4', 0.2), (None, 0.2),
('B4', 0.2), ('Bb4', 0.5), (None, 0.6),
('A4', 0.2), ('G4', 0.2), ('E4', 0.2),
('D4', 0.2), ('E4', 0.2)]
def setAngle(angle):
"""
Move the servo to a specified angle.
:param angle: Angle in degrees (0-180).
"""
value = float(angle / 180) # Convertit l'angle en valeur servo
servoPin.value = value # Définit la position du servo
time.sleep(0.001) # Courte pause pour permettre le mouvement du servo
def doorbell():
"""
Play a musical tune using the buzzer.
"""
for note, duration in tune:
buzPin.play(note) # Jouer la note
time.sleep(float(duration)) # Durée de la note
buzPin.stop() # Arrêter le buzzer après avoir joué la mélodie
def closedoor():
# Éteindre la LED et déplacer le servo pour fermer la porte
ledPin.off()
for i in range(180, -1, -1):
setAngle(i) # Déplacer le servo de 180 à 0 degrés
time.sleep(0.001) # Courte pause pour un mouvement fluide
time.sleep(1) # Attente après la fermeture de la porte
def opendoor():
# Allumer la LED, ouvrir la porte (déplacer le servo), jouer la mélodie et refermer la porte
ledPin.on()
for i in range(0, 181):
setAngle(i) # Déplacer le servo de 0 à 180 degrés
time.sleep(0.001) # Courte pause pour un mouvement fluide
time.sleep(1) # Attendre avant de jouer la mélodie
doorbell() # Jouer la mélodie de la sonnette
closedoor() # Fermer la porte après la mélodie
def loop():
# Boucle principale pour vérifier la détection de mouvement et faire fonctionner la porte
while True:
if pirPin.motion_detected:
opendoor() # Ouvrir la porte si un mouvement est détecté
time.sleep(0.1) # Courte pause dans la boucle
try:
loop()
except KeyboardInterrupt:
# Nettoyer les GPIO en cas d'interruption par l'utilisateur (ex: Ctrl+C)
buzPin.stop()
ledPin.off()
**Explication du Code**
#. Le script commence par importer les modules nécessaires. La bibliothèque ``gpiozero`` est utilisée pour interfacer la LED, le capteur de mouvement, le servo-moteur et le buzzer tonal. Le module ``time`` est utilisé pour gérer les fonctions liées au temps.
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import LED, MotionSensor, Servo, TonalBuzzer
import time
#. Initialisation des broches GPIO pour la LED, le capteur de mouvement PIR et le buzzer tonal.
.. code-block:: python
# Configuration des broches GPIO pour la LED, le capteur de mouvement (PIR) et le buzzer
ledPin = LED(6)
pirPin = MotionSensor(21)
buzPin = TonalBuzzer(27)
#. Calcule les largeurs d'impulsion maximale et minimale pour le servo-moteur, en intégrant un facteur de correction pour un positionnement précis.
.. code-block:: python
# Facteur de correction de la largeur d'impulsion du servo et calcul
myCorrection = 0.45
maxPW = (2.0 + myCorrection) / 1000 # Largeur d'impulsion maximale
minPW = (1.0 - myCorrection) / 1000 # Largeur d'impulsion minimale
#. Initialise le servo-moteur sur la broche GPIO 25 avec des largeurs d'impulsion personnalisées pour un positionnement précis.
.. code-block:: python
# Initialisation du servo avec des largeurs d'impulsion personnalisées
servoPin = Servo(25, min_pulse_width=minPW, max_pulse_width=maxPW)
#. La mélodie est définie comme une séquence de notes (fréquences) et de durées (en secondes).
.. code-block:: python
# Mélodie musicale pour le buzzer, avec notes et durées
tune = [('C#4', 0.2), ('D4', 0.2), (None, 0.2),
('Eb4', 0.2), ('E4', 0.2), (None, 0.6),
('F#4', 0.2), ('G4', 0.2), (None, 0.6),
('Eb4', 0.2), ('E4', 0.2), (None, 0.2),
('F#4', 0.2), ('G4', 0.2), (None, 0.2),
('C4', 0.2), ('B4', 0.2), (None, 0.2),
('F#4', 0.2), ('G4', 0.2), (None, 0.2),
('B4', 0.2), ('Bb4', 0.5), (None, 0.6),
('A4', 0.2), ('G4', 0.2), ('E4', 0.2),
('D4', 0.2), ('E4', 0.2)]
#. Fonction pour déplacer le servo à un angle spécifié. Convertit l'angle en une valeur comprise entre 0 et 1 pour le positionnement du servo.
.. code-block:: python
def setAngle(angle):
"""
Move the servo to a specified angle.
:param angle: Angle in degrees (0-180).
"""
value = float(angle / 180) # Convertit l'angle en valeur servo
servoPin.value = value # Définit la position du servo
time.sleep(0.001) # Courte pause pour permettre le mouvement du servo
#. Fonction pour jouer une mélodie musicale à l'aide du buzzer. Itère à travers la liste ``tune``, jouant chaque note pour sa durée spécifiée.
.. code-block:: python
def doorbell():
"""
Play a musical tune using the buzzer.
"""
for note, duration in tune:
buzPin.play(note) # Jouer la note
time.sleep(float(duration)) # Durée de la note
buzPin.stop() # Arrêter le buzzer après avoir joué la mélodie
#. Fonctions pour ouvrir et fermer la porte à l'aide du servo-moteur. La fonction ``opendoor`` allume la LED, ouvre la porte, joue la mélodie, puis referme la porte.
.. code-block:: python
def closedoor():
# Éteindre la LED et déplacer le servo pour fermer la porte
ledPin.off()
for i in range(180, -1, -1):
setAngle(i) # Déplacer le servo de 180 à 0 degrés
time.sleep(0.001) # Courte pause pour un mouvement fluide
time.sleep(1) # Attendre après la fermeture de la porte
def opendoor():
# Allumer la LED, ouvrir la porte (déplacer le servo), jouer la mélodie et refermer la porte
ledPin.on()
for i in range(0, 181):
setAngle(i) # Déplacer le servo de 0 à 180 degrés
time.sleep(0.001) # Courte pause pour un mouvement fluide
time.sleep(1) # Attendre avant de jouer la mélodie
doorbell() # Jouer la mélodie de la sonnette
closedoor() # Fermer la porte après la mélodie
#. Boucle principale qui vérifie en continu la détection de mouvement. Lorsqu'un mouvement est détecté, elle déclenche la fonction ``opendoor``.
.. code-block:: python
def loop():
# Boucle principale pour vérifier la détection de mouvement et faire fonctionner la porte
while True:
if pirPin.motion_detected:
opendoor() # Ouvrir la porte si un mouvement est détecté
time.sleep(0.1) # Courte pause dans la boucle
#. Exécute la boucle principale et s'assure que le script peut être arrêté avec un signal clavier (Ctrl+C), désactivant le buzzer et la LED pour une sortie propre.
.. code-block:: python
try:
loop()
except KeyboardInterrupt:
# Nettoyer les GPIO en cas d'interruption par l'utilisateur (ex: Ctrl+C)
buzPin.stop()
ledPin.off()