Módulo 6

Control con drivers de motores: L298N, DRV8825

Manejo de Sensores y Actuadores

ESP32 Mecatrónica IoT UNAM

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.

L298N - Control Avanzado
// 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.

DRV8825 - Microstepping
#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

1

Robot Diferencial con L298N

Intermedio 60 min

Objetivo: Construir un robot con tracción diferencial usando L298N.

Movimientos: Adelante, atrás, giros, pivoteo

2

Sistema CNC con DRV8825

Avanzado 90 min

Objetivo: Crear sistema de posicionamiento XY de alta precisión.

Características: Microstepping, interpolación lineal