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.

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.


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


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.

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

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.
#!/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
- A grande referência https://www.raspberrypi.org/help/
- Programar com o Raspberry Pi
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie