[SOLUCIONADO]...Maquina de estados para motor paso a paso con duda incorporada

Hola a todos

He creado este código de Maquina de Estados para mover un motor.
El código funciona correctamente, tal como lo incluyo.

La duda que me ha surgido es: Si sustituyo el Pin 19 (Stop) por el (13) no funciona correctamente, puesto que el Pin 13 siempre esta HIGH cuando cargo este y cualquier otro programa. Es normal ????

Un saludo

  /* 
   * 
   *  MAQUINA ESTADOS MOTOR
   * 
   * 
   *  ****************  ENGRAL ***********************
   * 
  */
  
  
  int Puls_S = 5 ; //Pulsador SUBIDA
  int Puls_B = 14; //Pulsador BAJADA
  int Sens_A = 6 ; //Sensor fin/c arriba
  int Sens_B = 15; //Sensor fin/c abajo
  int Motor_S = 9; // Motor SUBIDA
  int Motor_B = 10;// Motor BAJADA
  int Stop    = 19;// Pulsador Stop
  
  enum Estados {PARADO, SUBE, BAJA, PARA};
  
  Estados estado = PARADO;
  
  void autom()
  {
    switch (estado)
    {        
      case PARADO:
        if (digitalRead(Puls_S) == HIGH) //puls_SUBE
        {
          estado = SUBE;// Envia a estado SUBE
        }
        if (digitalRead(Puls_B) == HIGH) // puls_BAJA
        {
          estado = BAJA;// Envia a estado BAJA
        }
        else
        {
          digitalWrite (Motor_S, LOW); // detiene  motor SUBIDA
          digitalWrite (Motor_B, LOW); // detiene  motor BAJADA
        }
        break;
  
      case SUBE:
        if (digitalRead(Sens_A) == HIGH)// sen_Arriba-FIN DE CARRERA
        {
          estado = PARADO ; // Envia a estado PARADO
        }
        if (digitalRead(Stop) == HIGH) // Pulsador Stop
        {
          Serial.println ("====   pulsado Stop ");          
          estado = PARADO;          // Envia a estado PARADO
        }       
        else
        {
          digitalWrite (Motor_S, HIGH); // MOTOR SUBE         
        }
        break;
  
      case BAJA:
        if (digitalRead(Sens_B) == HIGH)// sensor-Abajo-FIN DE CARRERA
        {
          estado = PARADO; // Envia a PARADO
        }
        if (digitalRead(Stop) == HIGH) // Pulsador Stop
        {
          Serial.println ("====   pulsado Stop ");         
          estado = PARADO;          // Envia a estado PARADO
        }      
        else
        {
          digitalWrite (Motor_B, HIGH); // MOTOR BAJA         
        }
        break;     
    }
  }  
  
  
  void setup()
  {
    Serial.begin(9600);
    Serial.println("");
    Serial.println("========   A_MAQUINA_ESTADOS_MOTOR_MS  =======  \n");
  
    pinMode (Stop, INPUT);     // Pulsador Stop
    pinMode (Sens_A, INPUT);   // Sensor_Arriba - fin de carrera
    pinMode (Sens_B, INPUT);   // Sensor_Abajo - fin de carrera
    pinMode (Puls_S, INPUT);   // Pulsador Subida
    pinMode (Puls_B, INPUT);   // Pulsador Bajada
    pinMode (Motor_S, OUTPUT); // MOTOR SUBIDA
    pinMode (Motor_B, OUTPUT); // MOTOR BAJADA 
  }
  
  void loop()
  {
    autom();
  } 
  
  //**********************  FIN  **********************

Hoy tengo la bola de cristal en reparacion, asi que sera mas facil si pones a que placa y MCU concretas te refieres. Y los pulsadores, son pulldown?

Suponiendo que es una Mega (por los pines que usas), no debería estar el pin 13 siempre en alto, algo no está bien.

Hola Mago gromit1

Espero te reparen pronto la bola de cristal.
Mientras tanto te envio la información requerida:
Placa UNO original del año 2015 , pulsadores pulldown, lógicamente con su resistencia a masa.
Como dije anteriormente el programa SI funciona con pulsador "Stop" a Pin 19 (A5)
Gracias por la respuesta !!!

Un saludo !!! :cocktail:.... :cocktail:

Hola @MaximoEsfuerzo :

Como le comento al colega @anon27210439, uso una placa UNO del año 2015 y utilizo el Pin19 (A5) para el "Stop" , y todo este programa y otros también funcionan correctamente.
Mi extrañeza ha sido que en el caso de utilizar el Pin 13, funciona siempre como HIGH.
Se me ocurre.... probar tal vez en este caso el Pin 13, como INPUT_PULLUP , cambiando lógicamente , HIGH por LOW en la instrucción Stop ????

Ya os informare !!

Un saludo y gracias !!! :cocktail: :cocktail:

Creo que el PIN 13 esta conectado al LED. Y en esa placa puede que con un op-amp.
Si necesitas el pin puedes probar a configurar en pullup/pulldown interno y el pulsador de las dos maneras, a VCC o a GND. Con cuidado de no liarse, o mejor añadiendo la resistencia externa por si acaso.

Como salida, puedes probar a ponerlo en modo output y luego ponerlo a LOW, deberia funcionar.

O desoldar el led o la resistencia. Pero supongo que no hara falta, mejor dejarlo para otras pruebas.

Hi,
No se si entendi pero si no me equivoco cuando re-inisializa el micro los pines se van high.Ahora para eliminar tu problema lo que debes de hacer es en el setup cuando declara el pin output imediatamente haces un write para poner el pin low. Esto te resuelve el problema .

Ese comportamiento es normal. Si te fijas en el esquemático del uno el pin 13 va unido al led de la placa, (no es de eso), al conector ICSP, (supongo que no tienes nada conectado a el) y a un pin del chip de comunicaciones.
Es ese pin el que esta siempre en HIGH cuando no estamos subiendo un boceto, prueba a cargar un código y veras reflejado en el led de la placa el comportamiento de ese pin.
Solucion: Tu la has dicho ya, INPUT_PULLUP y leer un estado LOW.

Saludos.

Hola (por orden de aparición en la película) @anon27210439 @MaximoEsfuerzo @tauro0221 @gonpezzi

Respondo a los cuatro
Como comente al principio, el programa SI funciona.
Probe a utilizar el Pin 13 como INPUT (cosa que normalmente NO hago).
Hemos coincidido en utilizar para este caso INPUT_PULLUP para el Pin13, invirtiéndose por tanto la función HIGH-LOW. (también funciono)

He resuelto finalmente, utilizar el 19 (analógico A5) como INPUT para "Stop", evitando así falsas interpretaciones.

Gracias a todos por vuestra colaboración !!!!

:champagne: :cocktail: :cocktail: :cocktail:

P.D. :
Creo que pasare el código a la sección Documentación, pues veo que hay un vacío.

Hola @anon27210439

Te contesto al final

Un saludo!!

Hola @MaximoEsfuerzo

Te respondo al final.

Un saludo !!

Hola @tauro0221

Te respondo al final

Un saludo !!!

Hola @gonpezzi
Te respondo al final

Un saludo !!

Hola a todos

Como continuación a este hilo, añado una mejora del código que figura en el post #1.

Este con activación de motor paso a paso y parada de emergencia por interrupción.
Además, dispone de dos entradas para utilizar fin de carrera.
El Led (7) indica PARADO

Funcionando con Placa UNO y controlador ULN2003A.

Serviria para: puertas, cortinas, etc.

Si a los moderadores les parece bien, lo pondre en la seccion Documentación.

Un saludo !!! ...:cocktail:... :cocktail:

/*
  
  Funcionando con  Placa UNO 

   MAQUINA ESTADOS MOTOR PASO/PASO

   Doble sentido de giro.

   CON: VOID SUBE Y BAJA
        VOID APAGA LEDS/BOBINAS
        VOID INTERRUPCION
  Con el controlador ULN2003A.

*  ****************  ENGRAL Marzo 2024 ***********************

*/


int Puls_S = 5 ; //Pulsador SUBIDA
int Puls_B = 14; //Pulsador BAJADA

int Sens_A = 4 ; //Sensor/fin carrera arriba
int Sens_B = 15; //Sensor/fin carrera abajo

int Led_P   = 7; // Led encendido: PARADO

// *************** CONEXIONES a CONTROLADOR Y MOTOR ********************

int IN_1 = 8;  // CONEX-1 ULN2003A y MOTOR
int IN_2 = 9;  // CONEX-2 ULN2003A y MOTOR
int IN_3 = 10; // CONEX-3 ULN2003A y MOTOR
int IN_4 = 11; // CONEX-4 ULN2003A y MOTOR

// **********************************************

enum Situacion {PARADO, SUBE, BAJA };

Situacion PUNTO = PARADO; // Declaracion GLOBAL.

int INTERVALO = 5; // ORIGINAL:5 INTERVALO
int descanso =  200;
//************************  FUNCIONES  ********************
void INTERRU()// Produce la interrupción.
{
  Serial.println("      INTERRUPCION STOP !!!! ");
  PUNTO = PARADO;
}
//********************************

void sube()            // Gira el motor  SENTIDO HORARIO
{
  digitalWrite( IN_1, HIGH);  // paso 1 PASO DOBLE
  digitalWrite( IN_2, HIGH);
  digitalWrite( IN_3, LOW);
  digitalWrite( IN_4, LOW);
  delay(INTERVALO);           // LAPSO ENTRE PASOS

  digitalWrite( IN_1, LOW);   // paso 2  PASO DOBLE
  digitalWrite( IN_2, HIGH);
  digitalWrite( IN_3, HIGH);
  digitalWrite( IN_4, LOW);
  delay(INTERVALO);

  digitalWrite( IN_1, LOW);  // paso 3 PASO DOBLE
  digitalWrite( IN_2, LOW);
  digitalWrite( IN_3, HIGH);
  digitalWrite( IN_4, HIGH);
  delay(INTERVALO);

  digitalWrite( IN_1, HIGH);   // paso 4 PASO DOBLE
  digitalWrite( IN_2, LOW);
  digitalWrite( IN_3, LOW);
  digitalWrite( IN_4, HIGH);
  delay(INTERVALO);
}
//****************************************

