/* * MECRO KIT - PROYECTO 13: BASE DE CÁMARA (DRIVER MANUAL)
* Objetivo: Control de Stepper SIN librerías (Low Level Control)
* Hardware: ESP32 + ULN2003 + 28BYJ-48
* Concepto: Secuencia de Excitación de Bobinas
*/
// --- 1. DEFINICIÓN DE PINES (BOBINAS) ---
// El motor tiene 4 bobinas que debemos activar en orden.
const int IN1 = 19;
const int IN2 = 18;
const int IN3 = 5;
const int IN4 = 17;
// Pines agrupados para iterar fácil
const int motorPins[4] = {IN1, IN2, IN3, IN4};
// --- 2. SECUENCIA DE PASOS (Half-Step / Medio Paso) ---
// Para mayor precisión y torque suave, usamos 8 pasos por ciclo.
// 1 = Bobina Encendida (5V), 0 = Apagada.
const int matrizPasos[8][4] = {
{1, 0, 0, 0}, // Paso 1
{1, 1, 0, 0}, // Paso 2
{0, 1, 0, 0}, // Paso 3
{0, 1, 1, 0}, // Paso 4
{0, 0, 1, 0}, // Paso 5
{0, 0, 1, 1}, // Paso 6
{0, 0, 0, 1}, // Paso 7
{1, 0, 0, 1} // Paso 8
};
// Datos del motor 28BYJ-48
// Pasos por vuelta en modo Half-Step = 4096 aprox
const int PASOS_VUELTA = 4096;
void setup() {
Serial.begin(115200);
// Configurar todos los pines como salida
for (int i = 0; i < 4; i++) {
pinMode(motorPins[i], OUTPUT);
}
Serial.println("--- DRIVER MANUAL MECRO: ONLINE ---");
}
void loop() {
Serial.println("-> Girando Derecha (Horario)");
moverMotor(1024, true); // 1/4 de vuelta
delay(1000);
Serial.println("-> Girando Izquierda (Anti-horario)");
moverMotor(1024, false); // 1/4 de vuelta al otro lado
delay(1000);
}
// --- DRIVER DE SOFTWARE ---
// pasos: cantidad de "clicks" a mover
// horario: true para derecha, false para izquierda
void moverMotor(int pasos, bool horario) {
static int faseActual = 0; // Recuerda en qué paso se quedó (0-7)
for (int i = 0; i < pasos; i++) {
// Calcular siguiente fase
if (horario) {
faseActual++;
if (faseActual > 7) faseActual = 0;
} else {
faseActual--;
if (faseActual < 0) faseActual = 7;
}
// Escribir en los pines físicos
aplicarFase(faseActual);
// Retardo para controlar la velocidad (mínimo 900us para este motor)
delayMicroseconds(1200);
}
// Apagar bobinas al terminar para ahorrar energía
apagadoTotal();
}
void aplicarFase(int fase) {
for (int pin = 0; pin < 4; pin++) {
digitalWrite(motorPins[pin], matrizPasos[fase][pin]);
}
}
void apagadoTotal() {
for (int i = 0; i < 4; i++) {
digitalWrite(motorPins[i], LOW);
}
}