Site icon AranaCorp

Controlar um motor de passo com o Raspberry Pi

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

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

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

Exit mobile version