Controle DC, Stepper & Servo com L293D Motor Driver Shield & Arduino

Se você pretende construir seu próprio robô, precisará controlar vários motores, como motores CC, motores de passo e servos, e não há opção melhor do que o L293D Motor Driver Shield. Ele é capaz de controlar todos esses motores; não há necessidade de módulos adicionais.

O shield do driver de motor L293D tem todos os recursos necessários para uma ampla variedade de projetos de complexidade baixa a moderada. Ele pode controlar:

Visão geral do hardware

Chipset do driver
O cérebro do shield são dois drivers de motor L293D e um registrador de deslocamento 74HC595.

O L293D é um driver de motor H-Bridge de canal duplo que pode controlar dois motores CC ou um único motor de passo. Como o shield inclui dois desses drivers de motor, ele pode controlar até quatro motores CC ou dois motores de passo.

O registrador de deslocamento 74HC595, por outro lado, estende os quatro pinos digitais do Arduino para os oito pinos de controle de direção de dois chips L293D.

Conexões de alimentação do motor

O shield suporta uma faixa de tensão do motor de 4,5 a 25 volts. Essa energia pode ser compartilhada com o Arduino ou usada separadamente. Para escolher entre os dois, um jumper especial denominado PWR é fornecido próximo ao conector de alimentação de dois terminais.

Quando o jumper está no lugar, a alimentação é fornecida aos motores por meio do conector de alimentação CC do Arduino. Nesse caso, os motores e o Arduino não estão fisicamente isolados um do outro. Esse método torna o shield mais fácil de usar porque requer apenas uma fonte de alimentação; no entanto, você só pode usar esse método quando a tensão de alimentação do motor for inferior a 12 V.

Quando o jumper é removido, a alimentação do motor é desconectada do Arduino, permitindo que os motores sejam fisicamente isolados do Arduino. Nesse caso, no entanto, você deve fornecer uma fonte de alimentação separada para o motor ao conector de alimentação de dois terminais denominado EXT_PWR.

Aviso:

A aplicação de energia ao conector de alimentação de dois terminais EXT_PWR enquanto o jumper estiver no lugar causará um curto-circuito entre as duas fontes de alimentação, podendo danificar a blindagem do motor e o Arduino!

 

Conexões do motor CC

Os canais de saída de ambos os CIs L293D são divididos até a borda da blindagem com dois terminais de parafuso de 5 pinos rotulados como M1, M2, M3 e M4. Um total de quatro motores CC operando entre 4,5 e 25 V pode ser conectado a esses terminais.

Cada canal no módulo pode fornecer até 600 mA (1,2 A de pico) de corrente para o motor CC. A quantidade de corrente fornecida ao motor, entretanto, depende da capacidade da fonte de alimentação do motor.

Conexões do motor de passo

Você também pode conectar dois motores de passo aos terminais de saída. Um motor de passo (Stepper) é conectado a M1-M2 e o outro a M3-M4.

Se você tiver um motor de passo unipolar de 5 fios, conecte o fio de derivação central ao terminal de aterramento central.

Conexões de servomotores

O shield leva as linhas de saída PWM de 16 bits a dois conectores de 3 pinos, que podem ser usados para conectar dois servomotores.

Infelizmente, os servomotores são alimentados diretamente pela fonte de 5V do Arduino, o que geralmente é uma má ideia. Isso pode fazer com que o regulador de 5 V integrado do Arduino superaqueça e também pode introduzir ruído elétrico na fonte de 5 V. O lado positivo é que ele tem um capacitor de 100 uF nesses pinos de alimentação, o que ajuda um pouco.

Portanto, se você quiser usar esse recurso, use apenas servos pequenos, como o SG90.

Recursos de bônus

Entre as vantagens do shield estão as seguintes:

A proteção inclui um conjunto de resistores de pulldown para manter os motores desligados durante a inicialização.

O LED integrado indica que a fonte de alimentação do motor está funcionando corretamente. Os motores não funcionarão se ele não estiver aceso.

O botão RESET nada mais é do que o botão de reinicialização do Arduino. Ele foi colocado na parte superior para facilitar o acesso.

Seis pinos analógicos (A0 a A5), bem como conexões de 5V e terra, são fornecidos no canto inferior direito. Você pode preenchê-los com cabeçalhos, o que os torna úteis para conectar vários sensores.

Conexões de pinos entre o Arduino e o Shield

Para o controle de motores CC e de passo, o shield usa os pinos D3, D4, D5, D6, D7, D8, D11 e D12.

D9 e D10 são usados para controlar os servomotores. D10 é conectado ao Servo 1, enquanto D9 é conectado ao Servo 2.

Observe que o shield não usa os pinos D2 ou D13.

Instalação da biblioteca AFMotor

