terça-feira, outubro 16, 2012

Motores de Passo: Movimentando com um Arduino + L293D

Neste post vamos juntar o que vimos em dois posts anteriores e colocar em movimento um motor de passo usando um Arduino conectado a um L293D.


Obtendo um Motor de Passo

Procurando um pouco, você encontra motores de passo novos e com parâmetros conhecidos. Entretanto, eles provavelmente não serão baratos. Por outro lado, você pode obter motores de passo desmontando equipamentos pifados ou encostados. Impressoras são uma boa fonte.

Para este teste vou usar o motor e parte da mecânica de um drive de DVD. Encontramos uma pilha destes drives, semi desmontados, em um sucatão na Santa Efigênia, por R$1 a unidade. Não é um motor muito poderoso, mas isto é bom para estas primeiras brincadeiras, pois não consome grandes correntes e pode ser alimentado diretamente por um Arduino ligado via USB a um PC.

Deixei somente o motor e o carro da cabeça; os diodos laser foram retirados para montar um Pocket Laser Engraver. (você pode acompanhar este projeto no site do Garoa Hacker Clube). Substituí o circuito flexível ligado ao motor por um conector mais simples.

O Circuito

O motor de passo do drive de DVD é um motor bipolar, com quatro fios. Com um ohmímetro é fácil separar os dois pares. Você vai medir uma resistência baixa entre os dois fios ligados a mesma bobina e uma bobina está isolada em relação à outra.

O circuito é uma extensão direta do que usamos para controlar um motor DC. A diferença é que agora usamos as duas pontes H, uma para cada bobina do motor (OUT1 e OUT2 para uma bobina e OUT3 e OUT4 para a outra). Inicialmente você não precisa se preocupar com qual bobina é ligada a qual ponte nem a polaridade dos fios. Se você inverter os fios de uma bobina você irá inverter o sentido do movimento.


O Software

Para começar a brincar, vamos usar o "wave drive", onde apenas uma bobina é acionada de cada vez. A figura abaixo mostra os quatro estados das bobinas, um passo é feito quando se passa de um estado para outro adjacente. Com esta figura fica claro o que foi dito antes sobre o que acontece se você inverter os fios.



O software abaixo é bastante simples. Os passos são dados em grupos de 4 (correspondendo à passagem pelos quatro estados); são repetidos 20 grupos (80 passos) em uma direção e depois 20 grupos na outra.
const int L293_ENA2 = 8;
const int L293_INP3 = 9;
const int L293_INP4 = 10;
const int L293_ENA1 = 11;
const int L293_INP1 = 12;
const int L293_INP2 = 13;

const int DELAY = 20;

void setup()
{
  pinMode (L293_ENA2, OUTPUT);
  pinMode (L293_INP3, OUTPUT);
  pinMode (L293_INP4, OUTPUT);
  pinMode (L293_ENA1, OUTPUT);
  pinMode (L293_INP1, OUTPUT);
  pinMode (L293_INP2, OUTPUT);
  
  digitalWrite (L293_ENA2, LOW);
  digitalWrite (L293_INP3, LOW);
  digitalWrite (L293_INP4, LOW);
  
  digitalWrite (L293_ENA1, LOW);
  digitalWrite (L293_INP1, LOW);
  digitalWrite (L293_INP2, LOW);
}

void loop () 
{
  delay (5000);
  digitalWrite (L293_ENA1, HIGH);
  digitalWrite (L293_ENA2, HIGH);
  delay (100);
  for (int i = 0; i < 20; i++)
  {
    digitalWrite (L293_INP1, HIGH);
    delay (DELAY);
    digitalWrite (L293_INP1, LOW);
    delay (DELAY);
    digitalWrite (L293_INP3, HIGH);
    delay (DELAY);
    digitalWrite (L293_INP3, LOW);
    delay (DELAY);
    digitalWrite (L293_INP2, HIGH);
    delay (DELAY);
    digitalWrite (L293_INP2, LOW);
    delay (DELAY);
    digitalWrite (L293_INP4, HIGH);
    delay (DELAY);
    digitalWrite (L293_INP4, LOW);
    delay (DELAY);
  }
  digitalWrite (L293_ENA1, LOW);
  digitalWrite (L293_ENA2, LOW);
  
  delay (5000);
  digitalWrite (L293_ENA1, HIGH);
  digitalWrite (L293_ENA2, HIGH);
  delay (100);
  for (int i = 0; i < 20; i++)
  {
    digitalWrite (L293_INP4, HIGH);
    delay (DELAY);
    digitalWrite (L293_INP4, LOW);
    delay (DELAY);
    digitalWrite (L293_INP2, HIGH);
    delay (DELAY);
    digitalWrite (L293_INP2, LOW);
    delay (DELAY);
    digitalWrite (L293_INP3, HIGH);
    delay (DELAY);
    digitalWrite (L293_INP3, LOW);
    delay (DELAY);
    digitalWrite (L293_INP1, HIGH);
    delay (DELAY);
    digitalWrite (L293_INP1, LOW);
    delay (DELAY);
  }
  digitalWrite (L293_ENA1, LOW);
  digitalWrite (L293_ENA2, LOW);
}
O vídeo abaixo mostra o resultado.



Próximos Passos

Existem vários aperfeiçoamentos a serem feitos. Um deles é implementar full-step ou half-step, acionando duas bobinas simultaneamente. Um outro é fazermos uma rotina que nos permita dar apenas um número arbitrário de passos. Isto vai dar um pouco mais de trabalho, pois para podermos dar um passo isolado precisamos lembrar em qual estado a bobina está.

Veremos estes aperfeiçoamentos nos posts seguintes.

3 comentários:

Márcio Souza disse...

Olá, Daniel! Cara, parabéns. Ainda não testei, mas tenho certeza que dará tudo certo. Vc abriu minha mente. Mas... Os pinos 1, 8, 9 e 16 poderiam estar todos ligados no pino +5v do arduino, certo?! Daria no mesmo, estou correto??

Márcio Souza disse...

Olá, Daniel! Cara, parabéns. Ainda não testei, mas tenho certeza que dará tudo certo. Vc abriu minha mente. Mas... Os pinos 1, 8, 9 e 16 poderiam estar todos ligados no pino +5v do arduino, certo?! Daria no mesmo, estou correto??

Daniel Quadros disse...

Márcio, se você deixar os pinos 1 e 9 (ENA1 e ENA2) em +5V, os drivers estarão ligados o tempo todo. Acho que não tem problema, mas é bom conferir se o chip não aquece nesta condição.