Componentes · 18 min de leitura

Shield de motores L293D com Arduino: AFMotor, 4 motores CC, motor de passo e servo

Como usar o shield de motores L293D: biblioteca AFMotor, jumper PWR, pinos livres, código de carrinho 4WD, motores de passo, servos, o limite de 0,6 A e soluções para motores que não giram.

O shield de motores L293D é uma placa driver de motores que se encaixa direto em cima de um Arduino Uno e permite controlar 4 motores CC, 2 motores de passo e 2 servos com uma única placa. Seus dois chips L293D fornecem a corrente de que os motores precisam, invertem o sentido de rotação e ajustam a velocidade com PWM, então você controla todos os motores de um carrinho robô de quatro rodas sem usar um único jumper. Quase todas as placas do mercado são cópias do antigo projeto Motor Shield V1 da Adafruit e são programadas com a mesma biblioteca: a AFMotor.

Neste guia você vai ver o que há no shield, quais pinos do Arduino ele usa e quais ficam livres para sensores, como funciona o confuso jumper PWR em três configurações de alimentação diferentes, os comandos da biblioteca AFMotor e o código completo de um carrinho robô de quatro rodas controlado pelo celular. Nas últimas seções falamos do limite de corrente de 0,6 A, do motivo de o chip esquentar, da comparação com o L298N e reunimos em uma única tabela todas as causas conhecidas de “meus motores não giram”.

Shield de motores L293D visto de cima: bornes M1–M4, conectores de servo e jumper de alimentação
Shield de motores L293D (projeto Adafruit V1): o 74HC595 no meio com um chip L293D de cada lado; bornes M1–M2 à esquerda, M3–M4 à direita, dois conectores de servo no canto superior esquerdo e, embaixo, o borne de alimentação externa e o jumper PWR.

O que é o shield de motores L293D e como ele funciona?

Para girar um motor CC nos dois sentidos, você precisa de um circuito de quatro chaves chamado ponte H; explicamos a ideia em detalhes em Controle de motor CC com L298N. O chip L293D contém duas pontes H e, como o shield tem dois desses chips, você ganha quatro canais de motor no total. O “D” no nome indica que os diodos de proteção, que absorvem os picos de tensão reversa gerados pelo motor ao desligar, estão embutidos no chip. O L293D também desliga as saídas sozinho quando superaquece.

O grande truque do shield é o registrador de deslocamento 74HC595 no meio. Cada um dos quatro motores precisa de dois sinais para o sentido e um para a velocidade, o que soma 12 pinos do Arduino. O shield envia os oito sinais de sentido em série para o 74HC595 e gasta apenas 4 pinos com eles (D4, D7, D8, D12), mais 4 pinos PWM para a velocidade (D3, D5, D6, D11). Esse projeto economiza pinos, mas tem um preço: você não consegue controlar os motores diretamente com digitalWrite; é preciso uma biblioteca que envie os bits de sentido para o registrador. Essa biblioteca é a AFMotor.

CaracterísticaValor
Chips driver2 × L293D (4 pontes H no total)
Controle de sentidoRegistrador de deslocamento 74HC595 (D4, D7, D8, D12)
Tensão de alimentação dos motores4,5–25 V (borne de alimentação externa)
Corrente por canal0,6 A contínua, 1,2 A de pico muito curto
Controle de velocidadePWM de 8 bits, setSpeed(0–255)
Motores que controla4 motores CC, 2 motores de passo ou 2 CC + 1 de passo
Servos2, alimentados pela linha de 5 V do Arduino (D9 e D10)
ProteçãoDiodos embutidos, desligamento térmico
Placas compatíveisArduino Uno R3 e Mega 2560 (Uno R4 e Leonardo não são suportados)

O que há na placa? Bornes, conectores e jumper

ParteFunção
Borne M1 e M2 (esquerda)Motores CC 1 e 2; o parafuso GND do meio é para o fio comum de um motor de passo unipolar
Borne M3 e M4 (direita)Motores CC 3 e 4, ou porta de motor de passo 2
EXT_PWR (+M e GND)Entrada de alimentação dos motores: pack de pilhas ou fonte
Jumper PWRQuando encaixado, liga a alimentação dos motores à linha Vin do Arduino
SER1 e SERVO_2Dois conectores de servo (−, +, S); D10 e D9
LED PWRMostra se há alimentação nos motores; se estiver apagado, os motores não giram
Botão RESETUma cópia do botão de reset do Arduino em cima do shield
Fileira A0–A5Pinos analógicos livres; na maioria das placas há também fileiras de +5V e GND ao lado

Quais pinos o shield usa e quais ficam livres?

