.. note::

    Bonjour, bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts sur Facebook ! Plongez au cœur du Raspberry Pi, Arduino et ESP32 avec d'autres passionnés.

    **Pourquoi nous rejoindre ?**

    - **Support d'experts** : Résolvez vos problèmes post-vente et défis techniques grâce à l'aide de notre communauté et de notre équipe.
    - **Apprendre & Partager** : Échangez des conseils 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 exclusifs.
    - **Réductions spéciales** : Profitez de réductions exclusives sur nos nouveaux produits.
    - **Promotions festives et cadeaux** : Participez à des concours et des 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.1 Moteur
===============

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

Dans cette leçon, nous apprendrons à utiliser le L293D pour piloter un moteur à 
courant continu (DC) et le faire tourner dans le sens horaire et antihoraire. 
Comme le moteur DC nécessite un courant plus important, pour des raisons de sécurité, 
nous utilisons ici le module d'alimentation pour alimenter les moteurs.

Composants
------------

.. image:: img/list_1.3.1.png

Principe
-----------

**L293D**

Le L293D est un circuit intégré de pilote de moteur à 4 canaux avec haute tension et 
haut courant. Il est conçu pour se connecter aux niveaux logiques standards DTL, TTL, 
et pour piloter des charges inductives (comme des relais, moteurs DC, moteurs pas à pas) 
ainsi que des transistors de commutation de puissance, etc. Les moteurs DC sont des 
dispositifs qui transforment l'énergie électrique en énergie mécanique. Ils sont largement 
utilisés pour leur excellente performance de régulation de vitesse.

Voyez l'image des broches ci-dessous. Le L293D dispose de deux broches (Vcc1 et Vcc2) pour 
l'alimentation. Vcc2 est utilisé pour alimenter le moteur, tandis que Vcc1 alimente la puce. 
Comme un petit moteur DC est utilisé ici, connectez les deux broches au +5V.

.. image:: img/image111.png

L'image suivante montre la structure interne du L293D. La broche EN est une broche 
d'activation et ne fonctionne qu'avec un niveau haut. A représente l'entrée et Y la 
sortie. Vous pouvez voir la relation entre eux en bas à droite. Lorsque la broche EN 
est à un niveau haut, si A est à un niveau haut, Y envoie un niveau haut ; si A est à 
un niveau bas, Y envoie un niveau bas. Lorsque la broche EN est à un niveau bas, le 
L293D ne fonctionne pas.

.. image:: img/image334.png

**Moteur DC**

.. image:: img/image114.jpeg

Voici un moteur DC 5V. Il tourne lorsque vous appliquez un niveau haut à une borne et 
un niveau bas à l'autre. Pour plus de commodité, vous pouvez souder des broches à ses bornes.

.. image:: img/image335.png

**Module d'alimentation**

Dans cette expérience, il faut des courants importants pour entraîner le moteur, surtout 
lors des démarrages et arrêts, ce qui peut interférer avec le fonctionnement normal du 
Raspberry Pi. Par conséquent, nous alimentons séparément le moteur via ce module afin 
qu'il fonctionne de manière sûre et stable.

Vous pouvez simplement le brancher sur la breadboard pour l'alimenter. Il fournit une 
tension de 3,3V ou 5V, et vous pouvez choisir l'une ou l'autre avec un cavalier inclus.

.. image:: img/image115.png

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

Branchez le module d'alimentation sur la breadboard et insérez le cavalier sur la broche 
5V pour obtenir une sortie de 5V. Connectez la broche 1 du L293D au GPIO22, et réglez-la 
sur un niveau haut. Connectez la broche 2 au GPIO27, et la broche 7 au GPIO17. Réglez une 
broche sur un niveau haut et l'autre sur un niveau bas. Ainsi, vous pouvez changer la 
direction de rotation du moteur.

.. image:: img/image336.png


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

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

.. image:: img/1.3.1.png
    :width: 800

.. note::
    Le module d'alimentation peut être utilisé avec une pile 9V grâce à l'attache de 
    pile 9V fournie dans le kit. Insérez le cavalier du module d'alimentation dans les 
    barres d'alimentation 5V de la breadboard.

.. image:: img/image118.jpeg


Pour les utilisateurs du langage C
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**Étape 2 :** Accédez au dossier du code.

.. raw:: html

    <run></run>

.. code-block::

    cd ~/davinci-kit-for-raspberry-pi/c/1.3.1/

