#define STEP_PIN 8 // Pin STEP del A4988
#define DIR_PIN 9 // Pin DIR del A4988
#define STEPS_PER_REV 200 // Pasos por revolución (motor típico 1.8° = 200 pasos/rev)
// Encoder Rotary
#define PinCLK 2 // CLK del encoder (interrupción)
#define PinDT 3 // DT del encoder
#define PinSW 4 // Botón del encoder
volatile boolean TurnDetected; // Indica si hubo giro
volatile boolean rotationdirection; // Dirección (CW/CCW)
int RotaryPosition = 0; // Posición actual
int PrevPosition; // Posición previa
int StepsToTake; // Pasos a mover
// Interrupción para el encoder (igual que antes)
void isr() {
delay(4); // Debounce
if (digitalRead(PinCLK)) {
rotationdirection = digitalRead(PinDT);
} else {
rotationdirection = !digitalRead(PinDT);
}
TurnDetected = true;
}
void setup() {
// Configuración del motor (A4988)
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
digitalWrite(STEP_PIN, LOW);
digitalWrite(DIR_PIN, LOW);
// Configuración del encoder
pinMode(PinCLK, INPUT);
pinMode(PinDT, INPUT);
pinMode(PinSW, INPUT_PULLUP); // Resistencia pull-up interna
attachInterrupt(digitalPinToInterrupt(PinCLK), isr, FALLING); // Interrupción en flanco descendente
}
void loop() {
// Si se presiona el botón, resetear posición
if (!digitalRead(PinSW)) {
if (RotaryPosition != 0) {
moverMotor(-RotaryPosition * 20); // Mueve el motor a la posición cero
RotaryPosition = 0;
}
}
// Si se detectó giro en el encoder
if (TurnDetected) {
PrevPosition = RotaryPosition;
if (rotationdirection) {
RotaryPosition--;
} else {
RotaryPosition++;
}
TurnDetected = false;
// Mover el motor en la dirección correspondiente
if (RotaryPosition > PrevPosition) { // Sentido horario (CW)
digitalWrite(DIR_PIN, HIGH);
moverMotor(20);
} else if (RotaryPosition < PrevPosition) { // Sentido antihorario (CCW)
digitalWrite(DIR_PIN, LOW);
moverMotor(20);
}
}
}
// Función para mover el motor con el A4988
void moverMotor(int pasos) {
for (int i = 0; i < pasos; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(500); // Controla la velocidad (ajustable)
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(500);
}
}