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 [Ici] et rejoignez-nous dès aujourd’hui !
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.
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 |
Procédure expérimentale
Étape 1 : Construisez le circuit.
Étape 2 : Changez de répertoire.
cd ~/davinci-kit-for-raspberry-pi/python-pi5
Étape 3 : Exécutez le fichier.
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.
Avertissement
Si un message d’erreur RuntimeError: Cannot determine SOC peripheral base address apparaît, veuillez consulter Si gpiozero ne fonctionne pas.
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.
#!/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
gpiozeroest utilisée pour interfacer la LED, le capteur de mouvement, le servo-moteur et le buzzer tonal. Le moduletimeest utilisé pour gérer les fonctions liées au temps.#!/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.
# 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.
# 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.
# 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).
# 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.
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.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
opendoorallume la LED, ouvre la porte, joue la mélodie, puis referme la porte.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.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.
try: loop() except KeyboardInterrupt: # Nettoyer les GPIO en cas d'interruption par l'utilisateur (ex: Ctrl+C) buzPin.stop() ledPin.off()