// Pines del driver A4988
const int pinDir = 8;
const int pinStep = 9;
// Variables
int pasosPorVuelta = 0;
int divisiones = 0;
int pasosPorDivision[150];
float gradosAcumulados[150];
int divisionActual = 0;
bool listo = false;
bool completado = false;
void setup() {
Serial.begin(9600);
delay(1000);
// Configurar pines
pinMode(pinDir, OUTPUT);
pinMode(pinStep, OUTPUT);
digitalWrite(pinDir, HIGH); // Siempre misma direccion
Serial.println("CONTROL DE MOTOR BIPOLAR CON A4988");
Serial.println("Ingresa cantidad de pasos por vuelta (ej: 200):");
}
void loop() {
if (!listo && Serial.available()) {
pasosPorVuelta = Serial.parseInt();
if (pasosPorVuelta > 0) {
Serial.print("Pasos por vuelta: ");
Serial.println(pasosPorVuelta);
Serial.println("Ingresa cantidad de divisiones (max 150):");
delay(500);
while (Serial.available()) Serial.read(); // Limpiar buffer
listo = true;
} else {
Serial.println("Valor invalido. Intenta de nuevo:");
}
}
if (listo && divisiones == 0 && Serial.available()) {
divisiones = Serial.parseInt();
if (divisiones > 0 && divisiones <= 150) {
calcularDivisiones();
mostrarTabla();
Serial.println("Presiona 'A' para avanzar a la siguiente division.");
delay(500);
while (Serial.available()) Serial.read(); // Limpiar buffer
} else {
Serial.println("Numero invalido. Intenta de nuevo:");
divisiones = 0;
}
}
if (divisiones > 0 && divisionActual < divisiones && Serial.available()) {
char comando = Serial.read();
if (comando == 'A' || comando == 'a') {
moverMotor(pasosPorDivision[divisionActual]);
Serial.print("Division ");
Serial.print(divisionActual + 1);
Serial.print(" completada. Grados acumulados: ");
Serial.println(gradosAcumulados[divisionActual]);
divisionActual++;
if (divisionActual == divisiones) {
Serial.println("Todas las divisiones completadas (360 grados).");
Serial.println("Deseas reiniciar? (S/N)");
completado = true;
}
}
}
if (completado && Serial.available()) {
char resp = Serial.read();
if (resp == 'S' || resp == 's') {
reiniciarTodo();
} else if (resp == 'N' || resp == 'n') {
Serial.println("Proceso terminado.");
while (true); // Detener ejecucion
}
}
}
void calcularDivisiones() {
int base = pasosPorVuelta / divisiones;
int extra = pasosPorVuelta % divisiones;
float gradoPorPaso = 360.0 / pasosPorVuelta;
for (int i = 0; i < divisiones; i++) {
pasosPorDivision[i] = base + (i < extra ? 1 : 0);
gradosAcumulados[i] = (i == 0)
? pasosPorDivision[0] * gradoPorPaso
: gradosAcumulados[i - 1] + pasosPorDivision[i] * gradoPorPaso;
}
}
void mostrarTabla() {
Serial.println("Division | Pasos | Grados acumulados");
Serial.println("-------------------------------------");
for (int i = 0; i < divisiones; i++) {
Serial.print(" ");
Serial.print(i + 1);
Serial.print("\t ");
Serial.print(pasosPorDivision[i]);
Serial.print("\t ");
Serial.println(gradosAcumulados[i], 2);
}
Serial.println("-------------------------------------");
}
void moverMotor(int pasos) {
for (int i = 0; i < pasos; i++) {
digitalWrite(pinStep, HIGH);
delayMicroseconds(500); // Ajusta este valor segun la velocidad deseada
digitalWrite(pinStep, LOW);
delayMicroseconds(500);
}
}
void reiniciarTodo() {
pasosPorVuelta = 0;
divisiones = 0;
divisionActual = 0;
listo = false;
completado = false;
for (int i = 0; i < 150; i++) {
pasosPorDivision[i] = 0;
gradosAcumulados[i] = 0.0;
}
Serial.println("\nReiniciando proceso...");
Serial.println("Ingresa cantidad de pasos por vuelta:");
}