Componentes · 18 min de lectura

Shield L293D para Arduino: AFMotor, 4 motores, paso a paso, servo

Cómo usar el shield L293D: librería AFMotor, jumper PWR, pines libres, coche 4WD, paso a paso, servos, límite de 0,6 A y qué hacer si los motores no giran.

El shield L293D (L293D motor shield) es una placa controladora de motores que se encaja directamente sobre un Arduino Uno y te permite manejar 4 motores DC, 2 motores paso a paso y 2 servos desde una sola placa. Sus dos chips L293D entregan la corriente que necesitan los motores, invierten su sentido de giro y regulan su velocidad con PWM, así que puedes controlar todos los motores de un coche robot de cuatro ruedas sin un solo cable jumper. Casi todas las placas del mercado son copias del antiguo Motor Shield V1 de Adafruit y se programan con la misma librería: AFMotor.

En esta guía verás qué lleva el shield, qué pines del Arduino ocupa y cuáles quedan libres para sensores, cómo funciona el confuso jumper PWR en tres formas de alimentación distintas, los comandos de la librería AFMotor y el código completo de un coche robot de cuatro ruedas que manejas desde el móvil. En las últimas secciones explicamos el límite de corriente de 0,6 A, por qué se calienta el chip, en qué se diferencia del L298N y todas las causas conocidas de "los motores no giran" en una sola tabla.

Shield L293D visto desde arriba: borneras M1–M4, conectores de servo y jumper de alimentación
Shield L293D (diseño Adafruit V1): el 74HC595 en el centro y un L293D a cada lado; borneras M1–M2 a la izquierda y M3–M4 a la derecha, dos conectores de servo arriba a la izquierda y, abajo, la bornera de alimentación externa y el jumper PWR.

¿Qué es el shield L293D y cómo funciona?

Para que un motor DC gire en los dos sentidos hace falta un circuito de cuatro interruptores llamado puente H; explicamos la idea con detalle en Control de motores DC con el L298N. El chip L293D contiene dos puentes H y, como el shield lleva dos de estos chips, tienes cuatro canales de motor en total. La "D" del nombre indica que los diodos de protección que absorben los picos de tensión inversa que genera un motor al apagarse están integrados en el chip. Además, el L293D desactiva sus salidas por sí solo cuando se sobrecalienta.

El verdadero truco del shield es el registro de desplazamiento 74HC595 del centro. Cada uno de los cuatro motores necesita dos señales de sentido y una de velocidad, lo que suma 12 pines del Arduino. El shield envía las ocho señales de sentido en serie al 74HC595 y solo gasta 4 pines en ellas (D4, D7, D8, D12), más 4 pines PWM para la velocidad (D3, D5, D6, D11). Este diseño ahorra pines, pero tiene un precio: no puedes mover los motores directamente con digitalWrite, necesitas una librería que cargue los bits de sentido en el registro. Esa librería es AFMotor.

CaracterísticaValor
Chips controladores2 × L293D (4 puentes H en total)
Control de sentidoRegistro de desplazamiento 74HC595 (D4, D7, D8, D12)
Tensión de los motores4,5–25 V (bornera de alimentación externa)
Corriente por canal0,6 A continua, 1,2 A de pico muy breve
Control de velocidadPWM de 8 bits, setSpeed(0–255)
Motores que puede mover4 motores DC, 2 paso a paso o 2 DC + 1 paso a paso
Servos2, alimentados desde la línea de 5 V del Arduino (D9 y D10)
ProtecciónDiodos integrados, apagado por sobretemperatura
Placas compatiblesArduino Uno R3 y Mega 2560 (Uno R4 y Leonardo no son compatibles)

¿Qué hay en la placa? Borneras, conectores y jumper

PiezaFunción
Bornera M1 y M2 (izquierda)Motores DC 1 y 2; el tornillo GND del centro es para el cable común de un paso a paso unipolar
Bornera M3 y M4 (derecha)Motores DC 3 y 4, o el puerto 2 de paso a paso
EXT_PWR (+M y GND)Entrada de alimentación de los motores: pilas o adaptador
Jumper PWRPuesto, une la alimentación de los motores con la línea Vin del Arduino
SER1 y SERVO_2Dos conectores de servo (−, +, S); D10 y D9
LED PWRIndica si hay alimentación para los motores; si está apagado, no giran
Botón RESETCopia del botón de reinicio del Arduino encima del shield
Fila A0–A5Pines analógicos libres; en la mayoría de las placas hay filas de +5V y GND al lado

¿Qué pines usa el shield y cuáles quedan libres?

Pin del ArduinoFunción en el shield¿Cuándo está ocupado?
D3Velocidad de M2 (PWM, Timer2)Al usar M2 o el paso a paso 1
D4Reloj del 74HC595 (CLK)Al usar cualquier motor DC o paso a paso
D5Velocidad de M4 (PWM, Timer0)Al usar M4 o el paso a paso 2
D6Velocidad de M3 (PWM, Timer0)Al usar M3 o el paso a paso 2
D7Habilitación de salidas del 74HC595 (EN)Al usar cualquier motor
D8Entrada de datos del 74HC595 (DATA)Al usar cualquier motor
D9Señal de SERVO_2 (Timer1)Solo si se usa ese servo
D10Señal de SER1 (Timer1)Solo si se usa ese servo
D11Velocidad de M1 (PWM, Timer2)Al usar M1 o el paso a paso 1
D12Latch del 74HC595 (LATCH)Al usar cualquier motor
D0, D1No se usan (línea serie USB)Al subir código y con el monitor serie abierto
D2No se usa; hay un pequeño punto de soldadura en la placaNunca
D13No se usa, pero no está accesible encima del shieldNunca
A0–A5 (D14–D19)No se usan; salen en fila por el bordeNunca

Los seis pines analógicos libres sobran para sensores, porque A0–A5 del Uno también funcionan como pines digitales 14–19 cuando hace falta. Un reparto práctico sería: un sensor de distancia HC-SR04 o un módulo Bluetooth por SoftwareSerial en A0 y A1, sensores de línea u obstáculos en A2 y A3, y el bus I2C (OLED, LCD, MPU6050) en A4 y A5. Para un encoder de rueda o un pulsador con attachInterrupt(), el único pin libre es D2; el otro pin de interrupción del Uno, D3, es el pin de velocidad de M2. Si no usas servos, D9 y D10 también quedan libres. Puedes ver el patillaje de tu placa en la herramienta Pinout y qué hace cada pin en Pines del Arduino Uno.

Con el shield puesto, no uses D3–D8, D11 ni D12 para otra cosa en tu código. Si conectas, por ejemplo, el trig del HC-SR04 a D7 o un LED a D12, los datos que van al 74HC595 se corrompen y los motores cambian de sentido al azar. Además, la señal de velocidad de M1 y M2 sale del Timer2: la función tone() y la librería IRremote también usan el Timer2 en el Uno, así que mientras funcionan se estropea el control de velocidad de M1 y M2.

Alimentación y jumper PWR: tres formas correctas de conectarlo

La bornera de dos tornillos EXT_PWR del borde inferior de la placa es la entrada de alimentación de los motores; el positivo suele estar marcado como "+M" o "+" y el negativo como "GND". El jumper PWR que está justo al lado une esta línea de motores con el pin Vin del Arduino. Con el jumper puesto, las dos placas se alimentan de una sola fuente: la tensión que metes por EXT_PWR también alimenta el Arduino a través de Vin, o un adaptador enchufado en el conector DC del Arduino alimenta también los motores. Sin el jumper, las dos líneas quedan totalmente separadas. El LED PWR de la placa solo se enciende cuando llega alimentación a los motores; es lo primero que debes revisar antes de pelearte con los motores.

ConfiguraciónAlimentación del ArduinoAlimentación de los motoresJumper PWR
Una sola fuente (pilas o adaptador de 7–12 V)La misma fuente, a través de VinEXT_PWR o el conector DC del ArduinoPuesto
Arduino por USB, motores con pilasCable USBEXT_PWRQuitado
Dos fuentes separadas (la más segura)Conector DC o USBEXT_PWRQuitado

En los coches robot lo más habitual es una sola fuente: conectas un pack de dos pilas 18650 a EXT_PWR, pones el jumper y tanto el Arduino como los motores funcionan con la misma batería. Es sencillo, pero cuando los motores arrancan y tiran de mucha corriente, la tensión de la batería puede caer un instante y el Arduino reiniciarse. Si te pasa, la solución definitiva es quitar el jumper y alimentar el Arduino con otra fuente (una power bank, el USB o un adaptador de 9 V). Para hacer pruebas en la mesa, la segunda configuración es la más práctica: el Arduino sigue conectado al ordenador, los motores van con pilas y el jumper está quitado.

