Controle de motores CC com o CI de driver de motor L293D e o Arduino

Se estiver planejando montar seu novo amigo robô, você vai querer aprender a controlar os motores CC. A maneira mais fácil e econômica de controlar motores CC é fazer a interface do CI de driver de motor L293D com o Arduino. Ele pode controlar a velocidade e o sentido de rotação de dois motores CC.

E, como bônus, ele também pode controlar um motor de passo unipolar, como o 28BYJ-48, ou um motor de passo bipolar, como o NEMA 17.

Controlando um motor CC

Para ter controle total sobre um motor CC, precisamos controlar sua velocidade e direção de rotação. Isso pode ser feito combinando essas duas técnicas.

  • PWM – para controlar a velocidade
  • Ponte H – para controlar a direção de rotação

PWM – para controlar a velocidade

A velocidade de um motor CC pode ser controlada alterando sua tensão de entrada. Uma técnica comum para fazer isso é usar PWM (Modulação por Largura de Pulso).

PWM é uma técnica em que o valor médio da tensão de entrada é ajustado enviando uma série de pulsos ON-OFF.

A tensão média é proporcional à largura dos pulsos, conhecida como Ciclo de Trabalho.

Quanto maior o ciclo de trabalho, maior a tensão média aplicada ao motor CC (resultando em maior velocidade) e quanto menor o ciclo de trabalho, menor a tensão média aplicada ao motor CC (resultando em menor velocidade).

A imagem abaixo mostra a técnica PWM com diferentes ciclos de trabalho e tensões médias.

Ponte H – para controlar a direção da rotação

A direção de rotação de um motor CC pode ser controlada alterando a polaridade da sua tensão de entrada. Uma técnica comum para fazer isso é usar uma ponte H.

Um circuito de ponte H consiste em quatro interruptores com o motor no centro, formando um arranjo em forma de H.

Fechar dois interruptores específicos ao mesmo tempo inverte a polaridade da tensão aplicada ao motor. Isso causa uma mudança na direção de rotação do motor.

A animação a seguir mostra o funcionamento do circuito da ponte H.

Circuito integrado controlador de motor L293D

O L293D é um controlador de motor H-Bridge de canal duplo capaz de controlar um par de motores CC ou um único motor de passo. Isso significa que ele pode controlar até dois motores individualmente, o que o torna ideal para a construção de uma plataforma robótica de duas rodas.

O L293D é mais frequentemente usado para acionar motores, mas também pode ser usado para acionar qualquer carga indutiva, como um solenóide de relé ou um grande transistor de potência de comutação.

É capaz de acionar quatro solenóides, quatro motores CC unidirecionais, dois motores CC bidirecionais ou um motor de passo.

O CI L293D tem uma faixa de alimentação de 4,5V a 36V e é capaz de fornecer uma corrente de saída de pico de 1,2A por canal, por isso funciona muito bem com a maioria dos nossos motores.

O IC também inclui diodos de kick-back integrados para evitar danos quando o motor é desenergizado.

Especificações técnicas

Aqui estão as especificações:

Tensão de saída do motor 4.5V – 36V
Tensão de entrada lógica 5V
Corrente de saída por canal 600mA
Corrente de saída de pico por canal 1.2A

Para obter mais detalhes, consulte a folha de dados abaixo.

Pinagem do CI do driver de motor L293D

O CI L293D tem um total de 16 pinos que o conectam ao mundo externo. A pinagem é a seguinte:

Vamos nos familiarizar com todos os pinos, um por um.

Pinos de alimentação

O CI do driver de motor L293D tem, na verdade, dois pinos de alimentação de entrada – VS e VSS.

O pino VS (Vcc2) fornece energia à ponte H interna do IC para acionar os motores. Você pode conectar uma tensão de entrada entre 4,5 e 36 V a este pino.

O VSS (Vcc1) é usado para acionar o circuito lógico interno, que deve ser de 5 V.

Os pinos GND são pinos de aterramento comuns. Todos os 4 pinos GND são conectados internamente e usados para dissipar o calor gerado em condições de alta carga.

Pinos de saída

Os canais de saída do driver de motor do L293D para o motor A e B são levados aos pinos OUT1, OUT2 e OUT3 e OUT4, respectivamente. Você pode conectar dois motores CC de 5-36 V a esses pinos.

Cada canal no CI pode fornecer até 600 mA ao motor CC. Entretanto, a quantidade de corrente fornecida ao motor depende da fonte de alimentação do sistema.

Pinos de controle de direção

Usando os pinos de controle de direção, é possível controlar se o motor gira para frente ou para trás. Na verdade, esses pinos controlam os interruptores do circuito da ponte H dentro do CI L293D.

O CI tem dois pinos de controle de direção para cada canal. Os pinos IN1 e IN2 controlam o sentido de giro do motor A, enquanto IN3 e IN4 controlam o sentido de giro do motor B.

O sentido de giro do motor pode ser controlado aplicando-se lógica ALTA (5V) ou lógica BAIXA (terra) a essas entradas. O gráfico abaixo mostra como isso é feito.

IN1 IN2 Direção de giro
Low(0) Low(0) Motor desligado
High(1) Low(0) Avançar
Low(0) High(1) Para trás
High(1) High(1) Motor desligado

Pinos de controle de velocidade

Os pinos de controle de velocidade ENA e ENB são usados para ligar/desligar os motores e controlar sua velocidade.

Puxar esses pinos para ALTO fará com que os motores girem, enquanto puxar para BAIXO os fará parar. Porém, com a modulação por largura de pulso (PWM), é possível controlar a velocidade dos motores.