Pino do ArduinoFunção no shieldQuando fica ocupado?
D3Velocidade do M2 (PWM, Timer2)Quando o M2 ou o motor de passo 1 é usado
D4Clock do 74HC595 (CLK)Quando qualquer motor CC ou de passo é usado
D5Velocidade do M4 (PWM, Timer0)Quando o M4 ou o motor de passo 2 é usado
D6Velocidade do M3 (PWM, Timer0)Quando o M3 ou o motor de passo 2 é usado
D7Habilitação de saída do 74HC595 (EN)Quando qualquer motor é usado
D8Entrada de dados do 74HC595 (DATA)Quando qualquer motor é usado
D9Sinal do SERVO_2 (Timer1)Só quando esse servo é usado
D10Sinal do SER1 (Timer1)Só quando esse servo é usado
D11Velocidade do M1 (PWM, Timer2)Quando o M1 ou o motor de passo 1 é usado
D12Latch do 74HC595 (LATCH)Quando qualquer motor é usado
D0, D1Não usados (linha serial USB)Durante o carregamento e enquanto o Monitor Serial está aberto
D2Não usado; há uma pequena ilha de solda na placaNunca
D13Não usado, mas não fica acessível em cima do shieldNunca
A0–A5 (D14–D19)Não usados; ficam em uma fileira na bordaNunca

Os seis pinos analógicos livres são mais que suficientes para sensores, porque os pinos A0–A5 do Uno também funcionam como pinos digitais 14–19 quando necessário. Uma distribuição prática seria: um sensor de distância HC-SR04 ou um módulo Bluetooth via SoftwareSerial em A0 e A1, sensores seguidores de linha ou de obstáculo em A2 e A3, e o barramento I2C (OLED, LCD, MPU6050) em A4 e A5. Para um encoder de roda ou um botão que use attachInterrupt(), o D2 é o único pino livre; o outro pino de interrupção do Uno, o D3, é o pino de velocidade do M2. Se você não usar servos, D9 e D10 também ficam livres. Você pode ver a disposição dos pinos da sua placa na ferramenta Pinagem e o que cada pino faz em Pinagem do Arduino Uno.

Com o shield encaixado, não use D3–D8, D11 nem D12 para mais nada no seu código. Se você ligar o pino trig do HC-SR04 no D7 ou um LED no D12, por exemplo, os dados enviados ao 74HC595 se corrompem e os motores mudam de sentido aleatoriamente. Além disso, o sinal de velocidade do M1 e do M2 vem do Timer2: a função tone() e a biblioteca IRremote no Uno também usam o Timer2, então, enquanto elas estão em uso, o controle de velocidade do M1 e do M2 deixa de funcionar.

Alimentação e jumper PWR: três formas corretas de ligar

O borne EXT_PWR de dois parafusos, na borda inferior da placa, é a entrada de alimentação dos motores; o lado positivo costuma estar marcado como “+M” ou “+” e o negativo como “GND”. O jumper PWR logo ao lado liga essa linha dos motores ao pino Vin do Arduino. Com o jumper encaixado, as duas placas funcionam com uma única fonte: a tensão que você aplica no EXT_PWR também alimenta o Arduino pelo Vin, ou uma fonte ligada ao conector DC do Arduino também alimenta os motores. Sem o jumper, as duas linhas ficam totalmente separadas. O LED PWR da placa só acende quando há alimentação nos motores; é a primeira coisa a verificar antes de começar a procurar defeitos nos motores.

ConfiguraçãoAlimentação do ArduinoAlimentação dos motoresJumper PWR
Fonte única (bateria ou fonte de 7–12 V)A mesma fonte, pelo VinEXT_PWR ou o conector DC do ArduinoEncaixado
Arduino pela USB, motores pela bateriaCabo USBEXT_PWRRemovido
Duas fontes separadas (a mais segura)Conector DC ou USBEXT_PWRRemovido

A escolha mais comum em carrinhos robô é a fonte única: você liga um pack de duas células 18650 no EXT_PWR, encaixa o jumper, e tanto o Arduino quanto os motores funcionam com a mesma bateria. É simples, mas quando os motores puxam muita corrente na partida, a tensão da bateria pode cair por um instante e o Arduino pode reiniciar. Se isso acontecer, remover o jumper e alimentar o Arduino por uma fonte separada (um power bank, a USB ou uma fonte de 9 V) resolve de vez. Na bancada, a segunda configuração é a mais prática: o Arduino continua ligado ao computador, os motores funcionam com bateria e o jumper fica removido.

O borne EXT_PWR não tem diodo de proteção contra polaridade invertida; ligar a bateria invertida destrói o shield na hora e, muito provavelmente, o Arduino também. Com o jumper encaixado, nunca ligue fontes separadas ao mesmo tempo no conector DC e no EXT_PWR, ou você vai colocar as duas fontes em curto. E nunca aplique a alimentação dos motores no pino 5V do Arduino.

Qual bateria escolher? Dependendo da corrente, os transistores de saída do L293D “engolem” cerca de 1,5–2,6 V, então o motor recebe esse tanto a menos que a tensão da bateria. Para os motores TT amarelos de 3–6 V dos kits de robótica, duas células de lítio 18650 (7,4 V nominais, 8,4 V com carga completa) são ideais: os motores recebem cerca de 5,5–6 V e, com o jumper encaixado, o regulador do Arduino também trabalha com folga. Quatro pilhas AA (6 V) deixam apenas uns 4 V para os motores e não bastam para alimentar o Arduino pelo Vin. Uma bateria de 9 V (tipo quadrada) não fornece mais que algumas centenas de miliampères; os motores ou nem giram ou a bateria acaba em minutos. Você pode estimar a duração com a ferramenta Autonomia da bateria e ler sobre todas as opções de alimentação em Como alimentar o Arduino com bateria.