**Étape 3 :** Compilez le code.

.. raw:: html

   <run></run>

.. code-block::

    gcc 1.3.1_Motor.c -lwiringPi

**Étape 4 :** Exécutez le fichier exécutable ci-dessus.

.. raw:: html

   <run></run>

.. code-block::

    sudo ./a.out

Lorsque le code s'exécute, le moteur tourne d'abord dans le sens horaire pendant 
5 secondes, puis s'arrête pendant 5 secondes. Ensuite, il tourne dans le sens 
antihoraire pendant 5 secondes, puis s'arrête à nouveau pendant 5 secondes. 
Cette série d'actions sera exécutée en boucle.

.. note::

    Si cela ne fonctionne pas après exécution ou si un message d'erreur s'affiche : \"wiringPi.h: Aucun fichier ou répertoire de ce type », veuillez consulter :ref:`C code is not working?`.
**Code**

.. code-block:: c

    #include <wiringPi.h>
    #include <stdio.h>

    #define MotorPin1       0
    #define MotorPin2       2
    #define MotorEnable     3

    int main(void){
        int i;
        if(wiringPiSetup() == -1){ //en cas d'échec de l'initialisation de wiringPi, affichage du message à l'écran
            printf("setup wiringPi failed !");
            return 1;
        }
        
        pinMode(MotorPin1, OUTPUT);
        pinMode(MotorPin2, OUTPUT);
        pinMode(MotorEnable, OUTPUT);
        while(1){
            printf("Clockwise\n");
            delay(100);
            digitalWrite(MotorEnable, HIGH);
            digitalWrite(MotorPin1, HIGH);
            digitalWrite(MotorPin2, LOW);
            for(i=0;i<3;i++){
                delay(1000);
            }

            printf("Stop\n");
            delay(100);
            digitalWrite(MotorEnable, LOW);
            for(i=0;i<3;i++){
                delay(1000);
            }

            printf("Anti-clockwise\n");
            delay(100);
            digitalWrite(MotorEnable, HIGH);
            digitalWrite(MotorPin1, LOW);
            digitalWrite(MotorPin2, HIGH);
            for(i=0;i<3;i++){
                delay(1000);
            }

            printf("Stop\n");
            delay(100);
            digitalWrite(MotorEnable, LOW);
            for(i=0;i<3;i++){
                delay(1000);
            }
        }
        return 0;
    }

**Explication du code**

.. code-block:: c

    digitalWrite(MotorEnable, HIGH);

Active le L239D.

.. code-block:: c

    digitalWrite(MotorPin1, HIGH);
    digitalWrite(MotorPin2, LOW);

Met un niveau haut pour 2A (broche 7) ; puisque 1,2EN (broche 1) est à un niveau 
haut, 2Y sortira un niveau haut.

Met un niveau bas pour 1A, alors 1Y sortira un niveau bas, et le moteur tournera.

.. code-block:: c

    for(i=0;i<3;i++){
    delay(1000);
    }

Cette boucle permet un délai de 3 * 1000ms.

.. code-block:: c

    digitalWrite(MotorEnable, LOW)

Si 1,2EN (broche 1) est à un niveau bas, le L293D ne fonctionne pas. Le moteur s'arrête.

.. code-block:: c

    digitalWrite(MotorPin1, LOW)
    digitalWrite(MotorPin2, HIGH)

Inverse le sens du courant dans le moteur, puis le moteur tournera dans le sens inverse.

Pour les utilisateurs de Python
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**Étape 2 :** Accédez au dossier du code.

.. raw:: html

   <run></run>

.. code-block::

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

**Étape 3 :** Exécutez le code.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 1.3.1_Motor.py

Lorsque le code s'exécute, le moteur tourne d'abord dans le sens horaire pendant 5s, 
puis s'arrête pendant 5s. Ensuite, il tourne dans le sens antihoraire pendant 5s, 
puis s'arrête à nouveau pendant 5s. Cette série d'actions sera exécutée en boucle.


**Code**

.. note::

    Vous pouvez **Modifier/Réinitialiser/Copier/Exécuter/Arrêter** le code ci-dessous. Mais avant cela, vous devez vous rendre sur le chemin du code source, par exemple ``davinci-kit-for-raspberry-pi/python``.

.. raw:: html

    <run></run>

