Contrôler un moteur pas à pas

Afin de pouvoir commander un moteur nécessitant une précision importante, le moteur à courant continu peut s’avérer limité. L’utilisation d’un moteur pas à pas peut se faire avec un raspberry ou un arduino, ici nous verrons comment l’utiliser avec une Framboise.

Voici un petit guide pour utiliser un moteur pas à pas avec le raspberry, pour cela vous aurez besoin :

  • d’un moteur pas à pas (28BYJ-48-5)
  • d’un circuit imprimé pilote moteur L293D ou ULN2803

L’utilisation d’un moteur pas à pas couplé avec un raspberry peut être utile dans le cas de projet nécessitant une puissance de calcul importante avec un asservissement moteur, suivi d’un visage avec une webcam, le principe du fonctionnement du moteur pas à pas peut être également réutilisé pour un arduino pour des montages simples.

Nous avons besoin d’utiliser un circuit imprimé entre le moteur et le raspberry afin d’éviter de « crâmer » le Rasp qui ne pourrait pas fournir l’intensité nécessaire pour la commande des bobines du moteur.

Le moteur pas à pas

Ici pas de grand cours sur les principes fondamentaux du moteur pas à pas, le 28BYJ-48 est un moteur bipolaire à 4 phases, voici la documentation technique 28BYJ-48.

Nombre de pas nécessaire à un tour

Dans la doc, nous voyons, qu’il à un pas de 5.625/64 donc pour faire un tour complet :

[table id=1 /]

Alimentation des bobines

Pour l’alimentation des bobines :

en pas complet

[table id=2 /]

en demi-pas

[table id=3 /]

en quart de pas

[table id=4 /]

Circuit de commande moteur

Afin de contrôler le moteur en préservant le raspberry, nous devons utiliser un circuit imprimé de contrôle moteur.

L293D

Fiche technique L293D

Visitez ce lien pour trouver La documentation technique.

Câblage

cablage L293D
cablage L293D

Le fil rouge du moteur (correspondant au commun) n’a pas besoin d’être connecté.

ULN2803

Fiche technique ULN2803

Visitez ce lien pour trouver la documentation technique ULN2803.

Câblage

cablage ULN2803
cablage ULN2803

Le script de commande pas à pas

Voici le code complet, les commentaires permettent une explication du code :

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

# utilisation d'un moteur pas à pas 28BYJ-48 5V
# utilisation de la puce L293D pour la gestion de la puissance

#Importation des bibliothèques nécessaires
import RPi.GPIO as GPIO
import time
import os

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

#Initialisation des commandes moteurs
#Choix des pin GPIO sur le raspberry 
bleu = 4
rose = 17
jaune = 27
orange = 22
pin_gpio = [orange,jaune,rose,bleu]
for pin in pin_gpio :
      GPIO.setup(pin, GPIO.OUT, initial=GPIO.LOW)#Initialisation des pin choisis
#vitesse
vitesse = 0.001 #temps de pause en ms
#Détail de la séquence
seq = 1 #Choix de la séquence de 1 à 5
etape = []
if seq == 1 :# anti horaire
      nombre_etape = 8
      etape = range(0,nombre_etape)
      etape[0] = [1,0,0,0]
      etape[1] = [1,1,0,0]
      etape[2] = [0,1,0,0]
      etape[3] = [0,1,1,0]
      etape[4] = [0,0,1,0]
      etape[5] = [0,0,1,1]
      etape[6] = [0,0,0,1]
      etape[7] = [1,0,0,1]
if seq == 2 :# horaire
      nombre_etape = 8
      etape = range(0,nombre_etape)
      etape[0] = [0,0,0,1]
      etape[1] = [0,0,1,1]
      etape[2] = [0,0,1,0]
      etape[3] = [0,1,1,0]
      etape[4] = [0,1,0,0]
      etape[5] = [1,1,0,0]
      etape[6] = [1,0,0,0]
      etape[7] = [1,0,0,1]
if seq == 3 :#anti horaire
      nombre_etape = 4
      etape = range(0,nombre_etape)
      etape[0] = [1,0,0,0]
      etape[1] = [0,1,0,0]
      etape[2] = [0,0,1,0]
      etape[3] = [0,0,0,1]
if seq == 4 : # horaire
      nombre_etape = 4
      etape = range(0,nombre_etape)
      etape[0] = [0,0,0,1]
      etape[1] = [0,0,1,0]
      etape[2] = [0,1,0,0]
      etape[3] = [1,0,0,0]
if seq == 5 :# horaire
      nombre_etape = 2
      etape = range(0,nombre_etape)
      etape[0] = [1,0,1,0]
      etape[1] = [0,1,0,1]
def rotation() :
      global pas
      for step in range(0,nombre_etape) :
           for pin in range(0,4) :
           port_gpio = pin_gpio[pin]
                if etape[step][pin] != 0 :
                     GPIO.output(port_gpio,GPIO.HIGH)
                     pas += 1
                     print pas , ' ' , port_gpio , ' ' , etape[step][pin]
                     time.sleep(vitesse)
                else :
                     GPIO.output(port_gpio,GPIO.LOW)
                     pas += 1
                     print pas , ' ' , port_gpio , ' ' , etape[step][pin]
                     time.sleep(vitesse)
#Activation de la puce
pas =0
while 1:
      rotation()
#Nettoyage des états de sortie
GPIO.cleanup()

Voilà pour ce qui est de la commande d’un moteur pas à pas en python via le raspberry.

Laisser un commentaire