Instalando a biblioteca AFMotor

  1. Abra o Gerenciador de Bibliotecas na Arduino IDE (Ferramentas > Gerenciar Bibliotecas ou Ctrl+Shift+I).
  2. Digite Adafruit Motor Shield na caixa de busca. Aparecem dois resultados: Adafruit Motor Shield library, cuja descrição diz “V1 firmware”, e Adafruit Motor Shield V2 Library.
  3. Para o shield com L293D, instale a da V1. A biblioteca V2 é para uma placa completamente diferente, que se comunica por I2C e usa chips TB6612.
  4. Adicione a linha #include <AFMotor.h> no início do seu sketch.
  5. Se quiser, abra Arquivo > Exemplos > Adafruit Motor Shield library > MotorTest e teste a placa com um motor no M1.
Se aparecer AFMotor.h: No such file or directory ao compilar, ou a biblioteca não foi instalada ou você instalou a V2 por engano; o arquivo de cabeçalho da V2 se chama Adafruit_MotorShield.h e não funciona com a placa L293D. Para outros problemas na instalação de bibliotecas, veja Como instalar uma biblioteca no Arduino.

Primeiro sketch: girando um motor CC para frente, para trás e em velocidades diferentes

Prenda os dois fios do motor nos dois parafusos externos do borne M1 e deixe o parafuso GND do meio livre. Ligue o pack de baterias no EXT_PWR, conecte o Arduino ao computador pela USB e remova o jumper PWR (a segunda configuração acima). Se o LED PWR estiver aceso, carregue o código abaixo: o motor primeiro acelera e desacelera suavemente, depois gira para trás por dois segundos e para.

C++ (Arduino IDE)
1#include <AFMotor.h>                  // Adafruit Motor Shield V1 kütüphanesi / library
2
3AF_DCMotor motor(1);                  // M1 klemensi / M1 terminal
4
5void setup() {
6  Serial.begin(9600);
7  Serial.println(F("L293D motor testi / motor test"));
8  motor.setSpeed(200);                // 0–255; bunu unutursan motor dönmez / skip this and the motor won't turn
9  motor.run(RELEASE);                 // başlangıçta dur / start stopped
10}
11
12void loop() {
13  motor.run(FORWARD);                 // ileri / forward
14  for (int s = 60; s <= 255; s++) {   // yavaşça hızlan / ramp up
15    motor.setSpeed(s);
16    delay(10);
17  }
18  for (int s = 255; s >= 60; s--) {   // yavaşça yavaşla / ramp down
19    motor.setSpeed(s);
20    delay(10);
21  }
22  motor.run(RELEASE);                 // dur / stop
23  delay(500);
24
25  motor.setSpeed(180);
26  motor.run(BACKWARD);                // geri / backward
27  delay(2000);
28  motor.run(RELEASE);
29  delay(1000);
30}
ComandoO que faz
AF_DCMotor motor(1); (motor no M1)Cria o motor do borne M1; aceita um número de 1 a 4
AF_DCMotor motor(1, MOTOR12_64KHZ); (com frequência)Também escolhe a frequência PWM do M1 e do M2
motor.setSpeed(200); (velocidade)Define a velocidade de 0 a 255 (0 para, 255 é velocidade máxima)
motor.run(FORWARD); (para frente)Gira para frente
motor.run(BACKWARD); (para trás)Gira para trás
motor.run(RELEASE); (soltar)Deixa de acionar o motor; o motor para
motor.run(BRAKE); (frear)Definido na biblioteca, mas não faz nada na V1

A velocidade é ajustada ligando e desligando a alimentação do motor milhares de vezes por segundo; os detalhes estão em O que é PWM?. Como o M1 e o M2 usam o Timer2, você pode escolher a frequência deles: MOTOR12_64KHZ, MOTOR12_8KHZ (o padrão), MOTOR12_2KHZ e MOTOR12_1KHZ. Com 64 kHz o zumbido do motor fica inaudível, mas o L293D esquenta mais nessa frequência. Já o M3 e o M4 estão ligados ao Timer0; como esse timer também faz funcionar millis() e delay(), a biblioteca não mexe na frequência dele, e esses dois canais sempre funcionam a cerca de 1 kHz.

O erro mais comum é esquecer o setSpeed(). A biblioteca define a velocidade como 0 ao criar o motor, então, mesmo que você escreva run(FORWARD), o motor não se mexe sem uma velocidade. Além disso, a maioria dos motores TT zumbe mas não gira abaixo de 80–100, então comece com 100–120 ou mais.

Código do carrinho robô de quatro rodas (4WD)

Motor CC TT amarelo com redução e roda
O motor TT amarelo com redução dos kits de robótica: funciona com 3–6 V, consome cerca de 150 mA sem carga e mais de 1 A quando travado.

O uso favorito do shield de motores L293D é o carrinho robô de quatro rodas, porque cada um dos quatro motores tem seu próprio borne e não há bagunça de fios. Esses carrinhos não têm direção; eles viram como um tanque: se as duas rodas da esquerda giram para um lado e as duas da direita para o outro, o carrinho gira no lugar. Por isso o código não controla os motores um a um, mas em dois grupos, o lado esquerdo e o lado direito. Para o controle pelo celular, ligamos um módulo Bluetooth HC-05 nos pinos livres A0 e A1 com SoftwareSerial; o módulo é explicado em detalhes em módulo Bluetooth HC-05.

