Commande d’un moteur DC

Dans le cadre d’un projet robotique ou domotique, l’utilisation d’un moteur continu est très fréquentes, commande de moteur pour le déplacement d’un robot ou drone. Voici un petit exemple de l’utilisation d’un moteur à courant continu.

Nous avons vu comment utiliser un moteur pas à pas avec un raspberry sur cette page. Nous allons voir ici comment commander un moteur à courant continu. Le moteur à courant continu est plus simple d’utilisation, il ne dispose que de deux bobines, sur lesquelles on va appliquer des tensions différentes pour modifier le sens de rotation du moteur. J’utilise pour ce tutoriel, la puce L293D pour ce petit guide. Elle est indispensable pour protéger les sorties du Rasp contre des pics d’intensité du moteur

Voici le moteur.

Commande du moteur sans variation de vitesse

Le fonctionnement d’un moteur à courant continu est simple, vous appliquez une tension continu aux bornes du moteur, en fonction de la différence de potentiel, le moteur va tourner dans un sens ou dans l’autre.

Câblage

Voici le câblage, celui comprend un bouton pour le changement de sens de variation.

Câblage moteur continu
Câblage moteur continu

Script de commande

Pour la partie commande, voici le code complet, il ne présente pas de difficulté, je laisse les commentaires :

#!/usr/bin/python
#-*- coding: utf-8 -*-

import RPi.GPIO as GPIO

import time
import os

#Initialisation de la gestion des numéros
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)

#temps de rotation
vitesse=0.5
#Sélection sens rotation
sens = 17
GPIO.setup(sens,GPIO.IN)

#commande moteur
bobine1 = 4
bobine2 = 27
GPIO.setup(bobine1, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(bobine2, GPIO.OUT, initial=GPIO.LOW)

#activation de la puce
activation = 5
GPIO.setup(activation,GPIO.OUT,initial=GPIO.LOW)
while 1 :
      GPIO.output(activation,1)
      try :
           if GPIO.input(sens)== 1 :
                GPIO.output(bobine1,GPIO.HIGH)
                GPIO.output(bobine2,GPIO.LOW)
                time.sleep(vitesse)
           if GPIO.input(sens) == 0 :
                GPIO.output(bobine1,GPIO.LOW)
                GPIO.output(bobine2,GPIO.HIGH)
                time.sleep(vitesse)
      except KeyboardInterrupt :
           GPIO.output(activation,0)
           break
#Nettoyage des sorties
GPIO.cleanup()

Donc quand j’appuie sur le bouton (la led du câblage s’allume), le sens de rotation s’inverse, je laisse tourner le moteur durant 0.5 seconde, puis je revérifie l’état de mon entrée (#GPIO.5).

Pour sortir de la bouche (éteindre le moteur), je mets une exception, lorsque j’appuie sur Ctrl+C, le moteur s’arrête.

Voilà un fonctionnement simple d’un moteur à courant continu alimenté avec sa tension maximale.

Contrôle d’un moteur à courant continu et modification de la vitesse

Dans le premier point, il était simplement question de contrôler un moteur à courant continu dans les deux sens avec une tension de 5V, nous verrons ici, comment lui faire varier la vitesse. Le code utilisé est bien sur à adapter au besoin, il ne présente que le fonctionnement de base de la PWM (pulse width modulation), la tension moyenne sera modifiée en fonction de la largeur de l’impulsion :

Fonctionnement la PWM
Fonctionnement la PWM

Câblage d’une commande de moteur à courant continu avec PWM

Le câblage n’est pas différent du premier cas.

Code pour la variation de vitesse d’un moteur à courant continu

Pour le code, je n’ai apporté que de légère modification au premier code :

#!/usr/bin/python
#-*- coding: utf-8 -*-

import RPi.GPIO as GPIO

import time
import os

#Initialisation de la gestion des numéros
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
#temps de rotation
vitesse=0.5
#Sélection sens rotation
sens = 17
GPIO.setup(sens,GPIO.IN)

#commande moteur
bobine1 = 4
bobine2 = 27
GPIO.setup(bobine1, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(bobine2, GPIO.OUT, initial=GPIO.LOW)

#activation de la puce sur un signal PWM
activation = 5
GPIO.setup(activation,GPIO.OUT,initial=GPIO.LOW)
pwm = GPIO.PWM(activation,50)#Création de ma sortie en modulation de larger d’impulsion
while 1 :
      pwm.start(0)#Début de ma rotation à 0%
      try :
           if GPIO.input(sens)== 1 :
                GPIO.output(bobine1,GPIO.HIGH)
                GPIO.output(bobine2,GPIO.LOW)
                time.sleep(5)
                pwm.ChangeDutyCycle(50)#Modification de la fréquence à 50%
                time.sleep(5)
                pwm.ChangeDutyCycle(100) #Modification de la fréquence à 100%
                time.sleep(5)
           if GPIO.input(sens) == 0 :
                GPIO.output(bobine1,GPIO.LOW)
                GPIO.output(bobine2,GPIO.HIGH)
                time.sleep(5)
                pwm.ChangeDutyCycle(50) )#Modification de la fréquence à 50%
                time.sleep(5)
                pwm.ChangeDutyCycle(100) #Modification de la fréquence à 100%
                time.sleep(5)
      except KeyboardInterrupt :
           GPIO.output(activation,0)
           pwm.stop()#On arête la PWM
           break
#Nettoyage des sorties
GPIO.cleanup()

Ce code permet de commencer une rotation à 0% puis 50% et 100% et cela dans les deux sens.

Voila pour ce qui est de la commande d’un moteur à courant continu à l’aide d’une puce L293D.

Laisser un commentaire