fbpx
ArduinoNovidade

Como controlar motor DC utilizando o Driver Ponte H L298N

O motor DC é um dispositivo muito conhecido no mundo da robótica. Se você está pensando em construir um projeto de robótica certamente terá que utilizar um.

O motor DC é um equipamento capaz de converter energia elétrica em energia mecânica, sendo amplamente usado em brinquedos, robôs seguidores de linha, carrinhos de controle remoto, plataformas robóticas, esteiras, entre outros.

O controle completo de um motor DC pode ser obtido a partir do controle da sua velocidade e sentido de rotação. Para tal, combinamos o uso de duas técnicas:

  • PWM: para controlar a velocidade;
  • Ponte H: Para controlar o sentido de rotação.

O sentido de rotação de um motor DC pode ser alterado se invertemos a polaridade de sua alimentação, visto que o sentido da corrente elétrica que circula em seus rolamentos é que determinam seu sentido de rotação.

Usar uma ponte H é uma técnica comum para alterar a polaridade da tensão de entrada do motor DC. A ponte H é um circuito eletrônico de potência utilizado para controle e acionamento de motor DC a partir de um sinal gerado pelo microcontrolador. Seu uso é necessário porque os sinais de saída dos microcontroladores não suportam a corrente exigida para acionamento da maioria dos motores. Portanto, a ponte H funciona como uma unidade de potência que pode alimentá-lo convenientemente.

A velocidade do motor DC pode ser controlada variando sua tensão de entrada e uma técnica comum para fazer isso é usar PWM (Modulação por largura de pulso). O PWM é uma técnica em que o valor médio da tensão (e corrente) de entrada do motor é controlado enviando uma série de pulsos ligados e desligados (ON-OFF).

No mercado existem inúmeros modelos de módulos e shields ponte H capazes de realizar o controle completo de motores DC, como a Driver Ponte H dupla L298N (Figura 1).

Imagem ilustrativa do driver ponte H dupla L298N.
Figura 1: Driver ponte H dupla L298N.

O driver ponte H L298N possui como componente principal o chip L298N que contém duas pontes H capazes de acionar um par de motores DC ou um motor de passo, tornando-o ideal para construção de plataformas robóticas de duas rodas.

As principais características técnicas desse drive são:

  • Fonte de alimentação: 5 V a 35 V;
  • Tensão de saída para o motor (recomendada): 7 V a 12 V;
  • Tensão lógica: 5V a 7V;
  • Corrente máxima total: 4 A;
  • Corrente máxima suportada por canal: 2 A;
  • Máxima potência de dissipação: 25W.

ATENÇÃO: Respeitar as especificações técnicas garante o correto funcionamento do driver ponte H L298N e evita possíveis danos.

A Figura 2 indica os pinos do driver ponte H L298N, que serão detalhados em seguida.

Imagem ilustrativa dos pinos do driver ponte H dupla L298N.
Figura 2: Pinos do driver ponte H dupla L298N.

Os pinos possuem as seguintes funções:

Pinos de alimentação:

  • VCC: Alimentação do driver ponte H L298N (5V a 35V). A tensão inserida neste borne será usada para alimentar também os motores conectados. Desta forma, deve-se prestar muita atenção antes de realizar a ligação. Se o seu motor opera com tensão de até 12V, por exemplo, atente-se para que a alimentação inserida no pino VCC seja de até 12V, para evitar que o motor seja danificado ou queimado.
  • GND: Aterramento do driver ponte H L298N.
  • 5V: Pino usado para alimentar o circuito lógico do CI L298N e pode variar entre 5V e 7V.

Pinos de saída:

OUT1 e OUT 2: Canais de saída do driver ponte H L298N para o motor A.

OUT3 e OUT 4: Canais de saída do driver ponte H L298N para o motor B.

Pinos de controle de direção:

IN1 e IN2: Pinos de controle da direção de rotação do motor A.

IN3 e IN4: Pinos de controle da direção de rotação do motor B.

A direção de rotação do motor será controlada aplicando nível lógico alto (5V) ou baixo (GND) às entradas IN1, IN2, IN3 e IN4, conforme a Tabela 1.

MOTOR AMOTOR B
IN1IN2DireçãoIN3IN4Direção
AltoAltoDesligadoAltoAltoDesligado
BaixoAltoLigado em uma direçãoBaixoAltoLigado em uma direção
AltoBaixoLigado na direção contráriaAltoBaixoLigado na direção contrária
BaixoBaixoDesligadoBaixoBaixoDesligado
Tabela 1: Direção dos motores conforme nível lógico.

Pinos de controle da velocidade:

ENA: Pino de controle da velocidade do motor A.

ENB: Pino de controle da velocidade do motor B.

O driver ponte H L298N inclui um regulador de tensão 78M05 que pode ser habilitado ou desabilitado por meio do jumper localizado próximo ao borne de alimentação, conforme a Figura 3.

Imagem ilustrativa dos componentes do driver ponte H dupla L298N.
Figura 3: Componentes do driver ponte H dupla L298N.