ParteLigação
Motor dianteiro esquerdoM1
Motor traseiro esquerdoM2
Motor traseiro direitoM3
Motor dianteiro direitoM4
HC-05 TXDA0 (SoftwareSerial RX)
HC-05 RXDA1, por um divisor de tensão de 1 kΩ + 2 kΩ (5 V → 3,3 V)
HC-05 VCC e GNDA fileira de +5V e GND do shield
2 × células 18650 (7,4 V)EXT_PWR (+M e GND), jumper PWR encaixado
C++ (Arduino IDE)
1#include <AFMotor.h>
2#include <SoftwareSerial.h>
3
4AF_DCMotor frontLeft(1);              // M1: sol ön / front left
5AF_DCMotor rearLeft(2);               // M2: sol arka / rear left
6AF_DCMotor rearRight(3);              // M3: sağ arka / rear right
7AF_DCMotor frontRight(4);             // M4: sağ ön / front right
8
9SoftwareSerial bt(A0, A1);            // RX = A0 (HC-05 TXD), TX = A1 (HC-05 RXD, bölücüyle / via a divider)
10
11int speed = 200;                      // 0–255 arası sürüş hızı / driving speed 0–255
12
13void setSide(AF_DCMotor &a, AF_DCMotor &b, int value) {   // -255 … 255
14  uint8_t dir = value > 0 ? FORWARD : (value < 0 ? BACKWARD : RELEASE);
15  uint8_t pwm = constrain(abs(value), 0, 255);
16  a.setSpeed(pwm);
17  b.setSpeed(pwm);
18  a.run(dir);
19  b.run(dir);
20}
21
22void drive(int left, int right) {     // sol ve sağ taraf / left and right side
23  setSide(frontLeft, rearLeft, left);
24  setSide(frontRight, rearRight, right);
25}
26
27void setup() {
28  Serial.begin(9600);                 // hata ayıklama / debugging
29  bt.begin(9600);                     // HC-05 varsayılan hızı / default baud rate
30  drive(0, 0);
31}
32
33void loop() {
34  if (!bt.available()) return;
35  char c = bt.read();
36  Serial.println(c);
37
38  switch (c) {
39    case 'F': drive(speed, speed);        break;   // ileri / forward
40    case 'B': drive(-speed, -speed);      break;   // geri / backward
41    case 'L': drive(-speed, speed);       break;   // yerinde sola / spin left
42    case 'R': drive(speed, -speed);       break;   // yerinde sağa / spin right
43    case 'G': drive(speed / 3, speed);    break;   // ileri-sola kavis / curve forward-left
44    case 'I': drive(speed, speed / 3);    break;   // ileri-sağa kavis / curve forward-right
45    case 'S': drive(0, 0);                break;   // dur / stop
46    case 'q': speed = 255;                break;   // tam hız / full speed
47    default:
48      if (c >= '0' && c <= '9') speed = map(c - '0', 0, 9, 90, 240);   // hız kademesi / speed step
49  }
50}

O coração do código é a função drive(left, right): ela recebe um valor de -255 a 255 para cada lado, em que positivo significa para frente, negativo para trás e zero parar. A setSide() dá aos dois motores de um mesmo lado a mesma velocidade e o mesmo sentido. Os comandos são as letras únicas enviadas por apps do tipo “Arduino Bluetooth RC Car” das lojas de aplicativos: F para frente, B para trás, L e R giram no lugar, G e I fazem curvas, S para. O controle deslizante de velocidade do app envia um dígito de 0 a 9; o código o converte em um valor PWM entre 90 e 240 e, como o limite inferior é 90, os motores ainda conseguem partir na posição mais baixa. Se uma roda girar ao contrário, não mexa no código; troque os dois fios desse motor no borne. Para a montagem do chassi e uma versão com dois motores, veja Como fazer um carrinho robô com Arduino.

O pino RXD do HC-05 funciona com 3,3 V; não ligue nele o sinal TX de 5 V do Arduino sem reduzi-lo com um divisor de tensão. Além disso, se a conexão cair, o carrinho continua com o último comando; você pode adicionar facilmente uma regra de segurança com millis() que chame drive(0, 0) quando tiver passado 1 segundo desde a última letra.

Controlando motores de passo: 28BYJ-48 e NEMA 17

O shield consegue controlar dois motores de passo ao mesmo tempo: a porta de passo 1 usa os bornes M1 e M2 e a porta 2 usa M3 e M4. Com um motor bipolar (4 fios, como um NEMA 17), você liga uma bobina no M1 e a outra no M2. Com um motor unipolar (5 ou 6 fios), as duas bobinas também vão no M1 e no M2, e o fio comum vai no parafuso GND do meio do borne. Para o popular 28BYJ-48, a ligação é: fios azul e amarelo no M1, fios rosa e laranja no M2 e o fio comum vermelho no GND. O uso desse motor com a placa ULN2003 está em O que é motor de passo?.