La bornera EXT_PWR no tiene diodo de protección contra inversión de polaridad; conectar la batería al revés destruye el shield al instante y muy probablemente también el Arduino. Con el jumper puesto, nunca conectes fuentes separadas al conector DC y a EXT_PWR a la vez, porque cortocircuitarías las dos fuentes. Y nunca lleves la alimentación de los motores al pin 5V del Arduino.

¿Qué batería elegir? Según la corriente, los transistores de salida del L293D se comen unos 1,5–2,6 V, así que el motor recibe esa tensión menos que la batería. Para los motores TT amarillos de 3–6 V de los kits de robótica, dos pilas de litio 18650 (7,4 V nominales, 8,4 V con carga completa) son ideales: los motores reciben unos 5,5–6 V y, con el jumper puesto, el regulador del Arduino también trabaja holgado. Cuatro pilas AA (6 V) dejan solo unos 4 V a los motores y no bastan para alimentar el Arduino por Vin. Una pila de 9 V no da más de unos cientos de miliamperios: los motores no giran o la pila se agota en minutos. Puedes calcular la autonomía con la calculadora de duración de batería y leer todas las opciones de alimentación en Alimentar Arduino con pilas.

Instalar la librería AFMotor

  1. Abre el Gestor de librerías en el Arduino IDE (Herramientas > Gestionar bibliotecas o Ctrl+Mayús+I).
  2. Escribe Adafruit Motor Shield en el buscador. Aparecen dos resultados: Adafruit Motor Shield library, con "V1 firmware" en la descripción, y Adafruit Motor Shield V2 Library.
  3. Para el shield L293D instala la V1. La librería V2 es para una placa totalmente distinta que se comunica por I2C y usa chips TB6612.
  4. Añade la línea #include <AFMotor.h> al principio de tu sketch.
  5. Si quieres, abre Archivo > Ejemplos > Adafruit Motor Shield library > MotorTest y prueba la placa con un motor en M1.
Si al compilar aparece AFMotor.h: No such file or directory, o la librería no está instalada o instalaste la V2 por error; el archivo de cabecera de la V2 se llama Adafruit_MotorShield.h y no funciona con la placa L293D. Para otros problemas al instalar librerías, consulta Cómo instalar una librería en Arduino.

Primer programa: mover un motor DC hacia delante, hacia atrás y a distintas velocidades

Atornilla los dos cables del motor a los dos tornillos exteriores de la bornera M1 y deja libre el tornillo GND del centro. Conecta el pack de pilas a EXT_PWR, enchufa el Arduino al ordenador por USB y quita el jumper PWR (la segunda configuración de arriba). Si el LED PWR está encendido, sube el código de abajo: el motor primero acelera y frena suavemente, luego gira hacia atrás dos segundos y se detiene.

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}
ComandoQué hace
AF_DCMotor motor(1);Crea el motor de la bornera M1; admite números del 1 al 4
AF_DCMotor motor(1, MOTOR12_64KHZ);Además elige la frecuencia PWM de M1 y M2
motor.setSpeed(200);Fija la velocidad de 0 a 255 (0 parado, 255 a tope)
motor.run(FORWARD);Gira hacia delante
motor.run(BACKWARD);Gira hacia atrás
motor.run(RELEASE);Deja de mover el motor; el motor se para
motor.run(BRAKE);Está definido en la librería, pero en la V1 no hace nada

La velocidad se regula encendiendo y apagando la alimentación del motor miles de veces por segundo; los detalles están en ¿Qué es PWM?. Como M1 y M2 usan el Timer2, puedes elegir su frecuencia: MOTOR12_64KHZ, MOTOR12_8KHZ (por defecto), MOTOR12_2KHZ y MOTOR12_1KHZ. A 64 kHz deja de oírse el pitido del motor, pero el L293D se calienta más. M3 y M4, en cambio, dependen del Timer0; como ese temporizador también mueve millis() y delay(), la librería no toca su frecuencia y estos dos canales siempre trabajan a 1 kHz aproximadamente.

El error más común es olvidar setSpeed(). La librería pone la velocidad a 0 al crear el motor, así que aunque escribas run(FORWARD) el motor no se moverá sin una velocidad. Además, la mayoría de los motores TT zumban pero no giran por debajo de 80–100, así que arráncalos con 100–120 o más.

