L293D – Circuito Integrado de Dupla Ponte H

Falando de Circuitos Integrados e aproveitando que já estou com a mão na massa com um aqui, vou falar sobre o L293D.

Mais especificamente, como usar o L293D com Arduino!

O L293D é um circuito integrado que contém duas pontes H.

O QUE!??

Calma! Pontes H são circuito compostos de alguns transistores, diodos para barrar a corrente reversa, e alguns resistores para não fritar os transistores… O que ele faz é rodar e reverter motores DC. Para fazer um circuito de ponte H na mão seria mais ou menos assim:

Basicamente, quando queremos que o motor gire para um lado fechamos T1 e T2, nesse caso a corrente correrá desde o input 9-12V até o terra (ground) passando pelo motor no caminho. Para revertê-lo, fecha-se T4 e T5, fazendo a corrente passar no caminho contrário pelo motor. Nesse caso, T3 e T6 são usados para diminuir a quantidade de inputs necessários de 4 (um para cada transistor) para 2 (um para cada par de transistores).  Observe os quatro diodos perto do motor, eles fazem com que a corrente não volte pelo caminho reverso.

Já montei um circuito parecido, mas não usamos T3 e T6, posso dizer que dá um belo trabalho! Principalmente por que tem transistores PNP e NPN envolvidos, se ligar um no lugar do outro ele torra…

Resumindo o CI L293D tem dois circuitos iguais ao da figura acima, portanto podemos controlar dois motores com ele! Estou usando o CI da ST, então temos o esquema abaixo:

Observe que o pino Vs pode chegar até 36V, mas os inputs não podem passar de 7V! Use 5V para todos os outros pinos…

Outra coisa importante não podemos passar de 600mA por canal, ele suporta em picos 1,2A, mas se mantiver ligado assim vai fritar o CI! Nada de motorzões poderosos nesse CI!!

Observe que os pinos 4, 13, 5 e 12 estão como GND, eles são apenas dissipadores de calor…

Vamos a montagem:

Esse CI tem 16 pinos, mas veja como é simples, precisamos de 4 pinos para fazer os inputs a partir do nosso Arduino, dois para cada canal do circuito. Alternando o valor para HIGH ou LOW nesses pinos dizemos para girar para um lado ou para o outro. São eles os pinos 2 e 7 para um motor e 15 e 10 para o outro. CUIDADO, não passe HIGH nos dois pinos que controlam o mesmo motor!!

Agora precisamos de 4 pinos para ligar nos motores, dois para cada, que são os outputs, pinos 3 e 6 para um motor e pinos 14 e 11 para o outro.

Já foram 8 pinos! Faltam 8…

Quatro pinos são apenas dissipadores de calor, portanto 4, 13, 5 e 12 vão para ground.

Sobram 4 pinos, fácil!

1 e 9 dizem se o canal está ligado ou desligado, para usar dois motores ligamos os dois em 5V.

Sobram os pinos 8 que é a entrada de energia para os motores, podemos passar até 36V nele e o pino 16 que é a entrada de energia para os circuitos lógicos… Eu passo 5V para ele.

Sendo assim:

  • Pino 1: +5V
  • Pino 2: Arduino
  • Pino 3: Motor 1
  • Pino 4: Ground
  • Pino 5: Ground
  • Pino 6: Motor 1
  • Pino 7: Arduino
  • Pino 8: +5V até +36V (Único pino que pode ter mais tensão que 5V)
  • Pino 9: +5V
  • Pino 10: Arduino
  • Pino 11: Motor 2
  • Pino 12: Ground
  • Pino 13: Ground
  • Pino 14: Motor 2
  • Pino 15: Arduino
  • Pino 16: +5V

No meu caso liguei o Arduino da seguinte maneira:

  • 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

Basicamente é isso aqui, só que não usei a bateria 12V usei o 5V do Arduino mesmo, só para testar se funciona legal, meus motores de 12V ligaram de boa:

A escolha dos pinos do Arduino foi determinada de forma que todos os inputs para o CI fosse dados por portas PWM que permitem modular o comprimento do pulso, mas utilizei no meu código como se fossem digitais mesmo, on e off (HIGH e LOW).