Tipo de passoComo funcionaQuando usar
SINGLE (simples)Uma bobina é energizada por vezMenor corrente, menor torque
DOUBLE (duplo)Duas bobinas são energizadas juntasTorque maior; a escolha mais comum
INTERLEAVE (intercalado)Alterna bobina simples e dupla (meio passo)O dobro de resolução, rotação mais suave
MICROSTEP (micropasso)As correntes das bobinas variam gradualmente com PWM; cada passo completo é dividido em 16Rotação lenta e silenciosa; o torque cai

O 28BYJ-48 é um motor de 5 V; para este teste, alimente os motores com 4 pilhas AA (6 V), remova o jumper e alimente o Arduino pela USB. Por causa da caixa de redução dentro do motor, uma volta equivale a 2048 passos completos:

C++ (Arduino IDE)
1#include <AFMotor.h>
2
3// 28BYJ-48: tam adımda tur başına 2048 adım / 2048 full steps per revolution
4AF_Stepper stepper(2048, 1);          // 1 = M1 + M2, 2 = M3 + M4
5
6void setup() {
7  stepper.setSpeed(10);               // dakikada 10 tur / 10 RPM
8}
9
10void loop() {
11  stepper.step(2048, FORWARD, DOUBLE);       // bir tur ileri, güçlü tork / one turn forward, more torque
12  delay(500);
13  stepper.step(4096, BACKWARD, INTERLEAVE);  // yarım adımla bir tur geri / one turn back in half steps
14  stepper.release();                         // bobinleri kapat, ısınmasın / de-energise the coils
15  delay(1000);
16}

O setSpeed() define as rotações por minuto; por causa da caixa de redução, o 28BYJ-48 não gira mais rápido que cerca de 10–15 RPM. O ponto de atenção é que o step() é bloqueante: até o motor terminar os passos pedidos, o loop() não faz mais nada. Se você quiser ler sensores ou controlar motores CC enquanto o motor de passo gira, use a função onestep() da biblioteca junto com a biblioteca AccelStepper; o exemplo AFMotor_ConstantSpeed que vem com a biblioteca mostra exatamente isso. Chamar release() enquanto o motor espera desliga as bobinas e evita o aquecimento, mas nesse meio-tempo o eixo perde o torque de retenção.

A maioria dos motores NEMA 17 consome 1,5–2 A por bobina e tem resistência de bobina em torno de 1,5–3 Ω. Como o L293D não tem limitação de corrente, esses motores ultrapassam várias vezes o limite do canal quando ligados em 12 V, e o chip se desliga em poucos segundos. Com o shield L293D, use apenas motores de passo com resistência de bobina alta, que consumam menos de 0,4 A em 12 V; para NEMA 17 mais potentes, um driver A4988 é a escolha certa.

Ligando servos: os conectores SER1 e SERVO_2

Os dois conectores de três pinos no canto do shield são para servos. Pelas marcações na placa, os pinos são − (GND), + (5 V) e S (sinal): o fio marrom do servo vai no −, o vermelho no + e o laranja no S. Pelo esquema do circuito da placa, o conector SER1 está ligado ao D10 e o SERVO_2 ao D9 (algumas fontes trazem os números invertidos; se o servo não se mexer, tente o outro pino no código). Os servos são controlados com a biblioteca Servo padrão, e o Timer1 que ela usa no Uno não conflita com os timers dos motores, então motores CC e servos funcionam juntos sem problemas.

Os servos não são alimentados pela bateria dos motores, e sim pela linha de 5 V do Arduino. Para um SG90 isso não é problema, mas servos grandes como o MG996R podem consumir mais de 1 A em movimento; o regulador do Arduino esquenta, a tensão despenca e a placa reinicia. Com servos grandes, encaixe só o fio de sinal no conector, alimente o + e o − do servo por uma fonte separada de 5–6 V e una os GNDs. Os detalhes estão em Servo MG996R com Arduino e O que é servo motor?. O código abaixo faz o servo do SER1 varrer de um lado para o outro enquanto o motor do M3 gira:

C++ (Arduino IDE)
1#include <AFMotor.h>
2#include <Servo.h>
3
4AF_DCMotor motor(3);                  // M3 klemensi / M3 terminal
5Servo servo1;                         // SER1 başlığı / SER1 header
6
7void setup() {
8  servo1.attach(10);                  // SER1 = D10, SERVO_2 = D9
9  motor.setSpeed(170);
10  motor.run(FORWARD);                 // motor dönerken servo tarar / servo sweeps while the motor runs
11}
12
13void loop() {
14  for (int a = 20; a <= 160; a += 2) {   // sağa tara / sweep right
15    servo1.write(a);
16    delay(15);
17  }
18  for (int a = 160; a >= 20; a -= 2) {   // sola tara / sweep left
19    servo1.write(a);
20    delay(15);
21  }
22}

Limite de corrente (0,6 A) e aquecimento