Código del coche robot de cuatro ruedas (4WD)

Motor DC TT con reductora y rueda
El motor TT amarillo con reductora de los kits de robótica: funciona con 3–6 V, consume unos 150 mA en vacío y más de 1 A cuando se bloquea.

El uso favorito del shield L293D es un coche robot de cuatro ruedas, porque cada uno de los cuatro motores tiene su propia bornera y no hay lío de cables. Estos coches no tienen dirección; giran como un tanque: si las dos ruedas izquierdas giran en un sentido y las dos derechas en el otro, el coche gira sobre sí mismo. Por eso el código no controla los motores uno a uno, sino en dos grupos: lado izquierdo y lado derecho. Para manejarlo desde el móvil conectamos un módulo Bluetooth HC-05 a los pines libres A0 y A1 con SoftwareSerial; el módulo se explica a fondo en Módulo Bluetooth HC-05.

PiezaConexión
Motor delantero izquierdoM1
Motor trasero izquierdoM2
Motor trasero derechoM3
Motor delantero derechoM4
HC-05 TXDA0 (RX de SoftwareSerial)
HC-05 RXDA1, a través de un divisor de tensión de 1 kΩ + 2 kΩ (5 V → 3,3 V)
HC-05 VCC y GNDLa fila de +5V y GND del shield
2 pilas 18650 (7,4 V)EXT_PWR (+M y GND), jumper PWR puesto
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}

El corazón del código es la función drive(izquierda, derecha): recibe un valor de -255 a 255 para cada lado; positivo es hacia delante, negativo hacia atrás y cero parado. setSide() da la misma velocidad y sentido a los dos motores de un lado. Los comandos son las letras sueltas que envían las apps tipo "Arduino Bluetooth RC Car" de las tiendas de aplicaciones: F adelante, B atrás, L y R giro sobre sí mismo, G e I curva, S parar. El deslizador de velocidad de la app envía un dígito del 0 al 9; el código lo convierte en un valor PWM entre 90 y 240 y, como el mínimo es 90, los motores arrancan incluso en el nivel más bajo. Si una rueda gira al revés, no cambies el código: intercambia los dos cables de ese motor en su bornera. Para el montaje del chasis y una versión de dos motores, mira Cómo hacer un coche robot con Arduino.

El pin RXD del HC-05 trabaja a 3,3 V; no le conectes la señal TX de 5 V del Arduino sin bajarla con un divisor de tensión. Además, si se corta la conexión, el coche sigue con la última orden; con millis() puedes añadir fácilmente una regla de seguridad que llame a drive(0, 0) cuando haya pasado un segundo desde la última letra.

Controlar motores paso a paso: 28BYJ-48 y NEMA 17

El shield puede mover dos motores paso a paso a la vez: el puerto 1 usa las borneras M1 y M2 y el puerto 2 usa M3 y M4. En un motor bipolar (4 cables, como un NEMA 17) conectas una bobina a M1 y la otra a M2. En un motor unipolar (5 o 6 cables) las dos bobinas también van a M1 y M2, y el cable común va al tornillo GND del centro de la bornera. Para el popular 28BYJ-48 la conexión es: cables azul y amarillo a M1, rosa y naranja a M2, y el cable común rojo a GND. Cómo usar este motor con la placa ULN2003 lo explicamos en ¿Qué es un motor paso a paso?.

Tipo de pasoCómo funcionaCuándo usarlo
SINGLESe activa una sola bobina cada vezMenor consumo, menor par
DOUBLESe activan dos bobinas a la vezMás par; la opción más habitual
INTERLEAVEAlterna una y dos bobinas (medio paso)El doble de resolución, giro más suave
MICROSTEPLas corrientes de bobina cambian poco a poco con PWM; cada paso completo se divide en 16Giro lento y silencioso; baja el par

El 28BYJ-48 es un motor de 5 V; para esta prueba alimenta los motores con 4 pilas AA (6 V), quita el jumper y alimenta el Arduino por USB. Por la reductora interna, una vuelta son 2048 pasos 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}

