.. note::

    Bonjour, bienvenue dans la communauté des passionnés de SunFounder Raspberry Pi, Arduino et ESP32 sur Facebook ! Plongez dans l'univers du Raspberry Pi, de l'Arduino et de l'ESP32 avec d'autres amateurs.

    **Pourquoi nous rejoindre ?**

    - **Assistance d'experts** : Résolvez vos problèmes après-vente et surmontez les défis techniques grâce à l'aide de notre communauté et de notre équipe.
    - **Apprenez & Partagez** : Échangez des conseils et des tutoriels pour perfectionner vos compétences.
    - **Avant-premières exclusives** : Soyez les premiers informés des nouvelles annonces de produits et découvrez des aperçus en exclusivité.
    - **Réductions spéciales** : Profitez de réductions exclusives sur nos nouveaux produits.
    - **Promotions festives et cadeaux** : Participez à des tirages au sort et bénéficiez de promotions spéciales pendant les fêtes.

    👉 Prêt à explorer et créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez-nous dès aujourd'hui !

.. _1.3.2_py_pi5:

1.3.2 Servo
==============

Introduction
---------------

Dans ce projet, nous allons apprendre à faire tourner un servo-moteur.

Composants requis
--------------------

Pour ce projet, nous aurons besoin des composants suivants :

.. image:: ../python_pi5/img/1.3.2_servo_list.png



Schéma de câblage
------------------------

.. image:: ../img/image337.png


Procédures expérimentales
------------------------------

**Étape 1 :** Construisez le circuit.

.. image:: ../img/image125.png

**Étape 2 :** Accédez au dossier contenant le code.
.. raw:: html

   <run></run>

.. code-block::

    cd ~/davinci-kit-for-raspberry-pi/python-pi5

**Étape 3 :** Exécutez le fichier.
.. raw:: html

   <run></run>

.. code-block::

    sudo python3 1.3.2_Servo.py

Après l'exécution du programme, le servo effectuera une rotation de 0° à 90°, puis à 180°, avant de revenir à 90° et enfin à 0°, en un mouvement cyclique.

.. warning::

    Si le message d'erreur ``RuntimeError: Cannot determine SOC peripheral base address`` apparaît, consultez :ref:`faq_soc`.

**Code**

.. note::

    Vous pouvez **modifier/réinitialiser/copier/exécuter/arrêter** le code ci-dessous. Avant de l'exécuter, assurez-vous de vous rendre dans le répertoire source comme ``davinci-kit-for-raspberry-pi/python-pi5``. Après modification, vous pouvez l'exécuter directement pour observer les résultats.
.. raw:: html

    <run></run>

.. code-block:: python

   #!/usr/bin/env python3
   from gpiozero import Servo
   from time import sleep

   # Définir le numéro de la broche GPIO où le servo est connecté
   myGPIO = 18

   # Définir un facteur de correction pour ajuster la largeur d'impulsion du servo
   myCorrection = 0.45
   maxPW = (2.0 + myCorrection) / 1000  # Calculer la largeur d'impulsion maximale
   minPW = (1.0 - myCorrection) / 1000  # Calculer la largeur d'impulsion minimale

   # Initialiser l'objet Servo avec des largeurs d'impulsion personnalisées
   servo = Servo(myGPIO, min_pulse_width=minPW, max_pulse_width=maxPW)

   try:
       while True:
           # Placer le servo à la position centrale et attendre
           servo.mid()
           print("mid")  # Indiquer la position actuelle
           sleep(0.5)       # Pause de 0,5 seconde

           # Déplacer le servo à sa position minimale et attendre
           servo.min()
           print("min")     # Indiquer la position actuelle
           sleep(1)         # Maintenir la position pendant 1 seconde

           # Revenir à la position centrale et attendre
           servo.mid()
           print("mid")  # Indiquer la position actuelle
           sleep(0.5)       # Pause de 0,5 seconde

           # Déplacer le servo à sa position maximale et attendre
           servo.max()
           print("max")     # Indiquer la position actuelle
           sleep(1)         # Maintenir la position pendant 1 seconde

   except KeyboardInterrupt:
       # Terminer le script proprement en cas d'interruption clavier (Ctrl+C)
       pass


**Explication du code**

1. Ces instructions importent la classe ``Servo`` pour le contrôle du servo et la fonction ``sleep`` pour la temporisation.

   .. code-block:: python

       #!/usr/bin/env python3
       from gpiozero import Servo
       from time import sleep

2. Définir le numéro de la broche GPIO utilisée (18) pour connecter le servo.

   .. code-block:: python

       # Définir le numéro de la broche GPIO où le servo est connecté
       myGPIO = 18

3. Ces lignes définissent un facteur de correction et l'utilisent pour calculer les largeurs d'impulsion maximales et minimales, ajustant ainsi la plage de mouvement du servo.

   .. code-block:: python

       # Définir un facteur de correction pour ajuster la largeur d'impulsion du servo
       myCorrection = 0.45
       maxPW = (2.0 + myCorrection) / 1000  # Calculer la largeur d'impulsion maximale
       minPW = (1.0 - myCorrection) / 1000  # Calculer la largeur d'impulsion minimale

4. Initialiser l'objet Servo avec la broche GPIO spécifiée et les largeurs d'impulsion définies.

   .. code-block:: python

       # Initialiser l'objet Servo avec des largeurs d'impulsion personnalisées
       servo = Servo(myGPIO, min_pulse_width=minPW, max_pulse_width=maxPW)

5. Le bloc `try` contient une boucle `while True` qui déplace continuellement le servo. Le servo se positionne au centre, aux points minimum et maximum, chaque position étant affichée et maintenue pendant une durée définie.

   .. code-block:: python

       try:
           while True:
               # Placer le servo à la position centrale et attendre
               servo.mid()
               print("mid")  # Indiquer la position actuelle
               sleep(0.5)       # Pause de 0,5 seconde

               # Déplacer le servo à sa position minimale et attendre
               servo.min()
               print("min")     # Indiquer la position actuelle
               sleep(1)         # Maintenir la position pendant 1 seconde

               # Revenir à la position centrale et attendre
               servo.mid()
               print("mid")  # Indiquer la position actuelle
               sleep(0.5)       # Pause de 0,5 seconde

               # Déplacer le servo à sa position maximale et attendre
               servo.max()
               print("max")     # Indiquer la position actuelle
               sleep(1)         # Maintenir la position pendant 1 seconde



       except KeyboardInterrupt:
       # Terminer le script proprement en cas d'interruption clavier (Ctrl+C)
       pass