A linha mais importante do datasheet do L293D é 0,6 A contínua e 1,2 A de pico por canal. O valor de pico vale só para pulsos muito curtos; se um motor puxa 1 A por segundos, o chip sofre. Uma conta simples mostra por que ele esquenta: o L293D é um driver antigo, com transistores bipolares, e a 0,6 A ele tipicamente perde 1,4 V no transistor de cima e 1,2 V no de baixo. Ou seja, quando um motor consome 0,6 A, são produzidos 0,6 A × 2,6 V ≈ 1,6 W de calor no chip; dois motores no mesmo chip produzem o dobro, cerca de 3 W. Um pequeno chip DIP sem dissipador não consegue se livrar desse calor, a temperatura sobe rápido e, no fim, o desligamento térmico corta as saídas. O sintoma é conhecido: os motores funcionam por um tempo, param e voltam a girar quando o chip esfria.

Os motores TT amarelos consomem cerca de 150 mA sem carga e 200–300 mA andando no chão, o que está dentro dos limites do shield. O problema são os momentos em que uma roda empurra um obstáculo ou o carrinho gira no lugar: um motor TT travado pode puxar 1–1,5 A, e em um carrinho 4WD os quatro motores fazem força ao mesmo tempo durante um giro no lugar. Para descobrir a corrente real do seu motor, ligue um multímetro em série com o motor e meça enquanto segura a roda com a mão por um instante; Como usar o multímetro mostra como fazer. Para manter o shield frio:

  • Use partida suave: não pule de 0 para 255; aumente a velocidade gradualmente ao longo de 200–300 ms, e a corrente de partida cai bastante.
  • Não trave o motor: em robôs que desviam de obstáculos, pare o carrinho antes que ele bata no obstáculo; um motor travado é o que mais gera calor.
  • Cole dissipadores nos chips: pequenos dissipadores de alumínio com fita térmica reduzem um pouco a temperatura do L293D.
  • Solde um segundo L293D: a própria Adafruit observa que dá para soldar um segundo L293D em cima dos chips existentes, perna com perna, para aumentar a capacidade de corrente; os dois chips dividem a corrente.
  • Não use mais tensão que o necessário: aplicar 12 V em motores de 6 V aumenta tanto a corrente quanto o calor.
  • Troque para o driver certo: se o seu motor consome continuamente mais de 0,6 A, use um driver baseado no L298N ou no TB6612FNG.

Shield de motores L293D ou L298N?

Módulo driver de motor duplo L298N
Módulo L298N: duas pontes H em um único chip, um dissipador grande e 2 A por canal; é ligado com fios, então serve em qualquer placa.
CaracterísticaShield de motores L293DMódulo L298N
Número de motores4 CC, ou 2 de passo + 2 servos2 CC ou 1 de passo
Corrente por canal0,6 A contínua, 1,2 A de pico2 A contínua, 3 A de pico
Tensão dos motores4,5–25 V5–35 V
Queda de tensãoCerca de 1,5–2,6 VCerca de 2–3 V
LigaçãoEncaixa no Uno, sem fiosJumpers; você escolhe os pinos
Pinos usados8 pinos fixos + D9 e D10 para servos6 pinos (ENA, IN1–IN4, ENB)
BibliotecaAFMotor obrigatóriaNão precisa (digitalWrite, analogWrite)
ESP32 e PicoNão serveFunciona direto
Ideal paraCarrinhos 4WD com motores TT, kits de aprendizadoMotores mais fortes, robôs 2WD

Resumindo: se você está montando um carrinho 4WD com motores TT em um Arduino Uno, o shield L293D reduz a fiação ao mínimo e reúne os quatro motores em uma só placa. Se seus motores são mais fortes, sua placa é um ESP32 ou um Pico, ou escolher os pinos é importante para você, o L298N é mais flexível; os detalhes estão em Controle de motor CC com L298N. Se quiser algo mais eficiente que os dois, o TB6612FNG, baseado em MOSFET, tem queda de tensão muito baixa e faz suas baterias durarem mais. Comparamos qual tipo de motor serve para cada tarefa em Diferença entre motor CC, servo e motor de passo.

Dá para usar com ESP32, Raspberry Pi Pico ou Mega?

Funciona bem com o Arduino Mega 2560: o shield se encaixa nos primeiros pinos digitais e analógicos do Mega, e a AFMotor conhece os timers do Mega. Não funciona com Uno R4, Leonardo, ESP32 nem Raspberry Pi Pico, porque a AFMotor escreve diretamente nos registradores de timer do ATmega328P e do ATmega2560. Com um ESP32 selecionado, a compilação para com 'DC_MOTOR_PWM_RATE' was not declared in this scope e, com um Leonardo selecionado, para com #error "This chip is not supported!". Placas ESP32 no formato do Uno (como a ESPDuino-32) encaixam fisicamente no shield, mas os números dos pinos e o nível de sinal de 3,3 V são diferentes. Nessas placas é muito mais fácil usar um L298N, um TB6612FNG ou um único chip L293D no lugar do shield. As entradas do L293D consideram HIGH qualquer valor acima de 2,3 V, então ele funciona direto com placas de 3,3 V:

Pino do L293DFunçãoRaspberry Pi PicoESP32
1 (1,2EN)Velocidade (PWM)GP15GPIO 25
2 (1A)Sentido 1GP14GPIO 26
7 (2A)Sentido 2GP13GPIO 27
3 e 6 (1Y, 2Y)Terminais do motorAo motorAo motor
4, 5, 12, 13GND (o calor também sai por esses pinos)GNDGND
16 (VCC1)Alimentação lógica, 5 VVBUS (pino 40)5V (VIN)
8 (VCC2)Alimentação dos motoresPositivo da bateriaPositivo da bateria
MicroPython
1from machine import Pin, PWM
2import time
3
4en = PWM(Pin(15))                 # L293D pin 1 (1,2EN): hız / speed
5en.freq(1000)
6in1 = Pin(14, Pin.OUT)            # L293D pin 2 (1A): yön / direction
7in2 = Pin(13, Pin.OUT)            # L293D pin 7 (2A): yön / direction
8
9def motor(speed):                 # -100 … 100
10    in1.value(1 if speed > 0 else 0)
11    in2.value(1 if speed < 0 else 0)
12    en.duty_u16(int(abs(speed) * 655.35))
13
14while True:
15    motor(80)                     # ileri / forward
16    time.sleep(2)
17    motor(0)                      # dur / stop
18    time.sleep(0.5)
19    motor(-60)                    # geri / backward
20    time.sleep(2)
21    motor(0)
22    time.sleep(0.5)

Os GNDs do Pico e da bateria precisam estar ligados. No ESP32 você monta a mesma lógica na linguagem do Arduino: sentido com digitalWrite e velocidade com analogWrite nos pinos da tabela. Se essas placas são novidade para você, comece por O que é ESP32? e O que é Raspberry Pi Pico?.

Motores que não giram: erros comuns e soluções

SintomaCausa provávelSolução
Nenhum motor gira, LED PWR apagadoSem alimentação nos motores: EXT_PWR vazio ou só a USB conectadaLigue uma bateria de 6–12 V no EXT_PWR; os motores não giram enquanto o LED não acender
LED aceso, código carregado, mas o motor não se mexeFalta setSpeed() no código, ou o número do motor não corresponde ao borneAdicione setSpeed(200) no setup(); confira se AF_DCMotor(1) corresponde ao M1
O motor zumbe mas não giraValor de PWM baixo demais ou bateria fracaComece acima de 100; carregue a bateria ou use duas células 18650
“AFMotor.h: No such file or directory” (arquivo não encontrado)Biblioteca não instalada, ou a V2 instalada no lugarInstale a Adafruit Motor Shield library V1 pelo Gerenciador de Bibliotecas
“This chip is not supported!” ou erro “DC_MOTOR_PWM_RATE”Uno R4, Leonardo ou ESP32 selecionado como placaSelecione Uno ou Mega em Ferramentas > Placa
O Arduino reinicia quando os motores partemA corrente de partida derruba a tensão da bateria (brownout)Remova o jumper e alimente o Arduino separadamente; solde um capacitor de 100 nF nos terminais do motor
O motor gira um tempo e para, chip muito quenteO desligamento térmico do L293D entrou em açãoReduza a carga, use partida suave, adicione dissipadores ou passe para um L298N
Os motores mudam de sentido aleatoriamenteD4, D7, D8 ou D12 está sendo usado para outra coisa no códigoPasse seus sensores para A0–A5
A velocidade do M1 e do M2 não muda, M3 e M4 normaistone() ou IRremote está usando o Timer2Passe esses motores para M3 e M4 ou remova o código conflitante
Uma roda gira ao contrárioFios do motor invertidos no borneTroque os dois fios desse motor
A placa se comporta de forma estranha com o shield encaixadoO conector USB do Uno encosta nas soldas embaixo do shield, ou um pino está tortoCole fita isolante em cima do conector USB, endireite os pinos e encaixe o shield de novo
O jeito mais rápido de encontrar o problema é reduzir o teste à forma mais simples: deixe de lado todo o sketch do carrinho, ligue um único motor no M1, confira se o LED PWR está aceso e carregue o primeiro sketch acima. Se funcionar, o problema está no seu código, não no shield; se não funcionar, comece pela alimentação e pela biblioteca. Todos os motivos de o Arduino ficar reiniciando estão em Arduino reiniciando sozinho?.

Ideias de projetos com o shield de motores L293D

  • Carrinho 4WD controlado por Bluetooth: um robô com tração nas quatro rodas que você dirige pelo celular com o código acima.
  • Robô que desvia de obstáculos: um carrinho que faz a varredura à frente com um HC-SR04 montado no servo do SER1 e vira para a direção mais livre; o guia completo está em Robô que desvia de obstáculos com Arduino.
  • Robô seguidor de linha: siga uma linha preta no chão com sensores infravermelhos em A0–A3; o ajuste do PID está em Robô seguidor de linha com Arduino.
  • Slider de câmera: mova uma câmera lentamente sobre um trilho com um motor de passo e grave vídeos em time-lapse.
  • Cabeça pan-tilt: ligue dois servos nos dois conectores de servo e aponte uma câmera ou um laser em dois eixos; para mais servos, veja Braço robótico com Arduino.
  • Cortina automática ou esteira transportadora: abra e feche uma cortina com um motor CC conforme a luz, ou monte uma pequena esteira transportadora.