Acho que agora só falta o código, né? Basicamente é passar HIGH no pino 10 do arduino e LOW no pino 11, para inverter, passar HIGH no pino 11 e LOW no pino 10, não é uma boa ideia passar HIGH nos dois ao mesmo tempo! Apesar de eu achar que não vai fritar se as transições passarem HIGH nos dois pinos por um culhonésimo de segundo, manter assim pode dar merda.

Bom, o mesmo vale para o outro motor, alternando LOW e HIGH nas portas 5 e 6 do Arduino.

Meu código leva em consideração o uso de dois motores em um robô que gira no próprio eixo, por isso tenho funções para Frente, Ré, Direita (motor 1 frente, motor 2 trás) e Esquerda (motor 1 trás, motor 2 frente) e o estado Parado. Tudo controlado pelo Serial Monitor da IDE do Arduino.

Digitando ‘f’, ‘r’, ‘d’, ‘e’ ou qualquer letra para parar. (Eu uso ‘p’ para manter a convenção).

Segue o código:

void setup() {                

  Serial.begin(9600);

  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(5, 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);
  digitalWrite(6, LOW);
  digitalWrite(5, LOW);
}

void frente(){
  digitalWrite(11, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(5, LOW);
  digitalWrite(10, LOW);
}

void re(){
  digitalWrite(11, LOW);
  digitalWrite(6, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(10, HIGH);
}

void direita(){
  digitalWrite(11, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(6, LOW);
  digitalWrite(5, HIGH);

}

void esquerda(){
  digitalWrite(11, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(5, LOW);

}

Espero que seja de utilidade para construção de seus robozinhos! ;)

Segue umas fotinhos do meu teste…

Deu preguiça montar tudo isso para fazer um robozinho? Você pode comprar o C.I L293d e montar ou usar um mais potente como o L298N que é SMD, mas pode ser comprado já devidamente soldado da china

Agora que seus robozinhos já tem pernas, faltam os olhos, não deixem de ver o post sobre uso do ultrassom HC-SR04 com Arduino!

Abraço!

This entry was posted in Arduino. Bookmark the permalink.

30 Responses to L293D – Circuito Integrado de Dupla Ponte H

  1. Cassio says:

    Caro Gabriel,

    Parabéns pelo artigo. Precisaria mudar alguma coisa no circuito acima para usar somente 1 motor DC? Tenho o Arduino, o CI L293D e somente 1 motor DC de 4,5v.
    Bastaria fazer as ligações acima e deixar sem um motor DC?

    Obrigado.

    • Cassio, você usaria apenas “metade” no circuito para apenas um motor… o CI ficará com algumas portas sem uso.
      Ligue apenas as que alimentam o circuito e são comuns as duas pontes H que tem no circuito.
      Veja os pinos que saem do arduino, use apenas os que são de um motor e despreze o resto, bem como suas ligações no CI.
      Desculpe a demora para responder, trabalhando demais ando com pouco tempo até para brincar com meus arduinos =[
      Abraço!
      Gabriel Militello

  2. Adelmo Souza says:

    Gabriel,

    Estou tendo uma dificuldade em montar a estrutura eletrônica de um robô de sumo, para complementação de uma nota da faculdade, não pretendo neste momento montar fisicamente o robô, apenas a parte de controle (que pode ser através de arduino) e a parte de potência (a ponte H com o PWM para 02 motores).
    O que necessito fazer é:
    Montar um circuito no proteus e depois programar na placa de circuito, o sistema devera funcionar assim: liga o robô ele fica 5 segundos parado e depois sair à meia velocidade um sensor vai verificando se ele ainda está na arena e outro vai tentando localizar o inimigo, se ele chegar próximo de sair da área ele deve parar e der a ré e depois mudar o sentido e continuar a meia velocidade, ao localizar o inimigo ele deve atingir a velocidade máxima e tentar derrubar da arena.
    Você pode me ajudar?
    Obrigado

    • Adelmo,

      Não sei se consigo te ajudar, mais leve em conta que um circuito de ponte H bem feito usa transistors em disposição darlington, portanto é necessária uma corrente muito pequena para os transistores liberarem a fonte dos motores (parte não lógica do circuito).
      Você precisa calcular, pela especificação do transistor quanto de corrente é preciso pra fazer meia potência e potência completa.
      A programação dos pinos PWM são a tradução dessa corrente para 0 a 255 do microcontrolador.
      Pense bem em como fará para analisar a arena, esse é ponto chave, e deve ser a primeira coisa que você deverá verificar no código provavelmente lendo um input analógico.
      Espero que seja de alguma ajuda… O pessoal do fórum robocore.net deve poder te dar umas dicas mais bacanas…
      Se precisar de um trecho de código reponde aí que vejo se consigo escrever algo…
      Abraço e boa sorte com o projeto!
      Repeat do Miau

  3. Adelmo Souza says:

    Gabriel,

    Creio que irei necessitar de sua ajuda pelo menos na parte do código, assim que meu projeto estiver pronto disponibilizo para você colocar em seu blog! creio que muitas pessoas assim como eu estão perdidas neste assunto.

    Obrigado,

    Adelmo Souza

  4. Gustavo says:

    Poxa legal Gabriel teu projeto, eim to montando um tbm, quer passa teu msn pra poder troca uma idéia contigo?

  5. Gustavo says:

    Aee Gabriel, Eim mano nesse caso ai como que fico o pino 8 (enable) do l293d eim, pq tipo cara to fazendo um seguidor de linha utilizando sensor fotodiodo saca dai nao tem como vc entra com valor.

    • Fala Gustavo, o pino 8 do CI é o que vai ligado na fonte externa de bateria… porque o Arduino só consegue fornecer 5V e os motores geralmente precisam de mais que isso…
      Pode ligar até 36v aí. No exemplo liguei o pino 8 na saída 5V do Arduino porque não preciso de muita força nesses motores só para o teste.

  6. Pedro says:

    Muito bom o tutorial! Eu só tenho uma duvida, fiz as ligações certinhas como manda, porem o arduino fica reiniciando quando eu mando HIGH nas portas certas. Medi com um multimetro, está entrando 12v no pino 8 e entrando 5v nos pinos 1, 9 e 16, mas no motor nao chega tensao nenhuma.
    Grato pela atenção.

    • Fala Pedro,

      Alguma coisa tem, se ele reinicia, você (provavelmente) está sobrecarregando o Arduino e o sistema contra curto dele tá derrubando tudo… Ele costuma fazer isso para impedir picos no USB da sua máquina…

      Rola mandar uma foto que dê para ver a ligação? Esse é tipo de coisa bem difícil de ajudar de longe… =]

      blog [em] repeatdomiau [ponto] com [ponto] br

  7. deivid says:

    ótimo tutorial nota 10 !!

    eu estou com um pequeno problema com esse ci vo tentar explicar

    tenho um rx tx, e fiz uma placa com o ht12d + hd74ls04p( para inverter a saida do ht12d) e o ponte H l923d.
    o problema é o seguinte, quando eu aperto o botão para ligar o motor, ele dispara e não responde mais, só quando deixo o controle bem perto da placa. ai ele para e o led vermelho liga ( esse led é o indicador que esta se comunicando com o controle, quando ele apaga quer dizer que não tem comunicação com o controle).
    o interessante quando eu to bem longe, tipo uns 20 metros o motor liga quando eu aperto o botão, mas quando eu solto ele não para só quando deixa o controle bem perto, coloquei led no lugar dos motores dc ai funcionu perfeitamente.

    ai coloquei um outro motor e funcionou perfeitamente, mas eu to precisando do outro motor. pois to fazendo um carro de controle remoto

    http://forum.clubedohardware.com.br/problemas-ci-l923d/1041262?p=5569128#post5569128

    se poder me ajudar agradeço
    se der manda um e-mail pra mim

    valeuuuuuuuuuuuuuu

  8. Negão says:

    Cara, você declarou um int para tratar valores do tipo char.
    Comentar o código um pouquinho seria bom ^^

    Fora isso, tá beleza

  9. Leandro Augusto do Nascimento says:

    Teria como eu depois de ter feito tudo isso, ainda poder controlar a velocidade de um dos motores, no meu caso só um basta, como se eu estivesse usando um potenciometro?

  10. Marcio says:

    A minha pergunta eh exatamente identica ao Deivid ( postada acima). Funciona tudo direito, mas quando uso transmissor tx433 a 2 metros o motor dispara, somente desliga quando chego bem perto do receptor. Porque acontece isso? Desde ja agradeco por tirar essa duvida.

    • Oi Marcio,
      Tem muitas variáveis envolvidas nesse caso… não sei exatamente como responder.

      Vou começar do básico, porque muitas vezes erramos no mais simples, se for muito óbvio por favor não se ofenda.

      Quando o arduino passa pelo loop ele mantém o estado das portas dele, a não ser que você altere. Portanto no caso do radio controle você precisaria colocar um delay de x segundos (ou milis) e voltar o estado dos motores para parado nas funções de direita, esquerda e frente. Dessa forma, os motores vão rodar por um tempo e esperar o estado no próximo ciclo para ver se devem rodar novamente ou não. Isso deve impedir que os motores rodem para sempre.

      Acho estranho porém ele funcionar em uma distância e em outra não… Certeza que é distância? As vezes é o tempo que você demora para chegar até ele….(vai saber)

      Você já colocou um SerialWrite para logar a leitura do controle?

      Nunca usei o tx433, minhas brincadeiras são mais no sentido de veículos autônomos com ultrassom embarcado ou algo assim…

      Loga a leitura do controle, se estiver ok (dentro do esperado) fica mais fácil, porque o problema é programação aí é só testar formas diferentes de re-escrever essas funções.

      Isso é o pouco que posso ajudar sem ver o código e o protótipo, espero que você consiga aí, qualquer coisa dá um toque.

  11. Renan says:

    Amigo, estou refazendo meu carrinho a controle remoto (sem Arduino) e estou utilizando o L293D.
    Minha intenção é forçar o maximo do carro, mesmo sabendo que posso perder o motor ou o proprio carrinho (parte fisica) por excesso de voltagem e velocidade.

    Já fiz o circuito e esta tudo funcionando perfeitamente (ja me diverti muito). Utilizo uma bateria de 9V de 500mHa. Eu utilizo controladores de tensão (5V) para todas o pinos, exceto para o pino 8 qual mando toda a voltagem disponível da fonte (no caso uns 8,3 volts – medição do multimetro).

    Mas agora quero aumentar a velociadade e para isso resolvi aumentar a voltagem (reforçando: não ligo de estragar o motor, etc).

    A voltagem no pino 8 esta uns 15 volts. Os outros pinos esta 5V. Consegui o esperado (o carrinho voou :) ), mas notei que após alguns minutos de brincadeira o controle não responde mais… ou seja, eu mando ele ir pra frente, mas ele não vai. Ou demorar a obdecer. Ou fica dando uns trancos… dai eu desligo deixo um tempo parado e volta a funciona durante um tempo (depois volta a repetir o problema)… Acho que não é problema na bateria nem no receptor, pois o controle de direção esta fica funcionando normalmente, mesmo que o problema esta ocorrendo…

    Então fiz umas medições: a voltagem na saida dos motores = 13 Volts. A amperagem para os motores fica em 0,2A ou 0,3A.
    Ressalto que o CI fica muuito quente (da pra queimar o dedo).

    Não entendo o que ocorre, pois estou respeitando os limites do CI (voltagens e amperagens) mas ele parace estar pedindo arrego…

    Tem alguma idéia?

    Valeu!

  12. nata says:

    Olá, primeiramente muito bom seu tutorial!

    Estou fazendo um projeto utilizando esta ponte H, dois motores DC simples e uma fonte de 9V para alimentar os motores,e mais o arduino UNO. O circuito funciona, mas as portas de saída da ponte H mandam apenas 1.2V para os motores deixando-os muito fraco para mover a estrutura do carrinho.

    Teria como pensar o que esta ocorrendo de errado ?

    desde já obrigado.

  13. Guilherme says:

    Cara , muito bom este artigo , mas estou com uma duvida que pode ser meio ridicula , mas como sou iniciante em arduino , é sempre bom perguntar para nao ter problemas , em fim eu gostaria de saber 1 qual a voltagem / tensão de cada motor e 2 se eu posso usar uma fonte externa de 9V (pois tenho medo de fritar meu arduino) se puder , como seria a nova “ligação” ? 3 se vc pode disponibilizar o projeto no fritzing .

    Obrigado desde já.

  14. Guilherme says:

    E se eu for utilizar uma fonte externa , basta eu ligar o pino 8 no positivo da Fonte 9v?

  15. Pingback: Eletrônica digital com Arduino – CI L293D – Controlando motores ← Do Bit Ao Byte

  16. wagner says:

    Ola sou Wagner….Gostaria de saber se eu posso ligar um motor bidirecional de impressora de 24v no ci L293D – e como eu faço o acionamento por arduino para acionar a direção do motor? Eu coloco codigo no arduino e o arduino envia o codigo para algum dos pinos do ci L293D?
    Se o ci L293D queimar ocasiona algum dano para minha placa arduino?

    • Quando tiver esse tipo de dúvida procure o datasheet do component…

      Ele pode sim ser usado com motor de impressora. Qualquer motor de 4.5 a 36V. No entanto cuidado com a corrente. Se o motor fizer muita força ele aumentará a corrente no circuito.

      Pode acabar fritando o CI.

      Quanto a queimar o CI, o Arduino deve passar ileso. No entanto, um CI como esse pode derreter em altas correntes. Cuidado para ele não derreter no Arduino…

      Tenha muito cuidado com curto-circuitos nesse CI.

      Como ele usa dupla alimentação uma para o motor e uma para o circuito lógico, dependendo do curto que você der nos pinos a DDP pode chegar ao arduino e queimá-lo. Se estiver no USB pode até queimar sua máquina.

      Estamos falando de 36v num lugar projetado para 5v.

  17. Fernando says:

    Você poderia me ajudar em como controlar os dois motores da ponte H através do bluetooth de um celular android?

  18. Áquila Henrique Monteiro says:

    eu montei exatamente esse circuito, para uma fonte de 12V e dois motores na saida(ambos 12V) só que o meu ci (L293D) esta esquentando muito, como isso os motores nao funcionam.
    gostaria que vc me ajudasse nessa parte.

  19. Marco A. Marin says:

    Olá Gabriel,
    Parabéns pelo post e principalmente pela capacidade de explicar de maneira clara e objetiva as coisas. Eu como leigo em eletrônica consegui entender e se eu consegui qualquer um vai entender.
    O meu problema é outro vou tentar explicar:
    Talvez possa ajudar até outras aplicações futuras de outras pessoas.
    Tenho uma câmera desmontada para fazer uma adaptação no controle de foco automático dela. (Calma! Eu explico).
    A câmera tem um motor de passo Bipolar 4 Fios dois para cada bobina. Esse motor faz o foco automático da câmera e lente original.
    E bem pequeno tem 6,5 mm de diâmetro e deve trabalhar com uma tenção de 5v Máximo.
    Tenho que pegar o sinal que vem do Drive da Câmera para o motor de cada bobina e amplificar esse sinal para um outro motor de passo bipolar também de maior potencia e tamanho 12V 600 mA máximo.
    É possível ligar a bobina 1 do motor pequeno nas entradas do L293D direta e esquerda do moto 1 e usar as saídas do motor 1 com 12 V 600 mA no motor maior que vai acionar outra lente?
    E repetir para ligar a segunda bobina nas entradas direita esquerda do Motor 2
    Não vou usar nenhum controlador pretendo ligar tudo direto somente com o sinal que a câmera envia para o motor pequeno original.
    É possível usar o CI L293D como um Drive amplificador de tensão e corrente para um motor maior? Repetindo os mesmos pulsos e tempos das bobinas do motor pequeno?
    Agradeço desde já a resposta,
    se possível enviar a resposta para o meu e-mail também agradeço!
    Parabéns mais uma vez,
    Marco

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>