fbpixel
Etiquetas: , , ,

Os motores de passo são frequentemente utilizados quando se busca uma boa precisão em circuito aberto, especialmente em sistemas de posicionamento, como as impressoras 3D. Neste artigo, veremos como programar a placa Raspberry Pi para controlar um motor de passo.

Pré-requisitos: Programar com o Raspberry Pi

Material

  • Ecrã
  • Cabo HDMI
  • Teclado
  • Raspberry PI 3 (com OS em micro SD)
  • Mouse
  • Carregador micro USB B
  • ULN2003APG x1
  • Motor de passo

Motor de passo

Os motores de passo têm diferentes fases que permitem orientar a posição do rotor. Uma sequência de impulsos sobre as diferentes fases pode, portanto, ser convertida em deslocamento angular. Como a sequência a ser enviada para obter um determinado deslocamento é conhecida, podemos determinar a posição sem precisar de sensores adicionais e, portanto, controlar o motor em circuito aberto com precisão.

stepper-motor Controlar um motor de passo com o Raspberry Pi

Há dois tipos principais de motor de passo, os unipolares (5 ou 6 fios) e os bipolares (4 fios), com características que podem variar, como o número de passos por revolução. Essas diferenças implicam modificações nos parâmetros de controle, particularmente no número de saídas necessárias para controlar o motor. É essencial conhecer essas informações para controlar o seu motor adequadamente.

Transistor

Os motores de passo, como o nome indica, podem ser controlados passo a passo, aplicando uma potência elétrica por sequência de impulsos às diferentes fases do motor. Para os motores unipolares, será utilizada uma matriz de transistores como a ULN2003A, que possui uma rede de 7 transistores.

uln2003a-transistors-net Controlar um motor de passo com o Raspberry Pi
uln2003a-schematics Controlar um motor de passo com o Raspberry Pi

Para motores bipolares, utilizamos a ponte H SN754410NE, capaz de conduzir as duas bobinas independentes do motor.

h-bridge-sn754410 Controlar um motor de passo com o Raspberry Pi
sn754410-connections-500x500 Controlar um motor de passo com o Raspberry Pi

Esquema de ligação

O motor é acionado através do módulo de acionamento ULN2003A. As entradas 1 a 4 do módulo conectam-se aos pinos 18, 22, 24 e 26 (GPIO24, GPIO25, GPIO8, GPIO7) respectivamente. Os terminais + e – do módulo conectam-se aos pinos 5V e terra do Raspberry Pi.

Dependendo da potência do motor utilizado, ele pode ser alimentado pelo terminal 5V da placa Raspberry Pi. Ainda assim, é fortemente aconselhado usar uma fonte de energia externa para proteger o microcontrolador.

stepper-rpi3-28byj48-bb Controlar um motor de passo com o Raspberry Pi

Para lembrar, aqui está o descritivo dos pinos Raspberry Pi 3.

rp2_pinout Controlar um motor de passo com o Raspberry Pi

Código básico para controlar um motor de passo

Para acionar o motor de passo, definimos uma sequência de impulsos que serão enviados para cada fase do motor. Isso fará girar o rotor. O número de passos por revolução permite saber o ângulo coberto por cada passo (no nosso caso, 2048).