Este é o resumo para usar corretamente o shield de motores L293D: instale a biblioteca V1, confira o LED PWR, ajuste o jumper conforme a sua configuração de alimentação, não esqueça o setSpeed(), ligue os sensores em A0–A5 e mantenha seus motores abaixo do limite de 0,6 A. Seguindo essas regras, um pequeno shield dá conta sozinho de toda a força de um robô de quatro motores. No app BlueGrays você encontra os projetos de carrinho controlado por Bluetooth, robô que desvia de obstáculos, motor de passo e servo passo a passo, com esquemas do circuito e códigos.

Perguntas frequentes

Quantos motores o shield de motores L293D consegue controlar?

O shield controla 4 motores CC ao mesmo tempo, cada um de forma independente, para frente, para trás e em velocidades diferentes. No lugar dos motores CC você também pode ligar 2 motores de passo (os pares M1–M2 e M3–M4), ou 2 motores CC mais 1 de passo. Além disso, há dois conectores de servo; os servos são controlados pelos pinos D9 e D10, independentemente dos motores.

Para que serve o jumper PWR do shield de motores L293D?

Com o jumper encaixado, a alimentação dos motores do shield é ligada à linha Vin do Arduino e as duas placas funcionam com uma única fonte. Se você alimentar o Arduino pela USB e os motores por uma bateria separada, precisa remover o jumper. Ligar fontes separadas ao mesmo tempo no conector DC e no EXT_PWR com o jumper encaixado coloca as duas fontes em curto.

Que bateria devo usar com o shield de motores L293D?

Para carrinhos robô com motores TT, a melhor escolha são duas células de lítio 18650 (7,4 V); como o L293D perde cerca de 2 V, os motores recebem 5,5–6 V. Quatro pilhas AA deixam só uns 4 V para os motores, e uma bateria de 9 V (tipo quadrada) não fornece corrente suficiente para movê-los. Atenção à polaridade ao ligar a bateria no EXT_PWR, porque o borne não tem proteção contra polaridade invertida.

Como resolver “AFMotor.h: No such file or directory”?

Esse erro significa que a biblioteca AFMotor não está instalada. Busque Adafruit Motor Shield no Gerenciador de Bibliotecas e instale a Adafruit Motor Shield library cuja descrição menciona V1. A biblioteca V2 é para outra placa e não contém o arquivo AFMotor.h.

Quanta corrente o shield de motores L293D aguenta e por que ele esquenta?

Cada canal fornece 0,6 A de forma contínua e 1,2 A em picos muito curtos. Como os transistores do L293D perdem cerca de 2,6 V a 0,6 A, são gerados perto de 1,5 W de calor por motor; por isso o chip esquenta e se desliga quando o limite é ultrapassado. Evite que os motores travem e, para motores que consomem continuamente mais de 0,6 A, use um driver mais forte, como o L298N.

O que é melhor: o shield de motores L293D ou o L298N?

Se você está montando um carrinho 4WD com motores TT em um Arduino Uno, o shield L293D é mais prático, porque encaixa direto sem fios e tem quatro canais de motor. Se você usa motores mais fortes, um ESP32 ou um Pico, ou quer escolher os pinos, o L298N, com 2 A por canal, é mais adequado. Os dois perdem cerca de 2 V da tensão dos motores.

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
Uso do motor de passo
#67Intermediário
Premium

Uso do motor de passo

Um motor que gira passo a passo, exatamente o quanto você quer, como o ponteiro de um relógio. Por meio de uma placa de acionamento, o Arduino gira um pequeno motor de passo uma volta completa em uma

4.5(31)
42
Servo motor de 360 graus com motor de passo
#68Intermediário
Premium

Servo motor de 360 graus com motor de passo

Ensine um motor de passo comum a ir até qualquer ângulo que você quiser, ao longo de uma volta completa. O Arduino calcula quantos passos correspondem a cada ângulo; o motor vai para 0, 90, 45, 180, 1

4.5(22)
32
Uso de servo motor
#35Iniciante
Premium

Uso de servo motor

O braço de um pequeno servo motor gira para três posições em sequência: o início, o meio e o fim do percurso, esperando dois segundos em cada parada. O Arduino informa ao motor em qual ângulo ficar, e

4.7(48)
67
Uso de servo motor com potenciômetro
#36Iniciante
Premium

Uso de servo motor com potenciômetro

Conforme você gira o botão do potenciômetro, o braço do servo motor gira junto: uma extremidade do botão corresponde a zero grau, e a outra, a meia volta. O Arduino lê continuamente a posição do botão

4.6(37)
52
Controle de LED pelo celular via Bluetooth
#34Iniciante
Premium

Controle de LED pelo celular via Bluetooth

Um pequeno ensaio para acender e apagar as luzes do seu quarto pelo celular. O módulo Bluetooth repassa ao Arduino as letras enviadas pelo celular; uma letra acende o LED vermelho, outra acende o verd

4.8(68)
89
Detecção de superfícies pretas e brancas com TCRT5000
#78Intermediário
Premium

Detecção de superfícies pretas e brancas com TCRT5000

Com o pequeno sensor que funciona como o olho dos robôs seguidores de linha, você identifica se o piso é preto ou branco. O TCRT5000 emite luz invisível em direção ao piso e verifica quanto dela é ref

4.7(40)
49