.. 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.8_py: 4.1.8 Bienvenue ===================================== Introduction ------------- Dans ce projet, nous utiliserons un PIR pour détecter le mouvement des piétons, et utiliserons des servomoteurs, une LED et un buzzer pour simuler le fonctionnement de la porte capteur d'un magasin de proximité. Lorsque le piéton apparaît dans la zone de détection du PIR, le voyant s'allume, la porte s'ouvre et le buzzer joue une sonnerie d'ouverture. Composants nécessaires ------------------------------ Pour ce projet, nous avons besoin des composants suivants. .. image:: ../img/list_Welcome.png :align: center Il est vraiment 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 à partir des liens ci-dessous. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUCTION DES 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_led` - |link_led_buy| * - :ref:`cpn_pir` - \- * - :ref:`cpn_servo` - |link_servo_buy| * - :ref:`cpn_buzzer` - |link_passive_buzzer_buy| * - :ref:`cpn_transistor` - |link_transistor_buy| Schéma de câblage --------------------- =============== ======== ======== === Nom de la carte physique wiringPi BCM GPIO18 Pin 12 1 18 GPIO17 Pin 11 0 17 GPIO27 Pin 13 2 27 GPIO22 Pin 15 3 22 =============== ======== ======== === .. image:: ../img/Schematic_three_one2.png :align: center Procédures expérimentales ----------------------------- **Étape 1 :** Construisez le circuit. .. image:: ../img/image239.png :align: center **Étape 2 :** Changez de répertoire. .. raw:: html .. code-block:: cd ~/raphael-kit/python/ **Étape 3 :** Exécutez. .. raw:: html .. code-block:: sudo python3 4.1.8_Welcome.py Après l'exécution du code, si le capteur PIR détecte quelqu'un passant à proximité, la porte s'ouvrira automatiquement (simulée par le servomoteur), l'indicateur s'allumera et la musique de la sonnette jouera. Une fois la musique terminée, le système fermera automatiquement la porte et éteindra l'indicateur, en attendant la prochaine détection de mouvement. Il y a deux potentiomètres sur le module PIR : l'un pour ajuster la sensibilité et l'autre pour ajuster la distance de détection. Pour optimiser le fonctionnement du module PIR, vous devez tourner les deux à fond dans le sens antihoraire. .. image:: ../img/PIR_TTE.png :width: 400 :align: center **Code** .. note:: Vous pouvez **Modifier/Réinitialiser/Copier/Exécuter/Arrêter** le code ci-dessous. Mais avant cela, vous devez aller dans le chemin du code source comme ``raphael-kit/python``. 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 RPi.GPIO as GPIO import time SERVO_MIN_PULSE = 500 SERVO_MAX_PULSE = 2500 ledPin = 18 # define the ledPin pirPin = 17 # define the sensorPin servoPin = 22 # define the servoPin buzPin = 27 # define the buzzerpin CL = [0, 131, 147, 165, 175, 196, 211, 248] # Frequency of Low C notes CM = [0, 262, 294, 330, 350, 393, 441, 495] # Frequency of Middle C notes CH = [0, 525, 589, 661, 700, 786, 882, 990] # Frequency of High C notes song = [ CH[5],CH[2],CM[6],CH[2],CH[3],CH[6],CH[3],CH[5],CH[3],CM[6],CH[2] ] beat = [ 1,1,1,1,1,2,1,1,1,1,1,] def setup(): global p global Buzz # Assign a global variable to replace GPIO.PWM GPIO.setmode(GPIO.BCM) # Numbers GPIOs by physical location GPIO.setup(ledPin, GPIO.OUT) # Set ledPin's mode is output GPIO.setup(pirPin, GPIO.IN) # Set sensorPin's mode is input GPIO.setup(servoPin, GPIO.OUT) # Set servoPin's mode is output GPIO.output(servoPin, GPIO.LOW) # Set servoPin to low GPIO.setup(buzPin, GPIO.OUT) # Set pins' mode is output Buzz = GPIO.PWM(buzPin, 440) # 440 is initial frequency. Buzz.start(50) # Start Buzzer pin with 50% duty ration p = GPIO.PWM(servoPin, 50) # set Frequece to 50Hz p.start(0) # Duty Cycle = 0 def map(value, inMin, inMax, outMin, outMax): return (outMax - outMin) * (value - inMin) / (inMax - inMin) + outMin def setAngle(angle): # make the servo rotate to specific angle (0-180 degrees) angle = max(0, min(180, angle)) pulse_width = map(angle, 0, 180, SERVO_MIN_PULSE, SERVO_MAX_PULSE) pwm = map(pulse_width, 0, 20000, 0, 100) p.ChangeDutyCycle(pwm)#map the angle to duty cycle and output it def doorbell(): for i in range(1, len(song)): # Play song 1 Buzz.ChangeFrequency(song[i]) # Change the frequency along the song note time.sleep(beat[i] * 0.25) # delay a note for beat * 0.25s time.sleep(1) # Wait a second for next song. def closedoor(): GPIO.output(ledPin, GPIO.LOW) for i in range(180, -1, -1): #make servo rotate from 180 to 0 deg setAngle(i) time.sleep(0.001) time.sleep(1) def opendoor(): GPIO.output(ledPin, GPIO.HIGH) for i in range(0, 181, 1): #make servo rotate from 0 to 180 deg setAngle(i) # Write to servo time.sleep(0.001) time.sleep(1) doorbell() closedoor() def loop(): while True: if GPIO.input(pirPin)==GPIO.HIGH: opendoor() def destroy(): GPIO.cleanup() # Release resource p.stop() Buzz.stop() if __name__ == '__main__': # Program start from here setup() try: loop() except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the program destroy() will be executed. destroy() **Explication du code** .. code-block:: python def setup(): global p global Buzz # Assign a global variable to replace GPIO.PWM GPIO.setmode(GPIO.BCM) # Numbers GPIOs by physical location GPIO.setup(ledPin, GPIO.OUT) # Set ledPin's mode is output GPIO.setup(pirPin, GPIO.IN) # Set sensorPin's mode is input GPIO.setup(buzPin, GPIO.OUT) # Set pins' mode is output Buzz = GPIO.PWM(buzPin, 440) # 440 is initial frequency. Buzz.start(50) # Start Buzzer pin with 50% duty ration GPIO.setup(servoPin, GPIO.OUT) # Set servoPin's mode is output GPIO.output(servoPin, GPIO.LOW) # Set servoPin to low p = GPIO.PWM(servoPin, 50) # set Frequece to 50Hz p.start(0) # Duty Cycle = 0 Ces instructions servent à initialiser les broches de chaque composant. .. code-block:: python def setAngle(angle): # make the servo rotate to specific angle (0-180 degrees) angle = max(0, min(180, angle)) pulse_width = map(angle, 0, 180, SERVO_MIN_PULSE, SERVO_MAX_PULSE) pwm = map(pulse_width, 0, 20000, 0, 100) p.ChangeDutyCycle(pwm)#map the angle to duty cycle and output it Créer une fonction, servowrite, pour écrire l'angle dans le servo, entre 0 et 180 degrés. .. code-block:: python def doorbell(): for i in range(1,len(song)): # Play song1 Buzz.ChangeFrequency(song[i]) # Change the frequency along the song note time.sleep(beat[i] * 0.25) # delay a note for beat * 0.25s Créer une fonction, doorbell, pour permettre au buzzer de jouer de la musique. .. code-block:: python def closedoor(): GPIO.output(ledPin, GPIO.LOW) Buzz.ChangeFrequency(1) for i in range(180, -1, -1): #make servo rotate from 180 to 0 deg setAngle(i) time.sleep(0.001) Fermer la porte et éteindre la lumière indicatrice. .. code-block:: python def opendoor(): GPIO.output(ledPin, GPIO.HIGH) for i in range(0, 181, 1): #make servo rotate from 0 to 180 deg setAngle(i) # Write to servo time.sleep(0.001) doorbell() closedoor() La fonction, ``opendoor()`` se compose de plusieurs parties : allumer la lumière indicatrice, faire tourner le servo (pour simuler l'action d'ouverture de la porte), jouer la musique de la sonnette du magasin de proximité, et appeler la fonction, ``closedoor()`` après avoir joué de la musique. .. code-block:: python def loop(): while True: if GPIO.input(pirPin)==GPIO.HIGH: opendoor() Lorsque le PIR détecte qu'une personne passe, il appelle la fonction, ``opendoor()`` . Image du phénomène ----------------------- .. image:: ../img/image240.jpeg :align: center