Componentes · 6 min de leitura

Controle de motor CC com o L298N: velocidade e sentido com Arduino

Como funciona o driver de motor L298N? A ideia da ponte H, os pinos ENA, IN1 e IN2, o jumper de 5V e a ligação da alimentação, velocidade com PWM, troca de sentido, código de carrinho robô com dois motores e uso no ESP32 e no Pico.

Os motores CC são os motores mais comuns: giram ventiladores, rodas de robôs, bombas d'água e carrinhos de brinquedo. Mas você não pode ligar um motor direto em um pino do Arduino: ele puxa muito mais corrente do que o pino consegue fornecer, e mudar o sentido de giro exige inverter a polaridade. O driver de motor L298N resolve os dois problemas de uma vez: ele gira dois motores CC para a frente e para trás de forma independente e define a velocidade deles com PWM. Você o encontra em quase todo projeto de carrinho robô.

Módulo driver de motor duplo L298N
Driver de motor L298N: embaixo do dissipador preto fica o chip L298N, com duas pontes H; os terminais dos motores ficam nas laterais, e os pinos de alimentação e de controle na frente.

Como funciona um motor CC e por que ele precisa de um driver?

Aplique uma tensão nos dois terminais de um motor CC e ele gira; inverta a polaridade e ele gira para o outro lado; diminua a tensão e ele desacelera. Até um pequeno motor de brinquedo puxa centenas de miliampères enquanto gira, e mais de 1 ampère na partida ou travado. E, como o motor é uma bobina, ele gera picos de tensão reversa quando desliga. Um pino do Arduino fornece no máximo 20–40 mA e não é protegido contra esses picos; ligar o motor direto queima o pino e pode até danificar a placa.

O que é uma ponte H?

O jeito de girar um motor nos dois sentidos é uma ponte H: quatro chaves eletrônicas dispostas em volta do motor no formato da letra "H". Quando duas chaves em diagonal fecham, a corrente passa pelo motor em um sentido; quando o outro par em diagonal fecha, ela passa no sentido contrário. O chip L298N tem duas pontes H dessas, então ele controla dois motores de forma independente. Cada motor usa dois pinos de sentido (IN1 e IN2) e um pino de velocidade (ENA):

IN1IN2ENAO que o motor faz
HIGHLOWHIGH ou PWMGira para a frente
LOWHIGHHIGH ou PWMGira para trás
HIGHHIGHHIGHFreia e para rápido
QualquerQualquerLOWGira livre e desacelera sozinho

Especificações do L298N

CaracterísticaValor
Tensão de alimentação dos motores5–35 V (máx. 12 V com o jumper de 5V colocado)
Corrente por canal2 A contínuos, 3 A de pico
Tensão lógica5 V (as entradas também reconhecem um sinal de 3,3 V)
Queda de tensãoCerca de 1,5–3 V (o motor recebe isso a menos)
Motores que aciona2 motores CC ou 1 motor de passo bipolar
ProteçãoDiodos de roda livre na placa
Conjunto de motor CC com redução e roda
O motor CC amarelo com redução e a roda usados em carrinhos robô: a caixa de engrenagens reduz a velocidade e aumenta o torque; ele funciona com 3–6 V.

Pinos do L298N e ligação da alimentação

Pino ou terminalFunção
OUT1, OUT2Os dois fios do motor A
OUT3, OUT4Os dois fios do motor B
12V (VS)Alimentação dos motores: positivo da bateria ou do adaptador
GNDTerra comum: o negativo da bateria e o GND do Arduino vão aqui
5VSaída de 5 V com o jumper de 5V colocado, entrada da alimentação lógica com ele retirado
ENA, ENBEntradas de velocidade (PWM); com os jumpers colocados, o motor sempre gira na velocidade máxima
IN1, IN2, IN3, IN4Entradas de sentido
O negativo da bateria, o GND do L298N e o GND do Arduino precisam estar todos ligados entre si; sem um terra comum, os sinais de controle não significam nada. Se a alimentação dos motores passar de 12 V, retire o jumper de 5V da placa e forneça 5 V separados no pino 5V. Nunca alimente motores pelo pino 5V do Arduino.

Girando um motor para a frente, para trás e em velocidades diferentes

Primeiro retire o jumper do ENA e ligue o ENA no pino D9 do Arduino, o IN1 no D8 e o IN2 no D7. Ligue o motor no OUT1 e no OUT2, e um pacote de 2 × células 18650 (7,4 V) ou 4–6 pilhas AA nos terminais 12V e GND; leve o GND também até o GND do Arduino. A função motor() abaixo recebe um valor de -255 a 255: positivo significa para a frente, negativo para trás e zero freio. A ideia por trás do controle de velocidade está em O que é PWM?

