#include <AccelStepper.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define stepperStepY 3 // Conecta el pin de paso (STEP) del A4988 al pin 3 de Arduino
#define stepperYDir 6 // Conecta el pin de dirección (DIR) del A4988 al pin 6 de Arduino
#define enableY 8 // Conecta el pin de habilitación (ENABLE) del A4988 al pin 8 de Arduino
#define LIMIT_SWITCH_PIN 11
#define boton 12
bool motorDetenido = false;
void setup()
{
lcd.init();
lcd.backlight();
pinMode(enableY, OUTPUT); // Establece el pin de habilitación como salida
digitalWrite(enableY, LOW); // Habilita el controlador A4988
pinMode(stepperStepY, OUTPUT);
pinMode(stepperYDir, OUTPUT);
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);
}
void loop()
{
if (digitalRead(boton) == 0)
{
homing();
motorDetenido = false; // Restablecer la variable para permitir un nuevo homing
}
while (digitalRead(boton) == 1)
{
lcd.setCursor(4,0);
lcd.print("inicio");
}
}
void homing()
{
lcd1();
int VelocidadHomingGo = 2000;
int PasosHomingGo = 5000;
int VelocidadHomingBack = 1000;
int PasosHomingBack = 500;
if (!motorDetenido)
{
digitalWrite(stepperYDir, HIGH); // Establecer dirección en sentido horario
for (int i = 0; i < PasosHomingGo; i++)
{
digitalWrite(stepperStepY, HIGH);
delayMicroseconds(VelocidadHomingGo); // Ajusta el tiempo según la velocidad que desees
digitalWrite(stepperStepY, LOW);
delayMicroseconds(VelocidadHomingGo); // Ajusta el tiempo según la velocidad que desees
if (digitalRead(LIMIT_SWITCH_PIN) == LOW)
{
// Detener el motor y girar 200 pasos en sentido antihorario
digitalWrite(enableY, HIGH);
motorDetenido = true;
for (int j = 0; j < PasosHomingBack; j++)
{
digitalWrite(stepperYDir, LOW); // Cambiar dirección a antihorario
digitalWrite(stepperStepY, HIGH);
delayMicroseconds(VelocidadHomingBack); // Ajusta el tiempo según la velocidad que desees
digitalWrite(stepperStepY, LOW);
delayMicroseconds(VelocidadHomingBack); // Ajusta el tiempo según la velocidad que desees
}
while (digitalRead(LIMIT_SWITCH_PIN) == LOW) {} // Esperar a que se suelte el botón
lcd2();
lcd.clear();
break;
}
}
delay(100); // Pausa de 1 segundo entre giros
}
}
void lcd1()
{
//lcd.clear();
lcd.setCursor(4,0);
lcd.print("HOMING!!");
}
void lcd2()
{
//lcd.clear();
lcd.setCursor(3,0);
lcd.print("Centrado!!");
delay(1000); // Pausa de 1 segundo entre giros
}