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