/*----------------------------------------------------------------------
---------------------- 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 teclado sirve para enviar los grados a girar desde 0 a 360 grados, más el sentido de giro
(A: horario) y (B antihorario), luego debe pulsar la tecla D como enter. Es decir, si deseo
que el motor gire 180 grados en sentido horario, debe pulsar 180A y luego D como enter.
De igual manera, deseo que gire 90 grados en sentido antihoraio, debe pulsar 90B y luego D
como enter.
El motor de pasos recibe ese comando, separa la letra A o B y se queda con los grados a girar.
Cuando termine enviara el mensaje "movimiento completo".
Luego, se puede repetir las veces que crea conveniente.
------------------------------------------------------------------------
Responsable: Javier Barriga Hoyle
------------------------------------------------------------------------
-----------------------------------------------------------------------*/
#include <Keypad.h> // Libreria del teclado
/* datos para la parte del teclado */
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'E','0','F','D'} // 'D' es Enter
};
byte rowPins[ROWS] = {13,12,11,10};
byte colPins[COLS] = {7,6,5,4};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
char buffer[5];
int indice = 0;
String data = "";
/* datos para la parte del motor */
#define A4988_STEP 40
#define A4988_DIR 39
int pasos = 0;
String dataRx = "";
void setup()
{
Serial.begin(9600);
pinMode(A4988_STEP, OUTPUT);
pinMode(A4988_DIR, OUTPUT);
memset(buffer, 0, sizeof(buffer));
Serial.println("Ingrese grados (0-360) + A/B, luego D para confirmar");
}
void loop()
{
// lectura de teclado
char key = keypad.getKey();
if (key)
{
if ((key >= '0' && key <= '9') || key == 'A' || key == 'B') {
if (indice < 4) { // Máximo 3 dígitos + 1 letra
buffer[indice++] = key;
}
}
else if (key == 'D') // Tecla Enter
{ buffer[indice] = '\0'; // Cierra la cadena
Serial.println();
Serial.print("Comando ingresado: ");
Serial.println(buffer);
// Separar dirección y grados
if (indice >= 2)
{
char direccion = buffer[indice - 1]; // última letra
buffer[indice - 1] = '\0'; // quitar dirección
int grados = atoi(buffer); // convertir a entero
if (grados >= 0 && grados <= 360 && (direccion == 'A' || direccion == 'B'))
{
if (direccion == 'A') {
digitalWrite(A4988_DIR, LOW); // horario
} else if (direccion == 'B') {
digitalWrite(A4988_DIR, HIGH); // antihorario
}
int pasos = map(grados, 0, 360, 0, 200);
Serial.print("Moviendo ");
Serial.print(grados);
Serial.print(" grados (");
Serial.print(pasos);
Serial.print(" pasos)");
Serial.print(" en sentido ");
Serial.println((direccion == 'A') ? "Horario" : "Antihorario");
for (int i = 0; i < pasos; i++) {
digitalWrite(A4988_STEP, HIGH);
delay(50);
digitalWrite(A4988_STEP, LOW);
delay(50);
}
Serial.println("Movimiento completo\n");
} else {
Serial.println("Entrada inválida");
}
}
// Reset
indice = 0;
memset(buffer, 0, sizeof(buffer));
}
}
} // fin de loop
Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1