Conectando um CI controlador de motor L293D a um Arduino

Agora que sabemos tudo sobre o CI, podemos começar a conectá-lo ao nosso Arduino!

Vamos começar conectando a fonte de alimentação aos motores. Em nosso experimento, estamos usando motores de caixa de engrenagens CC (também conhecidos como motores “TT”), comumente encontrados em robôs com tração nas duas rodas. Eles são classificados para 3 a 12 V. Portanto, conectaremos a fonte de alimentação externa de 5 V ao pino VS (Vcc2).

Em seguida, precisamos fornecer 5 V ao circuito lógico do L293D. Conecte o pino VSS (Vcc1) à saída de 5 V no Arduino. E certifique-se de que seu circuito e o Arduino compartilhem um terra comum.

Agora conecte os pinos de entrada e ativação do IC L293D (ENA, IN1, IN2, IN3, IN4 e ENB) aos seis pinos de saída digital do Arduino (9, 8, 7, 5, 4 e 3). Observe que os pinos de saída 9 e 3 do Arduino são habilitados para PWM.

Por fim, conecte um motor a OUT1 e OUT2 e o outro motor a OUT3 e OUT4. Você pode trocar as conexões do motor. Tecnicamente, não há maneira certa ou errada.

Quando terminar, você deverá ter algo semelhante à ilustração mostrada abaixo.

Código de exemplo do Arduino

O sketch a seguir lhe dará uma compreensão completa de como controlar a velocidade e o sentido de rotação de um motor CC com o CI de driver de motor L293D e servirá de base para experimentos e projetos mais práticos.

// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;

void setup() {
    // Set all the motor control pins to outputs
    pinMode(enA, OUTPUT);
    pinMode(enB, OUTPUT);
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
    pinMode(in3, OUTPUT);
    pinMode(in4, OUTPUT);
    
    // Turn off motors - Initial state
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
}

void loop() {
    directionControl();
    delay(1000);
    speedControl();
    delay(1000);
}

// This function lets you control spinning direction of motors
void directionControl() {
    // Set motors to maximum speed
    // For PWM maximum possible values are 0 to 255
    analogWrite(enA, 255);
    analogWrite(enB, 255);

    // Turn on motor A & B
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    delay(2000);
    
    // Now change motor directions
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    delay(2000);
    
    // Turn off motors
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
}

// This function lets you control speed of the motors
void speedControl() {
    // Turn on motors
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    
    // Accelerate from zero to maximum speed
    for (int i = 0; i < 256; i++) {
        analogWrite(enA, i);
        analogWrite(enB, i);
        delay(20);
    }
    
    // Decelerate from maximum speed to zero
    for (int i = 255; i >= 0; --i) {
        analogWrite(enA, i);
        analogWrite(enB, i);
        delay(20);
    }
    
    // Now turn off motors
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
}

Explicação do código:

O código do Arduino é bastante simples. Ele não requer nenhuma biblioteca para funcionar. O sketch começa com a declaração dos pinos do Arduino aos quais os pinos de controle do L293D estão conectados.

// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;

Na seção de configuração do código, todos os pinos de controle do motor (pinos de controle de direção e velocidade) são configurados como OUTPUT digital e os pinos de controle de direção são puxados para BAIXO para desligar os dois motores.

void setup() {
    // Set all the motor control pins to outputs
    pinMode(enA, OUTPUT);
    pinMode(enB, OUTPUT);
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
    pinMode(in3, OUTPUT);
    pinMode(in4, OUTPUT);
    
    // Turn off motors - Initial state
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
}

Na seção de loop do código, chamamos duas funções definidas pelo usuário em um intervalo de um segundo.

void loop() {
    directionControl();
    delay(1000);
    speedControl();
    delay(1000);
}

Essas funções são:

  • directionControl() – Essa função faz com que ambos os motores girem para frente na velocidade máxima por dois segundos. Em seguida, ela inverte a direção de giro do motor e gira por dois segundos. Por fim, ela desliga os motores.
    void directionControl() {
        // Set motors to maximum speed
        // For PWM maximum possible values are 0 to 255
        analogWrite(enA, 255);
        analogWrite(enB, 255);
    
        // Turn on motor A & B
        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW);
        delay(2000);
        
        // Now change motor directions
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, LOW);
        digitalWrite(in4, HIGH);
        delay(2000);
        
        // Turn off motors
        digitalWrite(in1, LOW);
        digitalWrite(in2, LOW);
        digitalWrite(in3, LOW);
        digitalWrite(in4, LOW);
    }
  • speedControl() – Essa função acelera ambos os motores de zero a velocidade máxima produzindo um sinal PWM usando a função analogWrite() e, em seguida, desacelera-os de volta a zero. Por fim, ela desliga os motores.
    void speedControl() {
        // Turn on motors
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, LOW);
        digitalWrite(in4, HIGH);
        
        // Accelerate from zero to maximum speed
        for (int i = 0; i < 256; i++) {
            analogWrite(enA, i);
            analogWrite(enB, i);
            delay(20);
        }
        
        // Decelerate from maximum speed to zero
        for (int i = 255; i >= 0; --i) {
            analogWrite(enA, i);
            analogWrite(enB, i);
            delay(20);
        }
        
        // Now turn off motors
        digitalWrite(in1, LOW);
        digitalWrite(in2, LOW);
        digitalWrite(in3, LOW);
        digitalWrite(in4, LOW);
    }
Please follow and like us:
error0
fb-share-icon
Tweet 20
fb-share-icon20