#include <AccelStepper.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define STEP_PIN 9 // Conecta el pin de paso (STEP) del A4988 al pin 3 de Arduino
#define DIR_PIN 8 // Conecta el pin de dirección (DIR) del A4988 al pin 6 de Arduino
//#define ENABLE_PIN 8 // Conecta el pin de habilitación (ENABLE) del A4988 al pin 8 de Arduino
#define STEP_PIN 6 // Conecta el pin de paso (STEP) del A4988 al pin 3 de Arduino
#define DIR_PIN 7 // Conecta el pin de dirección (DIR) del A4988 al pin 6 de Arduino
#define LIMIT_SWITCH_PIN 11 // Conecta el interruptor de límite al pin 10 de Arduino
#define boton 12
AccelStepper stepperY(1, 9, 8); // Define un objeto stepper
AccelStepper stepperX(1, 6, 7);
boolean limitSwitchState = false;
int stepsAfterLimitSwitch = 50;
void setup() {
lcd.init();
lcd.backlight();
//pinMode(ENABLE_PIN, OUTPUT); // Establece el pin de habilitación como salida
//digitalWrite(ENABLE_PIN, LOW); // Habilita el controlador A4988
pinMode(LIMIT_SWITCH_PIN, INPUT_PULLUP); // Configura el pin del interruptor de límite como entrada con resistencia de pull-up
pinMode(boton, INPUT_PULLUP);
stepperY.setMaxSpeed(1000); // Establece la velocidad máxima en pasos por segundo
stepperY.setAcceleration(1000); // Establece la aceleración en pasos por segundo al cuadrado
stepperX.setMaxSpeed(1000); // Establece la velocidad máxima en pasos por segundo
stepperX.setAcceleration(1000); // Establece la aceleración en pasos por segundo al cuadrado
}
void loop()
{
homing();
}
void homing()
{
lcd1();
// Verifica si el interruptor de límite ha cambiado de estado
boolean newLimitSwitchState = digitalRead(LIMIT_SWITCH_PIN) == HIGH;
// Si el estado del interruptor de límite ha cambiado
if (newLimitSwitchState != limitSwitchState)
{
// Cambia el sentido de la rotación del motor
stepperY.setSpeed(-stepperY.speed()); // Invierte la dirección actual del motor
limitSwitchState = newLimitSwitchState;
// Realiza 50 pasos en la nueva dirección
for (int i = 0; i < stepsAfterLimitSwitch; ++i)
{
stepperY.run();
delay(10);
}
// Detén el motor después de los pasos
stepperY.stop();
while (stepperY.isRunning())
{
delay(10);
lcd2();
}
}
// Gira en sentido horario con aceleración
stepperY.moveTo(5000); // Posición a la que se moverá con aceleración
stepperY.run();
// Asegúrate de no bloquear el programa con un bucle sin fin
delay(10);
}
void lcd1()
{
//lcd.clear();
lcd.setCursor(4,0);
lcd.print("Looking");
lcd.setCursor(5,1);
lcd.print("Center");
}
void lcd2()
{
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Centered ");
lcd.setCursor(0, 1);
lcd.print(" ");
delay(10);
// Si el botón está presionado, inicia el motor
if (digitalRead(boton) == LOW)
{
lcd.setCursor(0, 0);
lcd.print(" Terminando ");
lcd.setCursor(0, 1);
lcd.print(" XXXXXXXXXX ");
// Mueve el motor 50 pasos
stepperX.moveTo(50);
stepperX.run();
// Espera a que se completen los pasos
while (stepperX.distanceToGo() != 0)
{
stepperX.run();
delay(10);
}
// Detiene el motor después de completar los pasos
stepperX.stop();
lcd3();
delay(10);
}
}
void lcd3()
{
while (digitalRead(boton) == HIGH)
{
lcd.setCursor(0, 0);
lcd.print(" Perfecto ");
lcd.setCursor(0, 1);
lcd.print(" XXXXXXXXXX ");
delay(10);
}
while (digitalRead(boton) == LOW)
{
homing();
}
}