Quando o jumper está conectado, o regulador de 5 V encontra-se habilitado e o pino 5V do driver atuará como pino de saída de 5 V e 0,5 A. Uma dica é usá-lo para alimentar o Arduino ou outro circuito que exija uma fonte de alimentação de 5V.

Por sua vez, quando o jumper é removido, o regulador é desabilitado e temos que fornecer 5V no pino de entrada 5V.

Outro ponto importante que deve ser citado é que o L298N possui uma queda de tensão. Devido ao fato de que os transistores de comutação interna possuem queda de tensão quando polarizados diretamente. Essa queda de tensão é convertida em calor. Por isso, os drives de motor baseados no CI L298N requerem um grande dissipador.

Agora que já conhecemos as especificações e forma de funcionamento do driver ponte H L298N, vamos aprender como utilizá-la na prática. Neste tutorial, vamos usar o driver ponte H L298N para acionar e controlar dois motores DC com o Arduino.

MATERIAIS NECESSÁRIOS

ESQUEMÁTICO DE LIGAÇÃO

Certifique-se de que a sua placa Arduino esteja desligada antes de realizar a ligação. Em seguida, monte o circuito da Figura 4.

Imagem ilustrativa do circuito para controle de dois motores DC usando o driver ponte H L298N e o Arduino.
Figura 4: Circuito para controle de dois motores DC usando o driver ponte H L298N e o Arduino.

Ao montar o circuito observe atentamente os seguintes pontos:

  • Os motores utilizados neste tutorial podem ser alimentados com tensão entre 3V e 6V. Portanto, usaremos um suporte para quatro pilhas AA. No baterias, as pilhas estão ligadas em série, retornando uma tensão total de cerca de 6V quando completamente carregadas (1,5 V x 4 = 6 V);
  • Os motores DC não possuem polaridade. Conecte os fios de um dos motores aos pinos OUT1 e OUT2 e do outro aos pinos OUT3 e OUT4. A ordem dos fios dos motores não importam neste momento;
  • O Arduino será alimentado pelo driver ponte H L298N. Portanto, mantenha o jumper do regulador de tensão de 5V e conecte o pino 5V do driver ao 5V do Arduino;
  • Conecte os pinos de controle de direção IN1, IN2, IN3 e IN4 aos pinos digitais 9, 8, 7 e 6, respectivamente;
  • Os pinos de controle de velocidade ENA e ENB devem ser conectados aos pinos 10 e 5 do Arduino. Note que estes pinos estão habilitados para PWM;
  • O Aterramento (GND) do Arduino, da case e do driver ponte H devem estar conectados.

ELABORANDO O CÓDIGO

Após a montagem do circuito, vamos a programação do Sketch. O propósito deste projeto é usar o driver ponte H L298N para acionar e controlar dois motores DC com o Arduino. Utilizaremos o monitor serial para comandar a direção em que os motores devem girar, de modo que:

  • Quando o usuário digitar 1 no monitor serial, os motores devem ligar em uma direção;
  • Quando o usuário digitar 2 no monitor serial, os motores devem mudar a direção de rotação;
  • Quando o usuário digitar qualquer outro valor, os motores devem parar.

Acompanhe os passos a seguir para melhor compreensão da lógica de programação:

1. Declarar as variáveis

Iniciamos o programa declarando as variáveis. Utilizamos as variáveis ENA e ENB para representar os pinos de controle de velocidade dos motores A e B, respectivamente.

Em seguida, declaramos as variáveis IN1, IN2, IN3 e IN4 que controlarão a direção dos motores.

Declaramos também a variável direcao do tipo char, que será utilizada para armazenar o caractere que for escrito pelo usuário no monitor serial.

2. Inicialização da comunicação serial e configurações dos pinos

No setup() inicializamos a comunicação serial e definimos todos os pinos utilizados como saída (OUTPUT).

3. Verificar, receber e armazenar um caractere digitado no monitor serial

Inicializaremos a função loop() testando se algum caractere foi enviado ao monitor serial por meio da instrução if (Serial.available()). Uma vez satisfeita essa condição, o caractere será lido e armazenado na variável direcao através da instrução direcao = Serial.read();.

4. Verificar o caractere da variável direcao

Utilizaremos a estrutura de controle de fluxo de seleção switch…case para comparar o caractere armazenado na variável direcao aos caracteres especificados nos comandos cases. Quando o caractere armazenado for igual 1 a função ligar() será chamada e quando for igual a 2 a função mudar() será executada.

Caso não seja encontrado nenhum caractere correspondente ao case, o default será executado. Os caracteres especificados nos cases devem ser incluídos entre aspas simples (‘ ’).

5. Função ligar()

Para ligar os dois motores simultaneamente, colocamos os pinos IN1 e IN3 em nível lógico baixo (LOW) e os pinos IN2 e IN4 em nível lógico alto (HIGH).

Para que os motores se movam com metade de sua velocidade máxima usamos a função analogWrite(), passando como parâmetros os pinos ENA e ENB e o ciclo de trabalho PWM em 127 (metade da velocidade do motor).