Para nos comunicarmos com o shield, precisamos primeiro instalar a biblioteca AFMotor.h. Isso nos permitirá controlar motores CC, de passo e servomotores com comandos simples.

Para instalar a biblioteca, navegue até Sketch > Include Library > Manage Libraries… Aguarde até que o Library Manager faça o download do índice de bibliotecas e atualize a lista de bibliotecas instaladas.

Filtre sua pesquisa digitando “motor shield“. Procure por Adafruit Motor Shield library (V1 Firmware) by Adafruit. Clique nessa entrada e, em seguida, selecione Install (Instalar).

Experimento 1 – Acionamento de motores CC com o Shield L293D

Agora que aprendemos tudo o que há para saber sobre o shield, podemos começar a conectá-lo ao Arduino!

Ligação
Comece montando a blindagem do motor na parte superior de um Arduino.

Em seguida, conecte a fonte de alimentação do motor. Em nosso experimento, estamos usando motores de caixa de engrenagens CC, também chamados de motores “TT”, que geralmente são encontrados em robôs com tração em duas rodas. Eles são classificados para 3 a 12V. Portanto, conectaremos a fonte de alimentação externa de 9V ao terminal EXT_PWR.

Por fim, conecte o motor a um dos terminais M1, M2, M3 ou M4. Estamos conectando-o ao M4.

Código Arduino

O sketch abaixo mostrará como controlar a velocidade e a direção de rotação de um motor CC usando o shield do driver de motor L293D e pode servir como base para experimentos e projetos mais práticos.

O sketch acelera o motor CC em uma direção antes de desacelerar e parar. Após uma volta, o motor inverte o sentido de giro e repete o processo.

#include <AFMotor.h>

AF_DCMotor motor(4);

void setup() 
{
    //Defina a velocidade inicial do motor e pare
    motor.setSpeed(200);
    motor.run(RELEASE);
}

void loop() 
{
    uint8_t i;

    // Ligar o motor
    motor.run(FORWARD);
    
    // Acelerar de zero a velocidade máxima
    for (i=0; i<255; i++) 
    {
        motor.setSpeed(i);  
        delay(10);
    }
    
    // Desacelerar da velocidade máxima para zero
    for (i=255; i!=0; i--) 
    {
        motor.setSpeed(i);  
        delay(10);
    }

    // Agora mude a direção do motor
    motor.run(BACKWARD);
    
    // Acelerar de zero a velocidade máxima
    for (i=0; i<255; i++) 
    {
        motor.setSpeed(i);  
        delay(10);
    }

    // Desacelerar da velocidade máxima para zero
    for (i=255; i!=0; i--) 
    {
        motor.setSpeed(i);  
        delay(10);
    }

    // Agora desligue o motor
    motor.run(RELEASE);
    delay(1000);
}

Explicação do código

O sketch começa com a inclusão da biblioteca AFMotor.h.

