Manual

do

Maker

.

com

Controlar motor DC com L293D

Controlar motor DC com L293D

Enfim, chegaram os componentes necessários para controlar motor DC com L293D. No exemplo vou utilizar um motor de DVD (o que abre e fecha a gaveta). Esse motor tem a capacidade de girar para os dois lados e ele tem apenas 2 fios. Então, como se controla a direção e velocidade do motor? - explico.

A inversão da corrente e frequência fazem essas duas tarefas, mas para inverter a corrente é necessário um recurso chamado ponte H. Pode-se construir uma ponte H manualmente, mas é um trabalho duro e arriscado. Invés disso, a melhor maneira é utilizar um circuito integrado que cumpra a tarefa; e para isso utilizaremos o L293D da ST.

Comprei esse e alguns outros componentes na Compomil. A loja virtual é ruim, o pedido atrasa, eles demoram a comunicar a falta de alguma peça ou tempo de chegada dessa peça até a filial, mas independente disso, o material chega. O meu demorou 12 dias corridos. Comprei diodos N1 4001 (25 unidades) e vieram N1 4003. Peças vieram trocadas e um dos CIs não funciona. O modelo de potenciômetro que veio não foi o que pedi. Eu sabia que isso tudo poderia acontecer pois vi as reclamações no www.reclameaqui.com.br, mas como eu decidi arriscar, vai ficar o dito pelo não dito, mas atenção: comprar na Compomil pode ser prejudicial às suas expetativas. Minhas recomendações de compra são sempre nas lojas parceiras, que durante anos não deram um problema sequer. Confira aí no início da página.

Não vou reinventar a roda; achei um excelente artigo exclusivo sobre o L293D em um blog bem legal - o Repeat do Miau (infelizmente não existe mais o blog) descreve com excelência uma ponte H e o uso do CI citado, que já contém duas pontes H e nos permite controlar 2 motores simples ou um motor de passo.

Há um pequeno cavo em uma das bordas do CI. Coloque-o na protoboard dessa forma:

À esquerda, de cima para baixo, os pinos de 1 a 8. À direita, de baixo a cima, os pinos de 9 a 16:

Para controlar um motor, utiliza-se os pinos 2 e 7. Para um outro motor, os pinos 15 e 10 como INPUT. Considerando que não estamos falando de um chuveiro para termos duas fases, lembre-se em todos os momentos do projeto que apenas 1 das entradas de cada motor devem ser colocada em HIGH. Com HIGH em um, o motor gira em uma direção; invés disso, colocando o pino em HIGH no outro, girará na outra direção. HIGH em ambos, você verá um gênio saindo do seu circuito, portanto, antes de fazer HIGH em um dos pinos, faça LOW em ambos. Não se preocupe por eu estar descrevendo ações do Arduino nesse momento, os detalhes serão citados mais adiante.

Os pinos descritos anteriormente são para sinalização. Para alimentar os motores, usaremos os pinos 3 e 6 para um dos motores e 14 e 11 para o outro.

Os aterramentos sao os pinos 4 e 13 e 5 e 12.

Os pinos 1 e 9 sinalizam os canais; para utilizar 1 motor sinalize 1 ou 9. Para utilizar 2 motores, sinalize ambos. Para tal, basta liga-los à 5v.

O pino 16 é a alimentação do circuito lógico, onde passaremos também 5v.

Finalmente, o pino 8 é a entrada de energia para alimentação dos motores. Essa entrada suporta até 36v, ou seja, podemos tranquilamente alimentar 2 motores de impressora com essa belezinha!

O motor que utilizaremos utiliza justamente 5v. Sendo assim, podemos alimentá-lo com a saida do próprio Arduino, uma vez que o servo-motor que controla a direção não será acionado em paralelo com esse motor.

Vou descrever a ligação no Arduino exatamente como no blog Repeat do Miau (lembrando mais uma vez que utilizamos o Arduino UNO):

Pino 2 do CI na porta 10 do Arduino Pino 7 do CI na porta 11 do Arduino Pino 10 do CI na porta 6 do Arduino Pino 15 do CI na porta 5 do Arduino Pinos 1, 16, 8 e 9 na porta +5V do Arduino Pinos 4, 5, 12 e 13 na porta Ground do Arduino

Esse belo esquema mostra as ligações de uma maneira tão limpa que é possível decorá-las em dois minutos:

Ainda, se quiser dar uma olhada no datasheet, pegue-o aqui. Esse PDF descreve o L293D e o L293DD - esse segundo possui 4 pontes H!

Nesse primeiro momento, vamos fazer a prova de conceito, controlando a direção e velocidade do motor através de comunicação serial. Posteriormente aplicaremos um método na classe Brain (citado no artigo anterior) para que o robô controle automaticamente o motor.

Copiei o código do exemplo do blog Repeat do Miau, apaguei as linhas que mencionavam o segundo motor, pois no exemplo utilizei apenas 1 e configurei o CI apenas para 1.

void setup() {                  
  
  Serial.begin(9600);  
  
  pinMode(11, OUTPUT);  
  pinMode(10, OUTPUT);  
  
}  
  
void loop() {  
  
  if(Serial.available() > 0)  
  {  
    int entrada = Serial.read();  
  
    switch (entrada){  
      case 'f':  
        frente();  
        break;  
  
      case 'r':  
        re();  
        break;  
  
      case 'd':  
        direita();  
        break;  
  
      case 'e':  
        esquerda();  
        break;  
  
      default:  
        parar();  
    }  
  }  
}  
  
void parar(){  
  digitalWrite(11, LOW);  
  digitalWrite(10, LOW);  
 
}  
  
void frente(){  
  digitalWrite(11, HIGH);  
  digitalWrite(10, LOW);  
}  
  
void re(){  
  digitalWrite(11, LOW);  
  digitalWrite(10, HIGH);  
}  
  
void direita(){  
  digitalWrite(11, HIGH);  
  digitalWrite(10, LOW);  
  
}  
  
void esquerda(){  
  digitalWrite(11, LOW);  
  digitalWrite(10, HIGH);  
  
}

Apesar do código ter funções para direita, esquerda, frente e ré, apenas direita e esquerda será eficaz nesse exemplo, uma vez que utilizei apenas um motor. O esquema (horrível, mas foi o melhor que pude fazer) é esse:

O controle de velocidade e integração com o robô será feito no próximo post, onde detalharei o funcionamento da classe Brain e compartilharei essa biblioteca.

Para finalizar, o vídeo.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.