1. Introducción a los Drivers de Motores
Los drivers de motores son circuitos especializados que actúan como intermediarios entre microcontroladores de baja potencia (como el ESP32) y motores que requieren corrientes y voltajes más altos. Permiten control preciso de velocidad, dirección y posición.
L298N
Driver para motores DC y paso a paso de hasta 2A
DRV8825
Driver para motores paso a paso con microstepping
2. Driver L298N - Control de Motores DC
El L298N es un driver dual H-bridge que permite controlar dos motores DC o un motor paso a paso bipolar. Maneja corrientes de hasta 2A por canal.
// Pines L298N
#define ENA 14 // Enable A - PWM
#define IN1 27 // Input 1
#define IN2 26 // Input 2
#define ENB 12 // Enable B - PWM
#define IN3 25 // Input 3
#define IN4 33 // Input 4
void setup() {
Serial.begin(115200);
// Configurar pines
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
// Configurar PWM
ledcSetup(0, 1000, 8); // Canal 0 para ENA
ledcSetup(1, 1000, 8); // Canal 1 para ENB
ledcAttachPin(ENA, 0);
ledcAttachPin(ENB, 1);
}
void controlMotorA(int velocidad, bool direccion) {
digitalWrite(IN1, direccion ? HIGH : LOW);
digitalWrite(IN2, direccion ? LOW : HIGH);
ledcWrite(0, abs(velocidad));
}
void controlMotorB(int velocidad, bool direccion) {
digitalWrite(IN3, direccion ? HIGH : LOW);
digitalWrite(IN4, direccion ? LOW : HIGH);
ledcWrite(1, abs(velocidad));
}
void loop() {
// Mover ambos motores adelante
controlMotorA(200, true);
controlMotorB(200, true);
delay(2000);
// Parar motores
controlMotorA(0, true);
controlMotorB(0, true);
delay(1000);
}
3. Driver DRV8825 - Control de Precisión
El DRV8825 es un driver para motores paso a paso con capacidades de microstepping hasta 1/32 de paso, proporcionando movimientos extremadamente suaves.
#define STEP_PIN 2
#define DIR_PIN 5
#define ENABLE_PIN 8
// Pines de microstepping
#define M0_PIN 13
#define M1_PIN 12
#define M2_PIN 14
void setup() {
Serial.begin(115200);
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(ENABLE_PIN, OUTPUT);
pinMode(M0_PIN, OUTPUT);
pinMode(M1_PIN, OUTPUT);
pinMode(M2_PIN, OUTPUT);
// Habilitar motor
digitalWrite(ENABLE_PIN, LOW);
// Configurar microstepping (1/16)
digitalWrite(M0_PIN, HIGH);
digitalWrite(M1_PIN, HIGH);
digitalWrite(M2_PIN, LOW);
}
void girarPasos(int pasos, bool direccion, int delay_us = 1000) {
digitalWrite(DIR_PIN, direccion ? HIGH : LOW);
for (int i = 0; i < pasos; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(delay_us);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(delay_us);
}
}
void loop() {
Serial.println("Girando 200 pasos horario");
girarPasos(200, true, 500);
delay(1000);
Serial.println("Girando 200 pasos antihorario");
girarPasos(200, false, 500);
delay(1000);
}
4. Ejercicios Prácticos
Objetivo: Construir un robot con tracción diferencial usando L298N.
Movimientos: Adelante, atrás, giros, pivoteo
Objetivo: Crear sistema de posicionamiento XY de alta precisión.
Características: Microstepping, interpolación lineal