C++ (Arduino IDE)
1const int ENA = 9;    // hız (PWM) / speed (PWM)
2const int IN1 = 8;
3const int IN2 = 7;
4
5void motor(int speed) {              // -255 … 255
6  if (speed == 0) {                  // fren / brake
7    digitalWrite(IN1, HIGH);
8    digitalWrite(IN2, HIGH);
9    analogWrite(ENA, 255);
10    return;
11  }
12  digitalWrite(IN1, speed > 0);      // ileri ya da geri / forward or backward
13  digitalWrite(IN2, speed < 0);
14  analogWrite(ENA, abs(speed));
15}
16
17void setup() {
18  pinMode(ENA, OUTPUT);
19  pinMode(IN1, OUTPUT);
20  pinMode(IN2, OUTPUT);
21}
22
23void loop() {
24  motor(200);   delay(2000);   // ileri / forward
25  motor(0);     delay(500);    // dur / stop
26  motor(-120);  delay(2000);   // yavaşça geri / slowly backward
27  motor(0);     delay(500);
28}
A maioria dos motores zumbe em vez de girar com valores baixos de PWM; normalmente eles precisam de um valor em torno de 80–120 para começar a se mover. Parar o motor por um instante antes de trocar o sentido e aumentar a velocidade aos poucos, e não de uma vez, reduzem os picos de corrente e protegem as engrenagens.

Um carrinho robô com dois motores: frente, trás, esquerda e direita

Os carrinhos robô não têm direção; eles fazem curvas girando as duas rodas com velocidades e sentidos diferentes. Se os dois motores giram para a frente, o carrinho anda reto; se o motor esquerdo gira para trás e o direito para a frente, o carrinho gira para a esquerda no próprio lugar. A função drive() abaixo recebe a velocidade de cada motor separadamente, de -255 a 255:

C++ (Arduino IDE)
1// Sol motor / left motor: ENA=9, IN1=8, IN2=7 — Sağ motor / right motor: ENB=10, IN3=5, IN4=4
2const int ENA = 9, IN1 = 8, IN2 = 7;
3const int ENB = 10, IN3 = 5, IN4 = 4;
4
5void drive(int left, int right) {            // her biri -255 … 255 / each -255 … 255
6  digitalWrite(IN1, left >= 0);  digitalWrite(IN2, left < 0);
7  digitalWrite(IN3, right >= 0); digitalWrite(IN4, right < 0);
8  analogWrite(ENA, abs(left));
9  analogWrite(ENB, abs(right));
10}
11
12void setup() {
13  int pins[] = {ENA, IN1, IN2, ENB, IN3, IN4};
14  for (int p : pins) pinMode(p, OUTPUT);
15}
16
17void loop() {
18  drive(200, 200);   delay(1500);   // ileri / forward
19  drive(-200, 200);  delay(600);    // sola dön / turn left
20  drive(200, -200);  delay(600);    // sağa dön / turn right
21  drive(-180, -180); delay(1000);   // geri / backward
22  drive(0, 0);       delay(1000);   // dur / stop
23}

Coloque um sensor de distância na frente do carrinho e você tem um robô que para e vira quando vê um obstáculo; para a parte do sensor, veja Sensor de distância HC-SR04. Se você for usar a biblioteca Servo em um Uno, cuidado: ela desativa o PWM nos pinos 9 e 10, então passe o ENA e o ENB para os pinos 5 e 6.

L298N com o ESP32 e o Raspberry Pi Pico

As entradas do L298N tratam qualquer coisa acima de cerca de 2,3 V como HIGH, então elas funcionam direto com os sinais de 3,3 V do ESP32 e do Pico; a alimentação lógica da placa ainda deve ser de 5 V. No ESP32, você pode usar o mesmo código do Arduino com pinos que tenham PWM para o ENA e o ENB (por exemplo, GPIO 25 e 26); os pinos 34–39 não têm saída. No Pico com MicroPython, controlar um motor fica assim:

