Motor de Passo com o Raspberry Pi Pico Usando o Driver ULN2003 Deixe um comentário

Foto do Motor de Passo com o Raspberry Pi Pico Usando o Driver ULN2003

Introdução

Neste post vamos ver como controlar um motor de passo usando a Raspberry Pi Pico e o driver ULN2003.

Raspberry Pi Pico

A “Pi Pico” é uma placa com o poderoso microcontrolador RP2040, que possui respeitáveis capacidades de processamento, memória, entrada e saída. Você vai encontrar detalhes sobre ela em vários artigos aqui no blog. No exemplo deste post, vamos usar as saídas digitais para controlar o motor de passo.

Motor de Passo

Um motor de passo é um motor cujo movimento é feito em pequenos incrementos, os passos. Como os demais motores, o movimento dos motores de passo é gerado pela interação entre ímãs permanentes e eletroímãs. Tipicamente os eletroímãs estão fixos e os ímãs permanentes estão na parte móvel do motor.

Para andar um passo é necessário ativar e desativar os eletroímãs em uma determinada ordem. Dependendo de quais eletroímãs estão ativos (e a sua polaridade), os imãs permanentes serão atraídos (ou repelidos). O posicionamento dos ímãs permanentes é tal que cada eletroímã consegue colocar o motor em uma determinada posição.

Tipicamente temos dois conjuntos de eletroímãs em um motor de passo. Na forma mais simples de controle, ativamos o primeiro conjunto, o que coloca o motor em uma primeira posição. Em seguida, desligamos o primeiro conjunto e ligamos o segundo, o motor passa para a posição seguinte. Como terceira etapa, desligamos o segundo conjunto e religamos o primeiro, mas com polaridade invertida, passando para a terceira posição. Por último, desligamos o primeiro conjunto e ligamos o segundo com polaridade invertida, completando o ciclo. Neste ponto os ímãs permanentes estão em uma posição apropriada para podermos repetir todo o ciclo.

GIF Ilustrando o funcionamento de um motor de passo
Funcionamento de um motor de passo (fonte: Wikipedia)
(imagem gerada por Wapcaplet; Teravolt)

A ordem de ativação e desativação dos eletroímãs é o ponto crítico. Se tentarmos pular uma das etapas, o motor irá se mover mas com pouca força (pois neste instante os ímãs permanentes estão fora da posição adequada). Se o motor tiver alguma carga é possível que ele não consiga se mover (dizemos que ele está “pulando” passos).

A sequência descrita acima é o chamado “wave drive” e não é muito usada na prática. Um resultado melhor é obtido acionando simultaneamente dois eletroímãs, de forma a combinar a força deles. Isto é chamado de “full-step drive”. Controlando adequadamente os dois eletroímãs, podemos até fazer o motor parar em uma posição intermediária, obtendo o “half-step drive”.

Para mover o motor é necessário inverter a polaridade dos eletroímãs. Existe duas formas de fazer isto:

  • Usar uma bobina única e ter um circuito (ponte H) que permita energizá-la em ambos os sentidos. Este tipo de motor é chamado bipolar.
  • Usar duas bobinas, uma para gerar o campo em cada sentido. Este tipo de motor é chamado unipolar.

No nosso exemplo vamos usar um motor de passo unipolar, modelo 28BYJ-48:

Esquemático das conexões do motor de passo unipolar modelo 28BYJ-48

Este motor de passo possui uma redução interna que resulta em incríveis 2048 passos em uma volta (ou 4096 se usarmos half-step). Isso permite uma precisão bem alta de posição (ao custo de um velocidade baixa).

Driver ULN2003

O uso de um motor unipolar torna desnecessária uma ponte H, porém a tensão e corrente das bobinas fica acima do disponível nas saídas digitais do Pi Pico. Por esse motivo, vamos usar um módulo driver baseado no integrado ULN2003.

De forma simplificada podemos dizer que o ULN2003 possui internamente sete chaves (implementadas com transistores Darlington) controladas por entradas lógicas. Quando uma entrada está em nível baixo, a chave está aberta e a saída correspondente não está ligada a nada. Quando a entrada está em nível alto, a chave se fecha ligando a saída correspondente à terra. As cargas a serem controladas devem ser conectadas entre a alimentação e as saídas do ULN2003.

O módulo que vamos utilizar utiliza somente quatro chaves do ULN2003. Além do ULN2003 ele possui quatro LEDs que indicam o acionamento das saídas (um jumper permite desligar os LEDs).

Esquemático do driver ULN2003

Material Necessário Para Montar um Motor de Passo com o Raspberry Pi

Para a parte prática você precisará:

Montagem

A figura abaixo mostra a montagem que vamos utilizar:

Esquemático mostrando a conexão do Motor de Passo e Driver Uln2003 conectados a Raspberry Pi Pico através de uma protoboard

Software

O software foi desenvolvido em MicroPython, veja neste artigo como preparar a Raspberry Pi Pico e o seu microcomputador.

Criei a classe Stepper para acionar as bobinas nas ordens adequadas para dar passos para frente ou para trás. O programa principal utiliza esta classe para mover o motor continuamente 1024 passos (180 graus) num sentido e depois 512 passos (90 graus) no outro.

from machine import Pin
from utime import sleep

class Stepper():
'''
Classe para controle de motor de passo
'''
# aciona os sinais de controle do motor
def aciona(self, val=[0,0,0,0]):
for i in range(len(self.pinos)):
self.pinos[i].value(val[i])

# init
def __init__(self, pinos=None, fullStep=True, delay=0.002):
# Salva os pinos de conexão
if pinos is None:
raise ValueError("Obrigatório especificar os pinos")
if len(pinos) != 4:
raise ValueError("Devem ser especificados 4 pinos")
self.pinos = pinos
if fullStep:
self.passos = [[1,0,0,1], [1,1,0,0], [0,1,1,0], [0,0,1,1]]
else:
self.passos = [[1,0,0,0], [0,1,0,0], [0,0,1,0], [0,0,0,1]]
self.delay = delay
self.aciona()
self.passo = 0

# avança npassos passos
def avanca(self, npassos=1):
for i in range(npassos):
self.aciona(self.passos[self.passo])
sleep(self.delay)
self.passo = self.passo+1
if self.passo >= len(self.passos):
self.passo = 0

# recua npassos passos
def recua(self, npassos=1):
for i in range(npassos):
self.passo = self.passo-1
if self.passo < 0:
self.passo = len(self.passos)-1
self.aciona(self.passos[self.passo])
sleep(self.delay)

pinos = [
Pin(15, Pin.OUT),
Pin(14, Pin.OUT),
Pin(16, Pin.OUT),
Pin(17, Pin.OUT)
]
stepper = Stepper(pinos)

while True:
stepper.avanca(1024)

sleep(1)
stepper.recua(512)
sleep(1)

Conclusão

O vídeo abaixo mostra o exemplo em funcionamento:

YouTube video

 

Este projeto mostrou como usar a Raspberry Pi Pico para controlar um motor de passo. Isso pode ser usado em vários projetos, como relógios, robôs, etc.

Então, gostou do artigo? Pretende montar um projeto derivado dele? Dúvidas? Use os comentários abaixo para contar para nós!

Ah, e nos siga no Instagram para ficar por dentro de todas as novidades do mundo maker.

Faça seu comentário

Acesse sua conta e participe