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).

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.

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.

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.

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
- 1x Placa UNO SMD R3 Atmega328 compatível com Arduino UNO;
- 1 x Cabo USB Tipo A-B compatível com Arduino UNO;
- 1 x Driver ponte H dupla L298N;
- 2 x Motores DC 3-6V com caixa de redução;
- 1 x Suporte para 4 pilhas AA;
- 4 x Pilhas AA 1,5V;
- Jumpers macho-macho;
- Jumpers macho-fêmea.
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.

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.

Espero ter ajudado,
Obrigada a todos e em caso de dúvidas deixe seu comentário abaixo!
Att. 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.