/*----------------------------------------------------------------------
---------------------- MOTOR A PASOS BIPOLAR ---------------------------
Ejericicio desarrollado para el curso de Sistemas Digitales B - 1IEE28
Pontificia Universidad Católica del Perú. Semestre académico 2025-I
El motor de pasos (conectado a un puerto serial) es controlado desde un teclado
(conectado a otro puerto serial), ambos se conectan virtualmente usando null-modem
de un software emulador de puerto virtuales.
La etapa de recepción va a recibir una cadena como por ejemplo "180A" (grados + dirección),
donde los grados a girar van desde 0 a 360 grados más el sentido de giro.
------------------------------------------------------------------------
Responsable: Javier Barriga Hoyle
------------------------------------------------------------------------
-----------------------------------------------------------------------*/
#define A4988_STEP 40
#define A4988_DIR 39
int pasos = 0;
String dataRx = "";
void setup() {
pinMode(A4988_STEP, OUTPUT);
pinMode(A4988_DIR, OUTPUT);
Serial.begin(9600);
}
void loop()
{
// Leer entrada del monitor serial
if (Serial.available()) {
dataRx = Serial.readStringUntil('\n');
dataRx.trim();
if (dataRx.length() >= 2)
{
char direccion = dataRx.charAt(dataRx.length() - 1); // última letra = dirección
if (direccion == 'A') {
digitalWrite(A4988_DIR, LOW); // horario
} else if (direccion == 'B') {
digitalWrite(A4988_DIR, HIGH); // antihorario
}
String gradosStr = dataRx.substring(0, dataRx.length() - 1); // todo menos la última letra
int grados = gradosStr.toInt();
pasos = map(grados, 0, 360, 0, 200); // motor de 200 pasos/rev
Serial.print("Girando ");
Serial.print(grados);
Serial.print(" grados (");
Serial.print(pasos);
Serial.println(" pasos)");
if(direccion == 'A') Serial.println("Sentido: Horario");
else Serial.println("Sentido: Antihorario");
// Ejecutar los pasos
for (int i = 0; i < pasos; i++) {
digitalWrite(A4988_STEP, HIGH);
delay(50);
digitalWrite(A4988_STEP, LOW);
delay(50);
}
Serial.println("Movimiento completado.\n");
}
}
}