MicroPython
1from machine import Pin, PWM
2import time
3
4ena = PWM(Pin(15), freq=1000)
5in1 = Pin(14, Pin.OUT)
6in2 = Pin(13, Pin.OUT)
7
8def motor(speed):                   # -100 … 100
9    in1.value(speed > 0)
10    in2.value(speed < 0)
11    ena.duty_u16(int(abs(speed) * 655.35))
12
13while True:
14    motor(80);  time.sleep(2)       # ileri / forward
15    motor(0);   time.sleep(0.5)     # dur / stop
16    motor(-50); time.sleep(2)       # geri / backward

L298N, TB6612FNG ou MOSFET?

DriverVantagensDesvantagensIdeal para
L298NBarato, robusto, 2 A por canalPerde cerca de 2 V, esquenta, é grandeRobôs de hobby, motores de 6–12 V
TB6612FNGPequeno, eficiente (MOSFET), compatível com 3,3 V1,2 A contínuos, máx. 13,5 VRobôs pequenos com bateria
L9110SMuito pequeno e baratoCerca de 800 mA por canalMinimotores
Um único MOSFET (como o IRLZ44N)Muito eficiente, corrente altaUm só sentidoVentiladores, bombas, fitas de LED

Se você só precisa ligar e desligar um motor, um relé resolve, mas ele não ajusta a velocidade; comparamos os dois em O que é módulo relé? Para escolher um transistor ou MOSFET adequado, dê uma olhada na ferramenta Transistores.

Ideias de projetos com L298N

  • Robô que desvia de obstáculos: um carrinho que vê obstáculos com um HC-SR04 e muda de direção.
  • Carrinho controlado por Bluetooth: um robô pilotado por um HC-05 com um app no celular.
  • Carrinho controlado por joystick: transforme os dois eixos de um joystick nas velocidades de dois motores; detalhes em Como usar um módulo joystick.
  • Robô seguidor de linha: um carrinho que segue uma linha preta no chão com sensores infravermelhos.
  • Cortina automática: um sistema motorizado que abre a cortina quando a luz chega de manhã e fecha à noite.
  • Esteira transportadora: uma pequena esteira com a velocidade ajustada por um potenciômetro.

Erros comuns e como resolvê-los

  • O LED da placa acende, mas o motor não gira: os terras não estão ligados entre si, o jumper do ENA foi retirado mas o pino não está ligado, ou o valor de PWM está baixo demais.
  • O Arduino reinicia quando o motor gira: o motor e o Arduino dividem uma fonte fraca; alimente-os separadamente e solde um capacitor de 100 nF nos terminais do motor.
  • O motor fica muito lento e fraco: o L298N engole cerca de 2 V; aumente a tensão da bateria (por exemplo, 2 × 18650) ou use um driver mais eficiente.
  • O motor só gira para um lado: um dos pinos IN não está ligado, ou o código escreve os mesmos valores para os dois sentidos.
  • O L298N esquenta muito: o motor puxa corrente demais; deixe o dissipador livre e, se precisar, escolha um driver mais robusto.
  • Usar uma bateria de 9 V (PP3): ela não fornece corrente alta e descarrega rápido; use um pacote recarregável de 18650 ou de pilhas AA.

Depois que você aprende a controlar motores com o L298N, a porta para os projetos de robôs se abre. No app BlueGrays você encontra projetos de carrinho com L298N controlado por Bluetooth e de robô que desvia de obstáculos passo a passo, com esquemas do circuito e código.

Perguntas frequentes

Quantos motores o L298N consegue acionar?

Como o L298N tem duas pontes H, ele aciona dois motores CC de forma independente, para a frente e para trás e em velocidades diferentes. Usando os dois canais juntos, ele também aciona um motor de passo bipolar.

Para que serve o jumper de 5V do L298N?

Com o jumper colocado, o regulador da placa gera 5 V a partir da alimentação dos motores para alimentar o chip; você também pode usar esses 5 V para alimentar o Arduino. Se a alimentação dos motores passar de 12 V, o regulador pode superaquecer, então retire o jumper e forneça 5 V separados no pino 5V.

Que bateria devo ligar no L298N?

Para motores pequenos de 6–9 V, 2 células de lítio 18650 (7,4 V) ou 6 pilhas AA (9 V) são uma boa escolha. Como o L298N perde cerca de 2 V, escolha uma fonte um pouco acima da tensão nominal do motor. Baterias de 9 V (PP3) não fornecem corrente suficiente para acionar motores.

Por que retirar o jumper do ENA?

Com o jumper do ENA colocado, o motor sempre gira na velocidade máxima. Para ajustar a velocidade, retire o jumper e ligue o pino ENA em um dos pinos PWM do Arduino; aí você define a velocidade de 0 a 255 com analogWrite.