setSpeed() fija las revoluciones por minuto; por su reductora, el 28BYJ-48 no pasa de unas 10–15 rpm. Lo que debes tener en cuenta es que step() es bloqueante: hasta que el motor termina los pasos pedidos, loop() no hace nada más. Si quieres leer sensores o mover motores DC mientras gira el paso a paso, usa la función onestep() de la librería junto con la librería AccelStepper; el ejemplo AFMotor_ConstantSpeed que trae la librería muestra justo eso. Llamar a release() mientras el motor espera apaga las bobinas y evita que se caliente, pero el eje pierde su par de retención mientras tanto.

La mayoría de los motores NEMA 17 consumen 1,5–2 A por bobina y tienen una resistencia de bobina de 1,5–3 Ω. Como el L293D no limita la corriente, al conectarlos a 12 V superan con creces el límite del canal y el chip se apaga en pocos segundos. Con el shield L293D usa solo motores paso a paso de alta resistencia que consuman menos de 0,4 A a 12 V; para los NEMA 17 potentes, el driver A4988 es la opción correcta.

Conectar servos: los conectores SER1 y SERVO_2

Los dos conectores de tres pines de la esquina del shield son para servos. Según las marcas de la placa, los pines son − (GND), + (5 V) y S (señal): el cable marrón del servo va a −, el rojo a + y el naranja a S. Según el esquema de la placa, SER1 está conectado a D10 y SERVO_2 a D9 (algunas fuentes indican los números al revés; si el servo no se mueve, prueba el otro pin en el código). Los servos se controlan con la librería estándar Servo, y el Timer1 que usa en el Uno no choca con los temporizadores de los motores, así que los motores DC y los servos funcionan a la vez sin problemas.

Los servos no se alimentan de la batería de los motores, sino de la línea de 5 V del Arduino. Para un SG90 no hay problema, pero servos grandes como el MG996R pueden consumir más de 1 A al moverse; el regulador del Arduino se calienta, la tensión cae y la placa se reinicia. Con servos grandes, conecta solo el cable de señal al conector, alimenta el + y el − del servo con una fuente aparte de 5–6 V y une las masas. Tienes los detalles en Servo MG996R con Arduino y ¿Qué es un servomotor?. El código de abajo hace que el servo de SER1 barra a izquierda y derecha mientras gira el motor de M3:

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}

Límite de corriente (0,6 A) y calentamiento

La línea más importante de la hoja de datos del L293D es 0,6 A continuos y 1,2 A de pico por canal. El valor de pico solo vale para impulsos muy cortos; si un motor consume 1 A durante segundos, el chip sufre. Un cálculo sencillo muestra por qué se calienta: el L293D es un controlador antiguo con transistores bipolares y, a 0,6 A, cae típicamente 1,4 V en el transistor superior y 1,2 V en el inferior. Es decir, cuando un motor consume 0,6 A se generan 0,6 A × 2,6 V ≈ 1,6 W de calor en el chip; dos motores en el mismo chip producen el doble, unos 3 W. Un pequeño chip DIP sin disipador no puede evacuar ese calor, su temperatura sube rápido y al final la protección térmica apaga las salidas. El síntoma es conocido: los motores funcionan un rato, se paran y vuelven a arrancar cuando el chip se enfría.

Los motores TT amarillos consumen unos 150 mA en vacío y 200–300 mA rodando por el suelo, dentro de los límites del shield. El problema llega cuando una rueda empuja contra un obstáculo o el coche gira sobre sí mismo: un motor TT bloqueado puede consumir 1–1,5 A, y en un coche 4WD los cuatro motores se esfuerzan a la vez durante el giro. Para conocer la corriente real de tu motor, conecta un multímetro en serie con él y mide mientras sujetas la rueda con la mano un momento; cómo hacerlo está en Cómo usar un multímetro. Para mantener fresco el shield:

  • Arranca suave: No saltes de 0 a 255 de golpe; sube la velocidad poco a poco en 200–300 ms y la corriente de arranque baja claramente.
  • No bloquees el motor: En los robots que esquivan obstáculos, para el coche antes de que choque; un motor bloqueado es el que más calor genera.
  • Pega disipadores en los chips: Unos pequeños disipadores de aluminio con cinta térmica bajan algo la temperatura del L293D.
  • Suelda un segundo L293D encima: Adafruit también comenta que, para aumentar la capacidad de corriente, se puede soldar un segundo L293D encima de los chips existentes, pata con pata; los dos chips se reparten la corriente.
  • No uses más tensión de la necesaria: Dar 12 V a motores de 6 V aumenta la corriente y el calor.
  • Cambia al controlador adecuado: Si tu motor consume de forma continua más de 0,6 A, usa un controlador basado en L298N o TB6612FNG.

¿Shield L293D o L298N?

Módulo controlador de motores doble L298N
Módulo L298N: dos puentes H en un solo chip, un gran disipador y 2 A por canal; se conecta con cables, así que sirve para cualquier placa.
CaracterísticaShield L293DMódulo L298N
Número de motores4 DC, o 2 paso a paso + 2 servos2 DC o 1 paso a paso
Corriente por canal0,6 A continua, 1,2 A de pico2 A continua, 3 A de pico
Tensión de motor4,5–25 V5–35 V
Caída de tensiónUnos 1,5–2,6 VUnos 2–3 V
ConexiónSe encaja en el Uno, sin cablesCon cables jumper; tú eliges los pines
Pines que usa8 pines fijos + D9 y D10 para servos6 pines (ENA, IN1–IN4, ENB)
LibreríaAFMotor obligatoriaNo hace falta (digitalWrite, analogWrite)
ESP32 y PicoNo es adecuadoSe usa directamente
Ideal paraCoches 4WD con motores TT, kits de aprendizajeMotores más potentes, robots 2WD

En resumen, si montas un coche 4WD con motores TT sobre un Arduino Uno, el shield L293D reduce el cableado al mínimo y reúne los cuatro motores en una sola placa. Si tus motores son más potentes, tu placa es un ESP32 o una Pico, o te importa elegir los pines, el L298N es más flexible; los detalles están en Control de motores DC con el L298N. Si quieres algo más eficiente que ambos, el TB6612FNG, basado en MOSFET, tiene una caída de tensión muy baja y alarga la duración de las pilas. Comparamos qué tipo de motor conviene para cada tarea en Motor DC, servo y paso a paso: diferencias.

¿Funciona con ESP32, Raspberry Pi Pico o Mega?

Con el Arduino Mega 2560 funciona sin problemas: el shield encaja en los primeros pines digitales y analógicos del Mega y AFMotor conoce los temporizadores del Mega. Con Uno R4, Leonardo, ESP32 y Raspberry Pi Pico, en cambio, no funciona, porque AFMotor escribe directamente en los registros de temporizador del ATmega328P y del ATmega2560. Con un ESP32 seleccionado, la compilación se detiene con 'DC_MOTOR_PWM_RATE' was not declared in this scope, y con un Leonardo con #error "This chip is not supported!". Las placas ESP32 con formato Uno (como la ESPDuino-32) encajan físicamente en el shield, pero los números de pin y el nivel de señal de 3,3 V son distintos. Con estas placas es mucho más fácil usar un L298N, un TB6612FNG o un solo chip L293D en lugar del shield. Las entradas del L293D consideran HIGH todo lo que supere 2,3 V, así que funcionan directamente con placas de 3,3 V:

Pin del L293DFunciónRaspberry Pi PicoESP32
1 (1,2EN)Velocidad (PWM)GP15GPIO 25
2 (1A)Sentido 1GP14GPIO 26
7 (2A)Sentido 2GP13GPIO 27
3 y 6 (1Y, 2Y)Terminales del motorAl motorAl motor
4, 5, 12, 13GND (el calor también sale por estos pines)GNDGND
16 (VCC1)Alimentación lógica, 5 VVBUS (pin 40)5V (VIN)
8 (VCC2)Alimentación del motorPositivo de la bateríaPositivo de la batería
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)

Las masas de la Pico y de la batería deben estar unidas. En el ESP32 montas la misma lógica en lenguaje Arduino: sentido con digitalWrite y velocidad con analogWrite en los pines de la tabla. Si estas placas son nuevas para ti, empieza por ¿Qué es el ESP32? y ¿Qué es la Raspberry Pi Pico?.

Los motores no giran: errores comunes y soluciones

SíntomaCausa probableSolución
No gira ningún motor y el LED PWR está apagadoNo hay alimentación de motores: EXT_PWR vacío o solo el USB conectadoConecta una batería de 6–12 V a EXT_PWR; sin el LED encendido los motores no giran
El LED está encendido y el código subido, pero el motor no se mueveFalta setSpeed() o el número del motor no coincide con la borneraAñade setSpeed(200) en setup(); comprueba que AF_DCMotor(1) corresponda a M1
El motor zumba pero no giraValor PWM demasiado bajo o batería débilArranca por encima de 100; carga la batería o usa dos 18650
"AFMotor.h: No such file or directory"Librería no instalada o instalada la V2Instala la Adafruit Motor Shield library V1 desde el Gestor de librerías
Error "This chip is not supported!" o "DC_MOTOR_PWM_RATE"Uno R4, Leonardo o ESP32 seleccionado como placaElige Uno o Mega en Herramientas > Placa
El Arduino se reinicia al arrancar los motoresLa corriente de arranque hunde la tensión de la batería (brownout)Quita el jumper y alimenta el Arduino aparte; suelda un condensador de 100 nF en los terminales del motor
El motor gira un rato y se para, el chip quemaHa saltado la protección térmica del L293DReduce la carga, arranca suave, añade disipadores o pasa a un L298N
Los motores cambian de sentido al azarD4, D7, D8 o D12 se usan para otra cosa en el códigoPasa los sensores a A0–A5
La velocidad de M1 y M2 no cambia, M3 y M4 van bientone() o IRremote están usando el Timer2Pasa esos motores a M3 y M4 o quita el código que choca
Una rueda gira al revésCables del motor invertidos en la borneraIntercambia los dos cables de ese motor
La placa hace cosas raras al poner el shieldEl conector USB del Uno toca soldaduras de debajo del shield o hay un pin dobladoPega cinta aislante sobre el conector USB, endereza los pines y vuelve a colocar el shield
La forma más rápida de encontrar el problema es reducir la prueba al mínimo: deja de lado todo el código del coche, conecta un solo motor a M1, comprueba que el LED PWR está encendido y sube el primer programa de arriba. Si funciona, el problema está en tu código y no en el shield; si no, empieza por la alimentación y la librería. Todas las razones por las que un Arduino se reinicia solo están en ¿Tu Arduino se reinicia solo?.

Ideas de proyectos con el shield L293D

  • Coche 4WD controlado por Bluetooth: Un robot con tracción a las cuatro ruedas que manejas desde el móvil con el código de arriba.
  • Robot que esquiva obstáculos: Un coche que explora el frente con un HC-SR04 montado en el servo de SER1 y gira hacia la dirección más despejada; la guía completa está en Robot evasor de obstáculos con Arduino.
  • Robot sigue líneas: Sigue una línea negra en el suelo con sensores infrarrojos en A0–A3; el ajuste PID está en Robot seguidor de línea con Arduino.
  • Slider para cámara: Desliza una cámara despacio por un raíl con un motor paso a paso y graba timelapses.
  • Cabezal pan-tilt: Conecta dos servos a los dos conectores de servo y orienta una cámara o un láser en dos ejes; para más servos, mira Brazo robótico con Arduino.
  • Cortina automática o cinta transportadora: Abre y cierra una cortina con un motor DC según la luz o construye una pequeña cinta transportadora.

En resumen, para usar bien el shield L293D: instala la librería V1, revisa el LED PWR, coloca el jumper según tu forma de alimentación, no olvides setSpeed(), conecta los sensores a A0–A5 y mantén tus motores por debajo del límite de 0,6 A. Con estas reglas, un pequeño shield carga él solo con toda la fuerza de un robot de cuatro motores. En la app BlueGrays encontrarás el coche controlado por Bluetooth, el robot que esquiva obstáculos y proyectos con motores paso a paso y servos, paso a paso, con esquemas y código.

Preguntas frecuentes

¿Cuántos motores puede controlar el shield L293D?

El shield puede mover 4 motores DC a la vez, cada uno de forma independiente hacia delante, hacia atrás y a distinta velocidad. En lugar de motores DC también puedes conectar 2 motores paso a paso (las parejas M1–M2 y M3–M4) o 2 motores DC más 1 paso a paso. Además tiene dos conectores de servo; los servos se controlan desde D9 y D10, independientemente de los motores.

¿Para qué sirve el jumper PWR del shield L293D?

Con el jumper puesto, la alimentación de los motores del shield se une a la línea Vin del Arduino y las dos placas funcionan con una sola fuente. Si alimentas el Arduino por USB y los motores con otra batería, debes quitar el jumper. Conectar fuentes separadas al conector DC y a EXT_PWR con el jumper puesto cortocircuita las dos fuentes.

¿Qué batería conectar al shield L293D?

