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.

#!/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