void baja()  // Gira el motor  SENTIDO ANTI-HORARIO
{
  digitalWrite( IN_1, LOW);//1 paso 1 PASO DOBLE
  digitalWrite( IN_2, LOW);
  digitalWrite( IN_3, HIGH);
  digitalWrite( IN_4, HIGH);
  delay(INTERVALO);        // LAPSO ENTRE PASOS

  digitalWrite( IN_1, LOW);//2 paso 2  PASO DOBLE
  digitalWrite( IN_2, HIGH);
  digitalWrite( IN_3, HIGH);
  digitalWrite( IN_4, LOW);
  delay(INTERVALO);

  digitalWrite( IN_1, HIGH);//3 paso 3 PASO DOBLE
  digitalWrite( IN_2, HIGH);
  digitalWrite( IN_3, LOW);
  digitalWrite( IN_4, LOW);
  delay(INTERVALO);

  digitalWrite( IN_1, HIGH );//4 paso 4 PASO DOBLE
  digitalWrite( IN_2, LOW);
  digitalWrite( IN_3, LOW);
  digitalWrite( IN_4, HIGH);
  delay(INTERVALO);
}
//****************************************
void apaga_leds()         //  APAGA Leds y BOBINAS
{
  digitalWrite(IN_1, LOW);
  digitalWrite(IN_2, LOW);
  digitalWrite(IN_3, LOW);
  digitalWrite(IN_4, LOW);
  delay(descanso);             // Detiene para DESCANSO.

} // LL-void apaga_leds()

// ***********************FIN FUNCIONES  ************************
void setup()
{
  Serial.begin(9600);
  Serial.println("");
  Serial.println("========   A_A_MOTOR_PAP_MAQUINA_ESTADOS_MS_3_FORO  =======  \n");


  pinMode (Sens_A,  INPUT);   // Sensor_Arriba - fin de carrera
  pinMode (Sens_B,  INPUT);   // Sensor_Abajo - fin de carrera
  pinMode (Puls_S,  INPUT);   // Pulsador Subida
  pinMode (Puls_B,  INPUT);   // Pulsador Bajada
  pinMode (Led_P,  OUTPUT);   // Led encendido: PARADA
  pinMode (   2,    INPUT);    // PULSADOR: INTERRUPCION/STOP

  //***************** CONEXIONES MOTOR  ****************

  pinMode (IN_1,  OUTPUT);    // CONEX-1 MOTOR
  pinMode (IN_2,  OUTPUT);    // CONEX-2 MOTOR
  pinMode (IN_3,  OUTPUT);    // CONEX-3 MOTOR
  pinMode (IN_4,  OUTPUT);    // CONEX-4 MOTOR


  // PULSANDO(2) pasa de LOW a HIGH ("RISING") Crea INTERRUPCION.
  attachInterrupt(digitalPinToInterrupt(2), INTERRU, RISING );

}


void loop()
{

  switch (PUNTO)
  {
    case PARADO:
      if (digitalRead(Puls_S) == HIGH) // puls_SUBE
    {
        PUNTO = SUBE;          // Envia a estado SUBE
    }
      if (digitalRead(Puls_B) == HIGH) // puls_BAJA
    {
        PUNTO = BAJA;          // Envia a estado BAJA
     }
      else
    {
        Serial.println ("====   PARADO ");
        digitalWrite (Led_P, HIGH); // Enciende Led indicador PARADO
        apaga_leds();  //  APAGA BOBINAS
     }
      break;

    case SUBE:
      if (digitalRead(Sens_A) == HIGH)// sensor Arriba-FIN DE CARRERA
    {
        Serial.println ("====   SENSOR de ARRIBA ");
        PUNTO = PARADO ;             // Envia a estado PARADO
    }
      else
    {
        Serial.println ("====   SUBE ");
        digitalWrite (Led_P, LOW);    // Apaga Led indicador PARADO
        sube();
     }
      break;

    case BAJA:
      if (digitalRead(Sens_B) == HIGH)// sensor-Abajo-FIN DE CARRERA
    {
        Serial.println ("====   SENSOR de ABAJO");
        PUNTO = PARADO;              // Envia a estado PARADO
     }
      else
    {
        Serial.println ("====   BAJA ");
        digitalWrite (Led_P, LOW);      // Apaga Led indicador PARADO
        baja();
    }
      break;
  }
}

//**********************  FIN  **********************