En este tutorial aprenderás a conectar el L293D, programarlo y controlar la velocidad y el giro de tu motor fácilmente. Ideal para tus proyectos de robótica y automatización, explicado paso a paso y sin complicaciones. ¡Comienza ahora y domina el control de motores DC con Arduino!
Tabla de contenidos
Lista de Materiales
Aquí encontrarás los materiales necesarios para controlar un motor DC con Arduino. Puedes usar Tinkercad como simulación.
| Cantidad | Material | Función |
|---|---|---|
| 1 | Arduino Uno | Controlador principal para el motor DC |
| 1 | Módulo L293D | Driver puente H para controlar giro y velocidad |
| 1 | Motor DC con escobillas | Actuador que se controlará en el proyecto |
| 1 | Protoboard | Montaje de conexiones temporales |
| 1 | Switch | Encendido y apagado del motor de forma manual |
| Var | Cables jumper macho-macho | Conexiones entre Arduino, L293D y motor |
| 1 | Fuente de alimentación 6-12V | Alimentar el motor DC con suficiente corriente |
Control ON/OFF Directo
En este método no se utiliza Arduino. Simplemente conectas el motor DC a la fuente de alimentación a través de un switch mecánico. Cuando cierras el circuito con el switch, el motor recibe la tensión y gira. Al abrir el switch, el motor se apaga. Es la forma más simple de control, ideal para pruebas básicas de funcionamiento de motores y comprobación de polaridad de giro sin necesidad de programación ni componentes adicionales.
Pasos para realizar las conexiones
Conecta el positivo de la fuente de alimentación a un terminal del switch.
Conecta el otro terminal del switch al terminal positivo del motor DC.
Conecta el terminal negativo del motor DC al negativo de la fuente de alimentación.
Cuando presiones el switch, el motor encenderá y girará en un sentido.
Para cambiar el sentido de giro, invierte las conexiones positivo y negativo en el motor.
Limitación de este método
Este método no permite controlar la velocidad ni invertir el giro automáticamente. Solo puedes encender o apagar el motor, por lo que es limitado en aplicaciones de robótica y automatización donde se requiere velocidad variable o cambio de dirección.
Inversión de Giro con Puente H (L293D)
En este método utilizamos un puente H con el L293D para invertir el giro de un motor DC. El puente H permite cambiar la polaridad aplicada al motor mediante señales digitales de Arduino, controlando así el sentido de rotación de forma electrónica. Es ideal para robots móviles y mecanismos que requieran cambiar dirección, como grúas o sistemas de apertura y cierre.
Revisión de conexiones
Paso 1: Vcc1 (pin 16 del L293D): conecta a 5V de Arduino.
Paso 2: Vcc2 (pin 8 del L293D): conecta a la fuente de alimentación del motor (6-12V).
Paso 3: GND (pines 4, 5, 12, 13): conecta a GND común (Arduino y fuente).
Paso 4: IN1 (pin 2): conecta al pin 9 de Arduino.
Paso 5: IN2 (pin 7): conecta al pin 8 de Arduino.
Paso 6: Enable1 (pin 1): conecta al pin 10 de Arduino (en este método se pondrá en alto fijo para habilitar el puente H).
Paso 7: OUT1 (pin 3): conecta a un terminal del motor DC.
Paso 8: OUT2 (pin 6): conecta al otro terminal del motor DC.
Paso 9: Switch:
Un pin del switch conecta al pin 7 de Arduino.
El otro pin conecta a GND.
Se configura como INPUT_PULLUP, por lo que no requiere resistencia externa.
Código Arduino
// Control inversión de giro motor DC con L293D y switch
const int in1 = 9; // Pin IN1 L293D
const int in2 = 8; // Pin IN2 L293D
const int enA = 10; // Pin Enable1 L293D
const int switchPin = 7; // Pin del switch
void setup() {
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(enA, OUTPUT);
pinMode(switchPin, INPUT_PULLUP); // Configura switch como entrada con pull-up
digitalWrite(enA, HIGH); // Habilita el puente H
}
void loop() {
if (digitalRead(switchPin) == LOW) {
// Switch presionado: giro horario
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
} else {
// Switch no presionado: giro antihorario
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
}
}
Explicación del código
pinMode(enA, OUTPUT) configura Enable1 como salida para habilitar el puente H.
digitalWrite(enA, HIGH) mantiene habilitado el driver para que el motor funcione.
digitalRead(switchPin) lee el estado del switch conectado al pin 7.
Cuando el switch está presionado (LOW), el motor gira en un sentido.
Cuando el switch no está presionado (HIGH), el motor gira en el sentido opuesto.
Limitación de este método
Aunque permite invertir el giro, no controla la velocidad. Para velocidad variable es necesario implementar PWM en el pin Enable1, lo cual se verá en la siguiente forma.
Control de Velocidad y Giro con PWM
En este método implementamos control completo de un motor DC, combinando el control de giro (dirección) mediante un switch y el control de velocidad con un potenciómetro. El potenciómetro, conectado al pin analógico A0, ajustará la velocidad enviando una señal PWM al Enable1 (EN1) del L293D. El switch, conectado al pin digital 7, invertirá la dirección de giro del motor. Este sistema es ideal para proyectos de robótica donde se requiere movimiento controlado y cambio de sentido dinámico.
Pasos para realizar las conexiones
Nota: Las conexiones anteriores se mantienen. Aquí solo se agrega el potenciómetro.
Paso 1: Conecta el terminal central del potenciómetro al pin A0 de Arduino.
Paso 2: Conecta un extremo del potenciómetro a 5V de Arduino.
Paso 3: Conecta el otro extremo del potenciómetro a GND.
Código Arduino
Aquí tienes el código para controlar velocidad y sentido de giro con PWM y switch:
// Control de velocidad y giro motor DC con L293D, potenciómetro y switch
const int in1 = 9; // Pin IN1 L293D
const int in2 = 8; // Pin IN2 L293D
const int enA = 10; // Pin Enable1 L293D (PWM)
const int potPin = A0; // Pin del potenciómetro
const int switchPin = 7; // Pin del switch
void setup() {
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(enA, OUTPUT);
pinMode(switchPin, INPUT_PULLUP); // Switch con pull-up
}
void loop() {
int potValue = analogRead(potPin); // Lee el potenciómetro (0-1023)
int speed = map(potValue, 0, 1023, 0, 255); // Convierte a rango PWM (0-255)
analogWrite(enA, speed); // Controla velocidad con PWM
if (digitalRead(switchPin) == LOW) {
// Switch presionado: giro horario
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
} else {
// Switch no presionado: giro antihorario
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
}
}
Explicación del código
analogRead(potPin): lee el valor del potenciómetro entre 0 y 1023.
map(potValue, 0, 1023, 0, 255): mapea el valor al rango PWM (0-255).
analogWrite(enA, speed): regula la velocidad del motor mediante PWM en Enable1.
digitalRead(switchPin): lee el estado del switch en pin 7.
Si el switch está presionado (LOW), el motor gira en un sentido (horario).
Si el switch no está presionado (HIGH), el motor gira en el sentido opuesto (antihorario).
Con este método finalizas el tutorial con control completo de velocidad y giro, ideal para proyectos avanzados de robótica.