Para coches robot con motores TT, la mejor opción son dos pilas de litio 18650 (7,4 V); como el L293D pierde unos 2 V, los motores reciben 5,5–6 V. Cuatro pilas AA dejan solo unos 4 V a los motores y una pila de 9 V no da corriente suficiente para moverlos. Fíjate bien en la polaridad al conectar la batería a EXT_PWR, porque la bornera no tiene protección contra inversión.

¿Cómo se soluciona el error "AFMotor.h: No such file or directory"?

Este error indica que la librería AFMotor no está instalada. Busca Adafruit Motor Shield en el Gestor de librerías e instala la Adafruit Motor Shield library cuya descripción menciona la V1. La librería V2 es para otra placa y no incluye el archivo AFMotor.h.

¿Cuántos amperios aguanta el shield L293D y por qué se calienta?

Cada canal entrega 0,6 A de forma continua y 1,2 A en picos muy breves. Como los transistores del L293D tienen una caída de unos 2,6 V a 0,6 A, se generan casi 1,5 W de calor por motor; por eso el chip se calienta y se apaga si se supera el límite. Evita que los motores se bloqueen y usa un controlador más potente, como el L298N, para motores que consuman más de 0,6 A de forma continua.

¿Qué es mejor, el shield L293D o el L298N?

Si montas un coche 4WD con motores TT sobre un Arduino Uno, el shield L293D es más práctico porque se encaja sin cables y tiene cuatro canales de motor. Si usas motores más potentes, un ESP32 o una Pico, o quieres elegir tú los pines, el L298N, con 2 A por canal, encaja mejor. Los dos pierden unos 2 V de la tensión del motor.

Ver todos los proyectos
Coche controlado por Bluetooth con L298N
#80Avanzado
Premium

Coche controlado por Bluetooth con L298N

Convierte tu móvil en un mando y conduce tu propio coche robot. El Arduino recibe por un módulo Bluetooth las órdenes de una app de control remoto en el móvil y mueve las ruedas con un controlador de

5.0(38)
65
Robot para evitar obstáculos
#81Avanzado
Premium

Robot para evitar obstáculos

¿Qué le parece construir un vehículo inteligente que encuentre su propio camino? El Robot Evitador de Obstáculos explora constantemente su entorno gracias al sensor ultrasónico que lleva delante. Cuan

5.0(38)
49
Uso del motor paso a paso
#67Intermedio
Premium

Uso del motor paso a paso

Un motor que gira paso a paso, justo lo que tú quieras, como la aguja de un reloj. A través de una placa controladora, el Arduino hace girar un pequeño motor paso a paso una vuelta completa en un sent

4.5(31)
42
Construcción de servomotor de 360 grados a partir de motor paso a paso
#68Intermedio
Premium

Construcción de servomotor de 360 grados a partir de motor paso a paso

Enséñale a un motor paso a paso normal a ir al ángulo que quieras, a lo largo de toda la vuelta. El Arduino calcula cuántos pasos corresponden a cada ángulo; el motor va a 0, 90, 45, 180, 135 y 360 gr

4.5(22)
32
Uso del servomotor
#35Principiante
Premium

Uso del servomotor

El brazo de un pequeño servomotor gira por turnos a tres posiciones: al principio del todo, justo al centro y al final del todo, esperando dos segundos en cada parada. El Arduino le dice al motor en q

4.7(48)
67
Funcionamiento del servomotor con potenciómetro
#36Principiante
Premium

Funcionamiento del servomotor con potenciómetro

A medida que giras el mando del potenciómetro, el brazo del servomotor gira con él: un extremo del mando equivale a cero grados y el otro a media vuelta. El Arduino lee sin parar la posición del mando

4.6(37)
52
Controlar un LED desde el móvil por Bluetooth
#34Principiante
Premium

Controlar un LED desde el móvil por Bluetooth

Un pequeño ensayo para encender y apagar las luces de tu habitación desde el móvil. El módulo Bluetooth pasa al Arduino las letras que envías desde el teléfono; una letra enciende el LED rojo, otra en

4.8(68)
89
TCRT5000 Detección de superficie blanca y negra
#78Intermedio
Premium

TCRT5000 Detección de superficie blanca y negra

Con el pequeño sensor que hace de ojo en los robots sigue líneas, sabrás si el suelo es negro o blanco. El TCRT5000 lanza una luz invisible hacia el suelo y mira cuánta vuelve; sobre blanco se enciend

4.7(40)
49