Arduino – L293 H-Bridge / Ponte-H (Control your motors with L293D and Arduino)

L293 - L293D

O L293 (e suas variações L293B e L293D) é um circuito integrado que contém duas pontes H.

Pontes H são circuito compostos de alguns transistores, diodos (para barrar a corrente reversa), e alguns resistores para não queimar os transistores. O que ele faz é rodar e reverter motores DC.

As pontes H são chatas de montar na mão pois contem varias variáveis a tratar, esse CI facilita muito e diminui fisicamente o projeto.

Vejamos abaixo a pinagem do L293:

l293

 

Esse CI tem 16 pinos, precisamos de 4 pinos para fazer os inputs, dois para cada canal do circuito, e mais 4 pinos para o output.

Alternando o valor para HIGH ou LOW nos pinos 2 e 7 (motor 1), 15 e 10 (motor 2) dizemos em que sentido o motor irá girar. Os pinos de saida para os motores são 3 e 6(motor 1), 11 e 14 (motor 2). CUIDADO para não passar HIGH nos dois pinos que controlam o mesmo motor!

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

1 e 9 dizem se o canal está ligado ou desligado, para usar dois motores ligamos os dois em 5V. Esses pinos utilizaremos também para controlar a potencia do canal.

Sobram os pinos 8 que é a entrada de energia para os motores, podemos passar até 36V e o pino 16 que é a entrada de energia para os circuitos lógico (5V).

Sendo assim:

  • Pino 1: +5V (PWM)
  • 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
  • Pino 9: +5V (PWM)
  • Pino 10: Arduino
  • Pino 11: Motor 2
  • Pino 12: Ground
  • Pino 13: Ground
  • Pino 14: Motor 2
  • Pino 15: Arduino
  • Pino 16: +5V

No exemplo a seguir utilizei um Arduino, um potenciômetro para a potência do motor e um botão para controlar a inversão.

circuito_l293

Como notaram não tem segredo neste exemplo, abaixo segue o código fonte que utilizei e um vídeo demonstrativo.

int sensorPin = A0; //Potenciometro
int btInverter = A1; //Botão de inversao
int enable = 11; //Enable do circuito 1
int motorInput1= 12; //Motor pino 1
int motorInput2 = 13; //Motor pino 2

int tempPress = 0; //temporario de verificacao de botao pressionado
int direcao = 0; //direcao do motor (1 e 0)

void setup() {
  //defino os canais de saida
  pinMode(motorInput1, OUTPUT);  
  pinMode(motorInput2, OUTPUT);

  //sentido de rotacao
  digitalWrite(motorInput1, HIGH);  
  digitalWrite(motorInput2, LOW);
}

void loop() {
  int sensorValue = analogRead(sensorPin);      
  int outputValue = map(sensorValue, 0, 1023, 0, 255);  

  //pino Enable baseado no valor do potenciometro (controle de potencia)
  analogWrite(enable, outputValue);

  //se o botao de inversao for pressionado
  if(digitalRead(btInverter)==HIGH){
    //verifica se o botao ja nao estava pressionado.
    if(tempPress == 0){
      //verifica a direcao atual e inverte
      if(direcao == 0){
        digitalWrite(motorInput1, LOW);  
        digitalWrite(motorInput2, HIGH); 
        direcao = 1;
      }else{
        digitalWrite(motorInput1, HIGH);  
        digitalWrite(motorInput2, LOW);  
        direcao = 0;
      }
      tempPress = 1;
    }
  }else{
    tempPress = 0;
  }

  delay(100);                  
}

VÍDEO:

Help DEV – Analista desenvolvedor Java / Android

http://helpdev.com.br/zarelli

5 thoughts on “Arduino – L293 H-Bridge / Ponte-H (Control your motors with L293D and Arduino)

  1. olá amigo, pode me ajudar? estou tentando fazer reversão em 2 motores dc com ponte h L293d no arduino com 1 potenciometro para ca motor mais a reversão com o botao da errado e só 1 dos botões funciona revertendo os 2 ao mesmo tempo vo mandar o codigo para vc analizar

    // Projeto 16 – Uso do CI controlador de motor L293D
    #define switchPin 2 // Entrada da chave
    #define motorPin1 3 // Entrada 1 do L293D
    #define motorPin2 4 // Entrada 2 do L293D
    #define speedPin 9 // Pino de Ativação 1 do L293D
    #define potPin 0 // Potenciômetro no pino analógico 0

    #define switchPin1 7 // Entrada da chave
    #define motorPin3 5 // Entrada 1 do L293D
    #define motorPin4 6 // Entrada 2 do L293D
    #define speedPin1 10 // Pino de Ativação 1 do L293D
    #define potPin1 1 // Potenciômetro no pino analógico 0

    int Mspeed = 0; // Uma variável para armazenar o valor de velocidade atual
    int Mspeed1 = 0; // Uma variável para armazenar o valor de velocidade atual
    void setup() {
    //define o pino da chave como INPUT
    pinMode(switchPin, INPUT);
    pinMode(switchPin1, INPUT);
    // define os pinos remanescentes como saída
    pinMode(motorPin1, OUTPUT);
    pinMode(motorPin2, OUTPUT);
    pinMode(speedPin, OUTPUT);

    pinMode(motorPin3, OUTPUT);
    pinMode(motorPin4, OUTPUT);
    pinMode(speedPin1, OUTPUT);

    }

    void loop() {
    Mspeed = analogRead(potPin)/4; // lê o valor de velocidade a partir do potenciômetro
    Mspeed1 = analogRead(potPin1)/4; // lê o valor de velocidade a partir do potenciômetro

    analogWrite(speedPin, Mspeed); // escreve a velocidade para o pino de Ativação 1
    analogWrite(speedPin1, Mspeed1); // escreve a velocidade para o pino de Ativação 1

    if (digitalRead(switchPin1)==HIGH)

    { // Se a chave estiver HIGH, gire o motor em sentido horário
    digitalWrite(motorPin1, LOW); // define a Entrada 1 do L293D como baixa
    digitalWrite(motorPin2, HIGH); // define a Entrada 2 do L293D como alta
    digitalWrite(motorPin3, LOW); // define a Entrada 1 do L293D como baixa
    digitalWrite(motorPin4, HIGH); // define a Entrada 2 do L293D como alta
    }
    else { // se a chave estiver LOW, gire o motor em sentido anti-horário
    digitalWrite(motorPin1, HIGH); // define a Entrada 1 do L293D como baixa
    digitalWrite(motorPin2, LOW); // define a Entrada 2 do L293D como alta
    digitalWrite(motorPin3, HIGH); // define a Entrada 1 do L293D como baixa
    digitalWrite(motorPin4, LOW); // define a Entrada 2 do L293D como alta

    }
    }

    • Amigo acredito que seu problema esteja na codificação do botão pressionado, voce não usa nenhum delay entre os loop, veja no exemplo do meu codigo eu fiz um estado de botão anterior para evitar problema de ‘dois clicks’ simuntaneos.

      //se o botao de inversao for pressionado
      if(digitalRead(btInverter)==HIGH){
      //verifica se o botao ja nao estava pressionado.
      if(tempPress == 0){
      //verifica a direcao atual e inverte
      if(direcao == 0){
      digitalWrite(motorInput1, LOW);
      digitalWrite(motorInput2, HIGH);
      direcao = 1;
      }else{
      digitalWrite(motorInput1, HIGH);
      digitalWrite(motorInput2, LOW);
      direcao = 0;
      }
      tempPress = 1;
      }
      }else{
      tempPress = 0;
      }

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>