.. code-block:: python

    #!/usr/bin/env python3

    import RPi.GPIO as GPIO
    import time
    
    # Configurer les broches
    MotorPin1   = 17
    MotorPin2   = 27
    MotorEnable = 22
    
    def setup():
        # Configurer les modes GPIO selon la numérotation BCM
        GPIO.setmode(GPIO.BCM)
        # Définir les broches en sortie
        GPIO.setup(MotorPin1, GPIO.OUT)
        GPIO.setup(MotorPin2, GPIO.OUT)
        GPIO.setup(MotorEnable, GPIO.OUT, initial=GPIO.LOW)
    
    # Définir une fonction pour faire tourner le moteur
    # La direction doit être 
    # 1(sens horaire), 0(arrêt), -1(sens antihoraire)
    def motor(direction):
        # Sens horaire
        if direction == 1:
            # Configurer la direction
            GPIO.output(MotorPin1, GPIO.HIGH)
            GPIO.output(MotorPin2, GPIO.LOW)
            # Activer le moteur
            GPIO.output(MotorEnable, GPIO.HIGH)
    		print ("Clockwise")
        # Sens antihoraire
        if direction == -1:
            # Configurer la direction
            GPIO.output(MotorPin1, GPIO.LOW)
            GPIO.output(MotorPin2, GPIO.HIGH)
            # Activer le moteur
            GPIO.output(MotorEnable, GPIO.HIGH)
    		print ("Counterclockwise")
        # Arrêt
        if direction == 0:
            # Désactiver le moteur
            GPIO.output(MotorEnable, GPIO.LOW)
    		print ("Stop")
    
    def main():
    
        # Définir un dictionnaire pour rendre le script plus lisible
        # CW pour sens horaire, CCW pour sens antihoraire, STOP pour arrêt
        directions = {'CW': 1, 'CCW': -1, 'STOP': 0}
        while True:
            # Sens horaire
            motor(directions['CW'])
            time.sleep(5)
            # Arrêt
            motor(directions['STOP'])
            time.sleep(5)
            # Sens antihoraire
            motor(directions['CCW'])
            time.sleep(5)
            # Arrêt
            motor(directions['STOP'])
            time.sleep(5)
    
    def destroy():
        # Arrêter le moteur
        GPIO.output(MotorEnable, GPIO.LOW)
        # Libérer les ressources
        GPIO.cleanup()    
    
    # Si ce script est exécuté directement :
    if __name__ == '__main__':
        setup()
        try:
            main()
        # Lorsque 'Ctrl+C' est pressé, la fonction destroy() est exécutée.
        except KeyboardInterrupt:
            destroy()

**Explication du Code**

.. code-block:: python

    def motor(direction):
        # Sens horaire
        if direction == 1:
            # Configurer la direction
            GPIO.output(MotorPin1, GPIO.HIGH)
            GPIO.output(MotorPin2, GPIO.LOW)
            # Activer le moteur
            GPIO.output(MotorEnable, GPIO.HIGH)
            print ("Clockwise")
    ...

Créez une fonction, **motor()**, dont la variable est direction. Si la condition 
direction=1 est remplie, le moteur tourne dans le sens horaire ; lorsque direction=-1, 
le moteur tourne dans le sens antihoraire ; et sous la condition direction=0, il s'arrête.

.. code-block:: python

    def main():
        # Définir un dictionnaire pour rendre le script plus lisible
        # CW pour sens horaire, CCW pour sens antihoraire, STOP pour arrêt
        directions = {'CW': 1, 'CCW': -1, 'STOP': 0}
        while True:
            # Sens horaire
            motor(directions['CW'])
            time.sleep(5)
            # Arrêt
            motor(directions['STOP'])
            time.sleep(5)
            # Sens antihoraire
            motor(directions['CCW'])
            time.sleep(5)
            # Arrêt
            motor(directions['STOP'])
            time.sleep(5)
        
Dans la fonction main(), créez un tableau directions[], dans lequel CW est égal à 1, 
CCW vaut -1 et 0 représente l'arrêt.

Lorsque le code s'exécute, le moteur tourne d'abord dans le sens horaire pendant 
5 secondes, puis s'arrête pendant 5 secondes. Ensuite, il tourne dans le sens antihoraire 
pendant 5 secondes, puis s'arrête à nouveau pendant 5 secondes. Cette série d'actions se répète.

Vous devriez maintenant voir la lame du moteur tourner.

Image du phénomène
-----------------------

.. image:: img/image119.jpeg
