// Definición de pines
#define DIR_PIN 8 // Dirección del motor
#define STEP_PIN 9 // Pulso de pasos del motor
#define ENABLE_PIN 10 // Habilitación del motor
#define SENSOR_PIN A0 // Sensor de presión RFP 602
#define FC_NC_PIN 2 // Final de carrera NC
#define FC_NO_PIN 3 // Final de carrera NO
#define LED_PIN 4 // LED indicador
#define BUTTON_PIN 5 // Botón pulsador
// Variables de control
bool estadoMotorHIGH = false;
bool estadoMotorLOW = true;
bool estadoFreno = false;
void setup() {
Serial.begin(9600);
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(ENABLE_PIN, OUTPUT);
pinMode(FC_NC_PIN, INPUT_PULLUP);
pinMode(FC_NO_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
digitalWrite(ENABLE_PIN, HIGH); // Desactiva el driver al inicio
}
void loop() {
int sensorValue = analogRead(SENSOR_PIN); // Leer sensor de presión
bool fc_nc_estado = digitalRead(FC_NC_PIN); // Leer final de carrera NC
bool fc_no_estado = digitalRead(FC_NO_PIN); // Leer final de carrera NO
bool button_estado = digitalRead(BUTTON_PIN); // Leer botón
Serial.print("Sensor: ");
Serial.print(sensorValue);
Serial.print(" FC_NC: ");
Serial.print(fc_nc_estado);
Serial.print(" FC_NO: ");
Serial.print(fc_no_estado);
Serial.print(" BOTON: ");
Serial.println(button_estado);
// Si el sensor NO detecta presión y el final de carrera NC está abierto
if (sensorValue < 10 && fc_nc_estado == HIGH && estadoMotorLOW) {
moverMotor(HIGH); // Activar freno (sentido horario)
estadoMotorHIGH = true; // Marcar que HIGH se activó
estadoMotorLOW = false; // Desactivar LOW hasta que se use
estadoFreno = true;
}
// Si el botón es presionado
if (button_estado == LOW && estadoMotorHIGH) {
moverMotor(LOW); // Desactivar freno (sentido antihorario)
estadoMotorLOW = true; // Marcar que LOW se activó
estadoMotorHIGH = false; // Desactivar HIGH hasta que se use
estadoFreno = false;
}
// Si el freno de mano esta activado se encendera el LED
if (estadoFreno == true) {
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
}
// Función para girar el motor 2 vueltas
void moverMotor(bool sentido) {
digitalWrite(ENABLE_PIN, LOW); // Activa el driver del motor
delay(10); // Pausa para estabilizar
digitalWrite(DIR_PIN, sentido); // Sentido de giro
for (int i = 0; i < 700; i++) { // 2 vueltas (200 pasos por vuelta en un motor de 1.8°)
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(900); // Ajusta según la velocidad deseada
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(900);
}
digitalWrite(ENABLE_PIN, HIGH); // Desactiva el driver del motor
}