Joy-PI Leçon #12 : Moteur pas-à-pas

Un moteur pas à pas permet de transformer une impulsion électrique en mouvement angulaire. Ce type de moteur est utilisé lorsque le déplacement angulaire peut être réalisé en boucle ouverte, et ne demande pas une vitesse de rotation élevée. Certaines imprimantes à jet d’encre utilisent ce type de moteur pour gérer le déplacement des têtes d’écriture.
Sur le Joy-PI, le moteur pas-à-pas est connecté en bas à droite, le connecteur est équipé de détrompeurs, il ne faut en aucun aces essayer de forcer pour introduire celui-ci.

Commutateurs :

Ce moteur utilise 4 GPIO, afin de pouvoir les utiliser, les interrupteurs du bloc de droite 3, 4, 5 et 6 doivent en position ON, les autres sont sur OFF.

Le logiciel

Cet exemple utilise une classe développée par Ludwig Schuster, elle permet, une fois un moteur instancié, de faire tourner le moteur d’un certain nombre de pas avec turnSteps, ou d’un angle avec turnDegrees.

Le pseudo-code :

  • Importation des librairies
  • Classe Stepmotor
  • Faire quelques mouvements

En python :

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Author : Auteur ludwigschuster
# Original Author Github: https://github.com/ludwigschuster/RasPi-GPIO-Stepmotor

import time
import RPi.GPIO as GPIO
import math

class Stepmotor:

    def __init__(self):
        # Définir le mode GPIO
        GPIO.setmode(GPIO.BOARD)
        # Broches du Raspberry utilisées
        self.pin_A = 29
        self.pin_B = 31
        self.pin_C = 33
        self.pin_D = 35
        self.interval = 0.010
        
        # Initialisation des broches
        GPIO.setup(self.pin_A,GPIO.OUT)
        GPIO.setup(self.pin_B,GPIO.OUT)
        GPIO.setup(self.pin_C,GPIO.OUT)
        GPIO.setup(self.pin_D,GPIO.OUT)
        GPIO.output(self.pin_A, False)
        GPIO.output(self.pin_B, False)
        GPIO.output(self.pin_C, False)
        GPIO.output(self.pin_D, False)

    def Step1(self):

        GPIO.output(self.pin_D, True)
        time.sleep(self.interval)
        GPIO.output(self.pin_D, False)

    def Step2(self):
        
        GPIO.output(self.pin_D, True)
        GPIO.output(self.pin_C, True)
        time.sleep(self.interval)
        GPIO.output(self.pin_D, False)
        GPIO.output(self.pin_C, False)

    def Step3(self):

        GPIO.output(self.pin_C, True)
        time.sleep(self.interval)
        GPIO.output(self.pin_C, False)

    def Step4(self):

        GPIO.output(self.pin_B, True)
        GPIO.output(self.pin_C, True)
        time.sleep(self.interval)
        GPIO.output(self.pin_B, False)
        GPIO.output(self.pin_C, False)

    def Step5(self):

        GPIO.output(self.pin_B, True)
        time.sleep(self.interval)
        GPIO.output(self.pin_B, False)

    def Step6(self):

        GPIO.output(self.pin_A, True)
        GPIO.output(self.pin_B, True)
        time.sleep(self.interval)
        GPIO.output(self.pin_A, False)
        GPIO.output(self.pin_B, False)

    def Step7(self):

        GPIO.output(self.pin_A, True)
        time.sleep(self.interval)
        GPIO.output(self.pin_A, False)

    def Step8(self):
        GPIO.output(self.pin_D, True)
        GPIO.output(self.pin_A, True)
        time.sleep(self.interval)
        GPIO.output(self.pin_D, False)
        GPIO.output(self.pin_A, False)

    def turn(self,count):
        for i in range (int(count)):
            self.Step1()
            self.Step2()
            self.Step3()
            self.Step4()
            self.Step5()
            self.Step6()
            self.Step7()
            self.Step8()

    def close(self):
        # Libérer l'utilisation pour d'autres applications
        GPIO.cleanup()

    def turnSteps(self, count):
        # Tourner de 'n' pas
        for i in range (count):
            self.turn(1)

    def turnDegrees(self, count):
        # Tourner de 'n' degrés (imprécis pour les petites valeurs)
        self.turn(round(count*512/360,0))

    def turnDistance(self, dist, rad):
        self.turn(round(512*dist/(2*math.pi*rad),0))

def main():
    print("Mouvement démarré")
    motor = Stepmotor()
    print("Un pas")
    motor.turnSteps(1)
    time.sleep(0.5)
    print("20 pas")
    motor.turnSteps(20)
    time.sleep(0.5)
    print("un quart de tour")
    motor.turnDegrees(90)
    print("Fin des mouvements")
    motor.close()

if __name__ == "__main__":
    main()

Laisser un commentaire