A segunda linha AF_DCMotor motor(motorPort#) cria um objeto de biblioteca. Aqui, você deve especificar o número da porta do motor à qual o motor está conectado. Escreva 1 para a porta M1, 2 para a porta M2 e assim por diante.

Se você quiser conectar vários motores ao shield, crie um objeto separado para cada motor. O trecho de código a seguir, por exemplo, cria dois objetos AFmotor.

AF_DCMotor motor1(1);
AF_DCMotor motor2(2);

Nas seções de configuração e loop do código, simplesmente chamamos as duas funções listadas abaixo para controlar a velocidade e a direção de um motor.

  • A função setSpeed(speed) controla a velocidade do motor. A velocidade varia de 0 a 255, sendo 0 desligado e 255 a aceleração total. No programa, você pode alterar a velocidade sempre que quiser.
  • A função run(cmd) controla a direção de rotação do motor. Os valores de cmd válidos são os seguintes:
    • FORWARD – gira o motor para frente.
    • BACKWARD – gira o motor para trás.
    • RELEASE – Faz com que o motor pare e é equivalente a setSpeed(0). Como a blindagem do motor não tem freio dinâmico, o motor pode levar algum tempo para parar de girar.

Experimento 2 – Acionamento de motores de passo com o shield L293D

Nosso próximo experimento envolverá a conexão de um motor de passo ao shield L293D. Comece montando a proteção do motor em cima de um Arduino.

Ligação para o stepper unipolar 28BYJ-48

Os motores de passo unipolares 28BYJ-48 são classificados em 5 V e fornecem 48 passos por rotação. Portanto, conecte uma fonte de alimentação externa de 5V ao terminal EXT_PWR.

Não se esqueça de remover o jumper PWR.

Por fim, conecte o motor aos terminais do motor de passo M1-M2 (porta nº 1) ou M3-M4 (porta nº 2). Estamos conectando-o ao M3-M4.

Ligação do motor de passo bipolar NEMA 17

Os motores de passo bipolares NEMA 17 são classificados em 12 V e fornecem 200 passos por rotação. Portanto, conecte uma fonte de alimentação externa de 12 V ao terminal EXT_PWR.

Não se esqueça de remover o jumper PWR.

Por fim, conecte o motor aos terminais do motor de passo M1-M2 (porta nº 1) ou M3-M4 (porta nº 2). Estamos conectando-o ao M3-M4.

Código do Arduino

O sketch a seguir mostrará como controlar um motor de passo unipolar ou bipolar com o shield L293D, e é o mesmo para ambos os motores, exceto pelo parâmetro stepsPerRevolution.

Antes de executar o sketch, modifique esse parâmetro para que corresponda às especificações de seu motor. Por exemplo, defina-o como 200 para NEMA 17 e 48 para 28BYJ-48.

#include <AFMotor.h>

// Número de etapas por rotação de saída
// Altere isso de acordo com a especificação do seu motor
const int stepsPerRevolution = 48;

// conectar o motor à porta nº 2 (M3 e M4)
AF_Stepper motor(stepsPerRevolution, 2);

void setup() {
  Serial.begin(9600);
  Serial.println("Stepper test!");

  motor.setSpeed(10);  // 10 rpm   
}

void loop() {
  Serial.println("Single coil steps");
  motor.step(100, FORWARD, SINGLE); 
  motor.step(100, BACKWARD, SINGLE); 

  Serial.println("Double coil steps");
  motor.step(100, FORWARD, DOUBLE); 
  motor.step(100, BACKWARD, DOUBLE);

  Serial.println("Interleave coil steps");
  motor.step(100, FORWARD, INTERLEAVE); 
  motor.step(100, BACKWARD, INTERLEAVE); 

  Serial.println("Micrsostep steps");
  motor.step(100, FORWARD, MICROSTEP); 
  motor.step(100, BACKWARD, MICROSTEP); 
}

Explicação do código

O sketch começa com a inclusão da biblioteca AFMotor.h.

A segunda linha AF_Stepper motor(48, 2) cria um objeto de biblioteca. Aqui, você deve especificar as etapas por revolução do motor e o número da porta à qual o motor está conectado.

Nas seções de configuração e loop do código, simplesmente chamamos as duas funções listadas abaixo para controlar a velocidade e a direção de um motor.

  • setSpeed(rpm) define a velocidade do motor, em que rpm é o número de rotações por minuto que você deseja que o motor de passo gire.
  • step(#steps, direction, steptype) é chamada toda vez que você deseja que o motor se mova. #steps é o número de passos que você deseja que ele dê. A direção pode ser FORWARD (para frente) ou BACKWARD (para trás), e o tipo de passo pode ser qualquer um dos seguintes:
    • SINGLE – Uma bobina é energizada por vez.
    • DOUBLE (Duplo) – Duas bobinas são energizadas ao mesmo tempo para obter mais torque.
    • INTERLEAVE – Alternar entre simples e duplo para criar um meio passo entre eles. Isso pode resultar em uma operação mais suave, mas a velocidade é reduzida pela metade devido ao meio passo extra.
    • MICROSTEP – Entre cada passo completo, as bobinas adjacentes são aumentadas e diminuídas para criar um número de micro-passos. Isso produz uma resolução mais fina e uma rotação mais suave, mas às custas do torque.

Experimento 3 – Acionamento de servomotores com o shield L293D

Nosso experimento final envolverá o acionamento de um servomotor com o shield L293D.

Ligação

O shield leva os pinos de saída PWM de 16 bits D9 e D10 a dois conectores de 3 pinos, que podem ser usados para conectar dois servomotores. Lembre-se de que D10 está conectado ao Servo 1, enquanto D9 está conectado ao Servo 2.

Os servomotores são alimentados diretamente pela fonte de 5V do Arduino, portanto, não há necessidade de conectar nada ao terminal EXT_PWR.

Código do Arduino

Esse sketch é baseado no sketch de varredura padrão encontrado nos Exemplos do Arduino em servo. Ele varre o eixo de um servomotor para frente e para trás em 180 graus.

#include <Servo.h> 

Servo myservo;	// criar um objeto servo para controlar um servo
int pos = 0;	// variável para armazenar a posição do servo

void setup() 
{
    // conecta o servo no pino 10 ao objeto servo
    myservo.attach(10);   
}

void loop() 
{
    // varre de 0 graus a 180 graus
    for(pos = 0; pos <= 180; pos += 1) 
    {
        myservo.write(pos);
        delay(15);
    }
    // varre de 180 graus a 0 graus
    for(pos = 180; pos>=0; pos-=1)
    {
        myservo.write(pos);
        delay(15);
    }
}
Please follow and like us:
error0
fb-share-icon
Tweet 20
fb-share-icon20