27
fev 11

Controlando motor DC com Ponte H (L293D) com arduino via porta serial

Preparei esse post para documentar um teste que eu fiz com CI L293D (Ponte H) para controlar um motor DC com arduino, mandando comandos pela porta serial do computador.

O L293D é uma ponte H dupla, isto é, controla até dois motores e faz com que estes rodem nas duas direções. Mas para esse teste eu usei apenas um motor. 😉

Os motores DC são motores de corrente contínua utilizados em brinquedos e pequenos dispositivos, e funcionam a pilha ou baterias. O bom desse tipo de motores é que são muito baratos. Mais em conta que servo-motores, e são facilmente encontrados em brinquedos. Então qualquer brinquedinho velho que tenha motor e funcione a pilha (ou bateria) tem um motor DC dentro. Basta abrir e retirar. 😀 Claro, claro. Espere o brinquedinho do seu filho quebrar, né. Ou ele perder o interesse e não se lembrar mais daquele carrinho 😉

Mas se seu filho não larga do carrinho ou sua filha não desgruda da boneca, não se incomode. Qualquer boa loja de 1,99 tem vários brinquedinhos legais bem baratinhos prontos para desmontar.

Aí você pode me perguntar. — Porque não comprar logo motores DC em uma loja de eletrônica? É uma ótima opção se você sabe o quer fazer, esse não é o meu caso.

Eu estou fazendo várias experiências e não sei bem o que vou precisar. Sendo assim um brinquedo desses me facilita muito a vida. Os motores DC tem um giro muito alto, e os carrinhos têm sempre caixas de redução com engrenagens para fazer com que os motores entreguem mais força e menos velocidade. Outra coisa boa são as rodas.

Por exemplo: Com R$ 25,00 eu comprei dois carrinhos no supermercado Extra. Com esse valor consegui quatro motores DC, duas caixas de redução para os motores, dois compartimentos para três pilhas, dois eixos para fazer curvas (não sei o nome disso :/ ), oito rodas de borracha de bom tamanho, e mais um monte de componentes eletrônicos que posso reaproveitar. Foi ou não, um bom negócio?

O maior problema de um motor DC é fazê-lo girar para os dois lados. Para isso se usam pontes H. Nos carrinhos elas vem todas soldadas junto com gambiarras chinesas. Não dá para usar. Então temos basicamente duas opções: Construir uma ponte H na unha com transistores e diodos de protecção, e fazer várias ligações, bla bla bla o que é bem complicado. Ou usar um CI que já é uma ponte H completinha, pronta pra uso. Como eu sou um grande preguiçoso escolhi usar o CI L293D que é bem barato (no eBay é ainda mais barato). O L293D dispensa o uso de diodos para tensão reversa dos motores. Basta ligar aos motores. Show!

Eu segui esse tutorial do site Makebits. Tinha pensado em fazer um parecido nesse post, mas o deles está realmente bem explicado. Nada a melhorar.

Vale ressaltar que o circuito só funciona bem com o arduino ligado a uma fonte externa de alimentação. Se estiver ligado somente pela alimentação via USB o motor não gira bem, ou o programa não funciona corretamente. Eu usei uma bateria de 9v.

Para testar o circuito eu fiz um programa para fazer o motor girar para a esquerda e para direita quando eu digitasse no teclado “d” e “e”, respectivamente. Qualquer outra letra faz o motor para de girar.

Eu gravei o motor em ação com a colaboração da minha filhota Gabriela. Ela explica tudo direitinho. Tá! Eu sou babão mesmo, eu sei :p

Segue o programa:

int motorPin1 = 5;
int motorPin2 = 6;
int entrada = 0;

void setup() {
 Serial.begin(9600);
 pinMode(motorPin1, OUTPUT);
 pinMode(motorPin2, OUTPUT);
}

void loop() {

 // testa se a porta serial está disponível
 if (Serial.available() > 0) {
 // le os dados da porta serial armazena na variavel 'entrada'
 entrada = Serial.read();
 if (entrada == 'e'){
 esquerda();

 } else if (entrada == 'd'){
 direita();

 } else {
 parar();

 }
 }
}

void esquerda(){
 digitalWrite(motorPin1, 1);   // Motor para a esquerda
 digitalWrite(motorPin2, 0);   //
}

void direita(){
 digitalWrite(motorPin1, 0);   // Motor para a esquerda
 digitalWrite(motorPin2, 1);   //
}

void parar(){
 digitalWrite(motorPin1, 0);   // para o motor
 digitalWrite(motorPin2, 0);   //
} 

Bom é isso. Quando fizer o teste com dois motores eu faço outro post.

Espero que esse post tenha sido útil.

Abs.