int contador, pos_actual, nueva_pos;
#define IO1 8 // Sensor cercano al motor (no sujeción)
#define IO2 7 // Sensor lejano (sujeción)
#define EN 12
#define DIR 11
#define STEP 10
#define PWM 13
// --- Función: un paso del motor ---
void unPaso() {
digitalWrite(STEP, HIGH);
delayMicroseconds(800); // ajusta velocidad
digitalWrite(STEP, LOW);
delayMicroseconds(800);
}
// --- Función: mover a una posición ---
void moverA(int destino) {
if (destino < 0 || destino > contador) {
Serial.println("Posición fuera de rango.");
return;
}
int pasos = abs(destino - pos_actual);
if (pasos == 0) {
Serial.println("Ya estás en esa posición.");
return;
}
digitalWrite(DIR, (destino > pos_actual) ? HIGH : LOW);
for (int i = 0; i < pasos; i++) {
unPaso();
}
pos_actual = destino;
Serial.print("Posición actual del motor = ");
Serial.println(pos_actual);
}
void setup() {
pinMode(IO1, INPUT);
pinMode(IO2, INPUT);
pinMode(EN, OUTPUT);
pinMode(DIR, OUTPUT);
pinMode(STEP, OUTPUT);
digitalWrite(EN, LOW); // habilita el driver
Serial.begin(115200);
Serial.println("Presione C para iniciar calibración");
contador = 0;
// --- Calibración (solo una vez) ---
while (Serial.read() != 'C'); // espera C
Serial.println("Buscando el sensor de sujección...");
digitalWrite(DIR, LOW); // hacia afuera
while (digitalRead(IO2) == LOW) {
unPaso();
}
Serial.println("Buscando el sensor de no sujección...");
digitalWrite(DIR, HIGH); // hacia adentro
while (digitalRead(IO1) == LOW) {
unPaso();
contador++;
}
Serial.print("Longitud total del recorrido en pasos = ");
Serial.println(contador);
pos_actual = 0;
Serial.println("Posición inicial = 0");
Serial.print("Ingrese una nueva posición [0 : ");
Serial.print(contador);
Serial.println("]:");
}
void loop() {
if (Serial.available() > 0) {
nueva_pos = Serial.parseInt(); // leo la posición ingresada
moverA(nueva_pos); // me muevo y me quedo ahí
// Después de moverse, vuelvo a pedir otra posición
Serial.print("Ingrese otra posición [0 : ");
Serial.print(contador);
Serial.println("]:");
}
}
SW_IN
SW_OUT