Por que meu motor não gira em velocidades baixas?

Um motor precisa de uma tensão mínima para vencer o atrito e começar a se mover, e a queda de tensão do L298N dificulta isso. Normalmente, quando o valor de PWM cai abaixo de 80–120, o motor só zumbe. Defina uma velocidade mínima no código ou use uma fonte de tensão mais alta.

O L298N funciona com o ESP32 e o Raspberry Pi Pico?

Sim. Os pinos de entrada do L298N reconhecem um sinal de 3,3 V como HIGH, então ele pode ser ligado direto no ESP32 e no Pico. O lado lógico da placa ainda deve ser alimentado com 5 V, e todos os terras precisam estar ligados entre si.

Ver todos os projetos
Carrinho controlado por Bluetooth com L298N
#80Avançado
Premium

Carrinho controlado por Bluetooth com L298N

Transforme seu celular em um controle remoto e dirija seu próprio carrinho robô. O Arduino recebe os comandos de um aplicativo de controle remoto no celular por meio de um módulo Bluetooth e aciona as

5.0(38)
65
Robô que desvia de obstáculos
#81Avançado
Premium

Robô que desvia de obstáculos

Que tal construir um veículo inteligente que encontra seu próprio caminho? O robô que desvia de obstáculos monitora o ambiente constantemente com o sensor ultrassônico na parte da frente. Ao encontrar

5.0(38)
49
Controle de servos com joystick
#60Intermediário
Premium

Controle de servos com joystick

Controle dois motores com um joystick, como ao girar uma câmera de segurança. Empurre a alavanca para os lados e o servo motor inferior gira lentamente; mova para cima ou para baixo e o servo superior

4.7(42)
58
Servo motor com ESP32 (controle por potenciômetro)
#118Intermediário
Premium

Servo motor com ESP32 (controle por potenciômetro)

Neste projeto, controlamos um servo motor SG90 com um potenciômetro. Ajustamos o ângulo do servo mapeando o valor analógico lido do potenciômetro para a faixa de 0 a 180 graus. A biblioteca ESP32Servo gera sinais para o servo nos GPIOs do ESP32 adequados e capazes de operar como saída; este projeto usa o GPIO 18. Esse é um método básico de controle para braços robóticos, estabilizadores de câmera e mecanismos de portas automáticas.

4.3(29)
42
Controle de LEDs com joystick
#59Intermediário
Premium

Controle de LEDs com joystick

Empurre a alavanca do joystick até o fim em qualquer direção e o LED correspondente acende: são quatro cores diferentes para direita, esquerda, cima e baixo. Ao soltar a alavanca, ela volta ao centro

4.7(50)
67
Medidor ultrassônico de distância HC-SR04 com ESP32
#116Intermediário

Medidor ultrassônico de distância HC-SR04 com ESP32

O sensor ultrassônico HC-SR04 calcula a distância medindo o tempo que a onda sonora emitida leva para atingir um objeto e retornar (tempo de voo). Neste projeto, enviaremos um pulso de 10 microssegundos do ESP32 ao pino TRIG do sensor e leremos a duração do eco no pino ECHO com pulseIn(). Exibiremos a distância calculada em centímetros em um LCD I2C 16x2. Como o HC-SR04 opera a 5V, é preciso usar um divisor de tensão no pino ECHO; caso contrário, o GPIO de 3,3V do ESP32 será danificado.

4.9(28)
45
Sensor de estacionamento com ESP32 (HC-SR04 + barra de 5 LEDs + buzzer + OLED)
#142Avançado
Premium

Sensor de estacionamento com ESP32 (HC-SR04 + barra de 5 LEDs + buzzer + OLED)

A versão com ESP32 do sensor de estacionamento de carro! Usamos o sensor ultrassônico HC-SR04 para medir a distância até o objeto à sua frente. Conforme a distância diminui, a barra de 5 LEDs vai se preenchendo (verde → amarelo → vermelho) e o intervalo entre os bipes do buzzer diminui. Quando o objeto chega muito perto (menos de 10 cm), o alarme soa continuamente e todos os LEDs acendem.

0.0(0)
14
Medição de distância com HC-SR04 (Monitor Serial)
#27Iniciante

Medição de distância com HC-SR04 (Monitor Serial)

O sensor HC-SR04 funciona como um morcego que se orienta no escuro: emite um som que você não consegue ouvir, escuta o eco e mede a distância até o objeto à sua frente. O Arduino escreve essa distânci

4.6(46)
71