6. Função mudar()

Para mudar a rotação dos dois motores simultaneamente, colocamos os pinos IN1 e IN3 em nível lógico alto (HIGH) e os pinos IN2 e IN4 em nível lógico baixo (LOW).

Para que os motores se movam com metade de sua velocidade máxima usamos a função analogWrite(), passando como parâmetros os pinos ENA e ENB e o ciclo de trabalho PWM em 127 (metade da velocidade do motor).

7. Função parar()

Para parar os dois motores simultaneamente, colocamos os pinos IN1, IN2, IN3 e IN4 em nível lógico baixo (LOW).

Ao final o código ficará da seguinte maneira:

/*
  - CONTROLE DE MOTOR DC COM DRIVER PONTE H L298N  -
  ==================================================
  == BLOG DA ROBOTICA - www.blogdarobotica.com ==
  ==================================================
  Autora: Carol Correia Viana
  E-mail: contato@blogdarobotica.com
  Facebook: facebook.com/blogdarobotica
  Instagram:@blogdarobotica
  YouTube: youtube.com/user/blogdarobotica
  ==================================================
*/

int ENA = 10; //Pino ENA da ponte H deve ser conectado ao pino 10 do Arduino
int IN1 = 9; //Pino IN1 da ponte H deve ser conectado ao pino 9 do Arduino
int IN2 = 8; //Pino IN2 da ponte H deve ser conectado ao pino 8 do Arduino
int IN3 = 7; //Pino IN3 da ponte H deve ser conectado ao pino 7 do Arduino
int IN4 = 6; //Pino IN4 da ponte H deve ser conectado ao pino 6 do Arduino
int ENB = 5; //Pino ENB da ponte H deve ser conectado ao pino 5 do Arduino

char direcao;

void setup() {

  Serial.begin(9600); //Inicializa a comunicação serial
  Serial.println("-- CONTROLE DE MOTORES DC COM DRIVER PONTE H L298N --");
  Serial.println("Digite: \n 1: para ligar os motores em uma direcao;\n 2: para mudar a direção; \n Qualquer outro valor: para parar os motores");

  pinMode(ENA, OUTPUT); //Define o pino ENA como um pino de saída
  pinMode(IN1, OUTPUT); //Define o pino IN1 como um pino de saída
  pinMode(IN2, OUTPUT); //Define o pino IN2 como um pino de saída
  pinMode(IN3, OUTPUT); //Define o pino IN3 como um pino de saída
  pinMode(IN4, OUTPUT); //Define o pino IN4 como um pino de saída
  pinMode(ENB, OUTPUT); //Define o pino ENB como um pino de saída
}

void loop() {

  if (Serial.available()) { //Se a serial receber qualquer valor maior que zero
    direcao = Serial.read(); //Armazena o dado recebido na serial
    Serial.println(direcao); //Imprime o valor recebido na serial

    switch (direcao) {
      case '1': //Se o valor recebido na serial for igual a 1
        ligar(); //Chama a função ligar
        break;

      case '2': //Se o valor recebido na serial for igual a 2
        mudar(); //Chama a função mudar
        break;

      default:  //Se o valor recebido na serial for igual a qualquer outro valor
        parar(); //Chama a função parar
        break;
    }
  }
}

void ligar() {
  //Liga o motor A em uma direção
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  //Liga o motor B em uma direção
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);

  //Velocidade para os motores:
  analogWrite(ENA, 127);
  analogWrite(ENB, 127);
  delay(5000);
}

void mudar() {
  //Muda a direção do motor A
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  //Muda a direção do motor B
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);

  //Velocidade para os motores:
  analogWrite(ENA, 127);
  analogWrite(ENB, 127);
  delay(5000);
}

void parar() {
  //Para parar o motor A:
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  //Para parar o motor B:
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delay(1000);
}

Após o upload, abra o monitor serial, digite o número 1 ou 2 e observe se os dois motores estão girando para a mesma direção. Caso alguma dos motores esteja girando no sentido contrário, inverta os fios de um deles.

Exemplo: Caso o motor conectado ao driver ponte H nos bornes identificados por OUT3 e OUT4 (motor B) esteja girando para trás inverta os fios, conforme Figura 5.

Imagem ilustrativa. Inverta os fios do motor B para que ambos girem na mesma direção simultaneamente..
Figura 5: Inverta os fios do motor B para que ambos girem na mesma direção simultaneamente.

Espero ter ajudado,

Obrigada a todos e em caso de dúvidas deixe seu comentário abaixo!

Att. Carol Correia Viana

Dúvidas? Deixe seu comentário

Carol Correia Viana

Bacharel em Engenharia Elétrica com ênfase em Eletrônica, mestra em Engenharia Industrial e especialista em Docência com ênfase em Educação Inclusiva. Atua no setor de Desenvolvimento de Produtos na Casa da Robótica. Editora chefe e articulista no Blog da Robótica. Fanática por livros, Star Wars e projetos Maker.

Deixe uma pergunta

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.