O código a seguir foi escrito para o motor de passo 28BYJ-48 130061869. Os motores de passo podem ser bem diferentes entre si, então verifique o seu equipamento antes de controlá-lo.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# libraries
import time
import RPi.GPIO as GPIO
# Use BCM GPIO references
# Instead of physical pin numbers
GPIO.setmode(GPIO.BCM)
# Define GPIO signals to use Pins 18,22,24,26 GPIO24,GPIO25,GPIO8,GPIO7
StepPins = [24,25,8,7]
# Set all pins as output
for pin in StepPins:
print("Setup pins")
GPIO.setup(pin,GPIO.OUT)
GPIO.output(pin, False)
# Define some settings
WaitTime = 0.005
# Define simple sequence
StepCount1 = 4
Seq1 = []
Seq1 = [i for i in range(0, StepCount1)]
Seq1[0] = [1,0,0,0]
Seq1[1] = [0,1,0,0]
Seq1[2] = [0,0,1,0]
Seq1[3] = [0,0,0,1]
# Define advanced half-step sequence
StepCount2 = 8
Seq2 = []
Seq2 = [i for i in range(0, StepCount2)]
Seq2[0] = [1,0,0,0]
Seq2[1] = [1,1,0,0]
Seq2[2] = [0,1,0,0]
Seq2[3] = [0,1,1,0]
Seq2[4] = [0,0,1,0]
Seq2[5] = [0,0,1,1]
Seq2[6] = [0,0,0,1]
Seq2[7] = [1,0,0,1]
# Choose a sequence to use
Seq = Seq2
StepCount = StepCount2
def steps(nb):
StepCounter = 0
if nb<0: sign=-1
else: sign=1
nb=sign*nb*2 #times 2 because half-step
print("nbsteps {} and sign {}".format(nb,sign))
for i in range(nb):
for pin in range(4):
xpin = StepPins[pin]
if Seq[StepCounter][pin]!=0:
GPIO.output(xpin, True)
else:
GPIO.output(xpin, False)
StepCounter += sign
# If we reach the end of the sequence
# start again
if (StepCounter==StepCount):
StepCounter = 0
if (StepCounter<0):
StepCounter = StepCount-1
# Wait before moving on
time.sleep(WaitTime)
# Start main loop
nbStepsPerRev=2048
if __name__ == '__main__' :
hasRun=False
while not hasRun:
steps(nbStepsPerRev)# parcourt un tour dans le sens horaire
time.sleep(1)
steps(-nbStepsPerRev)# parcourt un tour dans le sens anti-horaire
time.sleep(1)
hasRun=True
print("Stop motor")
for pin in StepPins:
GPIO.output(pin, False)
#!/usr/bin/env python # -*- coding: utf-8 -*- # libraries import time import RPi.GPIO as GPIO # Use BCM GPIO references # Instead of physical pin numbers GPIO.setmode(GPIO.BCM) # Define GPIO signals to use Pins 18,22,24,26 GPIO24,GPIO25,GPIO8,GPIO7 StepPins = [24,25,8,7] # Set all pins as output for pin in StepPins: print("Setup pins") GPIO.setup(pin,GPIO.OUT) GPIO.output(pin, False) # Define some settings WaitTime = 0.005 # Define simple sequence StepCount1 = 4 Seq1 = [] Seq1 = [i for i in range(0, StepCount1)] Seq1[0] = [1,0,0,0] Seq1[1] = [0,1,0,0] Seq1[2] = [0,0,1,0] Seq1[3] = [0,0,0,1] # Define advanced half-step sequence StepCount2 = 8 Seq2 = [] Seq2 = [i for i in range(0, StepCount2)] Seq2[0] = [1,0,0,0] Seq2[1] = [1,1,0,0] Seq2[2] = [0,1,0,0] Seq2[3] = [0,1,1,0] Seq2[4] = [0,0,1,0] Seq2[5] = [0,0,1,1] Seq2[6] = [0,0,0,1] Seq2[7] = [1,0,0,1] # Choose a sequence to use Seq = Seq2 StepCount = StepCount2 def steps(nb): StepCounter = 0 if nb<0: sign=-1 else: sign=1 nb=sign*nb*2 #times 2 because half-step print("nbsteps {} and sign {}".format(nb,sign)) for i in range(nb): for pin in range(4): xpin = StepPins[pin] if Seq[StepCounter][pin]!=0: GPIO.output(xpin, True) else: GPIO.output(xpin, False) StepCounter += sign # If we reach the end of the sequence # start again if (StepCounter==StepCount): StepCounter = 0 if (StepCounter<0): StepCounter = StepCount-1 # Wait before moving on time.sleep(WaitTime) # Start main loop nbStepsPerRev=2048 if __name__ == '__main__' : hasRun=False while not hasRun: steps(nbStepsPerRev)# parcourt un tour dans le sens horaire time.sleep(1) steps(-nbStepsPerRev)# parcourt un tour dans le sens anti-horaire time.sleep(1) hasRun=True print("Stop motor") for pin in StepPins: GPIO.output(pin, False)
#!/usr/bin/env python 
# -*- coding: utf-8 -*-

# libraries
import time
import RPi.GPIO as GPIO

# Use BCM GPIO references
# Instead of physical pin numbers
GPIO.setmode(GPIO.BCM)

# Define GPIO signals to use Pins 18,22,24,26 GPIO24,GPIO25,GPIO8,GPIO7
StepPins = [24,25,8,7]
# Set all pins as output
for pin in StepPins:
        print("Setup pins")
        GPIO.setup(pin,GPIO.OUT)
        GPIO.output(pin, False)
# Define some settings
WaitTime = 0.005

# Define simple sequence
StepCount1 = 4
Seq1 = []
Seq1 = [i for i in range(0, StepCount1)]
Seq1[0] = [1,0,0,0]
Seq1[1] = [0,1,0,0]
Seq1[2] = [0,0,1,0]
Seq1[3] = [0,0,0,1]
# Define advanced half-step sequence
StepCount2 = 8
Seq2 = []
Seq2 = [i for i in range(0, StepCount2)]
Seq2[0] = [1,0,0,0]
Seq2[1] = [1,1,0,0]
Seq2[2] = [0,1,0,0]
Seq2[3] = [0,1,1,0]
Seq2[4] = [0,0,1,0]
Seq2[5] = [0,0,1,1]
Seq2[6] = [0,0,0,1]
Seq2[7] = [1,0,0,1]
# Choose a sequence to use
Seq = Seq2
StepCount = StepCount2

def steps(nb):
        StepCounter = 0
        if nb<0: sign=-1
        else: sign=1
        nb=sign*nb*2 #times 2 because half-step
        print("nbsteps {} and sign {}".format(nb,sign))
        for i in range(nb):
                for pin in range(4):
                        xpin = StepPins[pin]
                        if Seq[StepCounter][pin]!=0:
                                GPIO.output(xpin, True)
                        else:
                                GPIO.output(xpin, False)
                StepCounter += sign
        # If we reach the end of the sequence
        # start again
                if (StepCounter==StepCount):
                        StepCounter = 0
                if (StepCounter<0):
                        StepCounter = StepCount-1
                # Wait before moving on
                time.sleep(WaitTime)

# Start main loop
nbStepsPerRev=2048
if __name__ == '__main__' :
	hasRun=False
	while not hasRun:
			steps(nbStepsPerRev)# parcourt un tour dans le sens horaire
			time.sleep(1)
			steps(-nbStepsPerRev)# parcourt un tour dans le sens anti-horaire
			time.sleep(1)

			hasRun=True

	print("Stop motor")
	for pin in StepPins:
			GPIO.output(pin, False)

Obs: Fique atento às indentações ao escrever ou copiar um código, para evitar erros de compilação.

Fontes

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie