Go Down

Topic: ASCENSOR (Read 118 times) previous topic - next topic

ing_mack_jr

Oct 09, 2020, 07:56 pm Last Edit: Oct 09, 2020, 08:03 pm by ing_mack_jr
¡Hola a todos!

Estoy intentando realizar un ascensor de 3 pisos (no físico, solo simulación en Proteus), el cual tendrá un botón en cada piso para llamar al elevador y de la cabina lleva 3 botones para presionar dependiendo del piso al cual se desea ir, además contara con una luz en cada piso con su respectivo apagador y una luz en la cabina que siempre estará encendida.

El elevador estará funcionando con un motor simple de 9VCD conectado a un L293D para el cambio de giro, tendra sus botones pulsadores y sus leds.


La parte del codigo que controla las luces me funciona como yo esperaba, mi problema es que en el control del motor, éste se queda funcionando, no se detiene (el arranque y paro del motor es por tiempos), intente cambiar los tiempos y cambiar el orden de los pisos dentro del codigo, pero no funciono.

Adjunto mi codigo, diagrama de conexion y archivo de Proteus.



Code: [Select]
#define B1 22 //CABINA IR A PISO 1
#define B2 23 //CABINA IR A PISO 2
#define B3 24 //CABINA IR A PISO 3
#define B4 25 //LLAMAR ELEVADOR DESDE PISO 1
#define B5 26 //LLAMAR ELEVADOR DESDE PISO 2
#define B6 27 //LLAMAR ELEVADOR DESDE PISO 3
#define B7 28 //LUCES PISO 1
#define B8 29 //LUCES PISO 2
#define B9 30 //LUCES PISO 3
#define M1 31 //ON-OFF ARRIBA
#define M2 32 //MOTOR ABAJO
#define M0 33 //ON-OFF MOTOR
#define L1 34 //LUZ PISO 1
#define L2 35 //LUZ PISO 2
#define L3 36 //LUZ PISO 3
#define L4 37 //LUZ CABINA

//LUZ CABINA
const int LED4 = 37;

//LUZ PISO 1
int BOTON7 = 28; //BOTON
int LED1 = 34; //LED
int B7ON = 0; //ENCENDER
int B7PREVIOUS = 0; //ESTADO ANTERIOR
int B7STATE = 0; //ESTADO

//LUZ PISO 2
int BOTON8 = 29; //BOTON
int LED2 = 35; //LED
int B8ON = 0; //ENCENDER
int B8PREVIOUS = 0; //ESTADO ANTERIOR
int B8STATE = 0; //ESTADO

//LUZ PISO 3
int BOTON9 = 30; //BOTON
int LED3 = 36; //LED
int B9ON = 0; //ENCENDER
int B9PREVIOUS = 0; //ESTADO ANTERIOR
int B9STATE = 0; //ESTADO

//MOTOR
int MOTOR1 = 31; //ARRIBA
int MOTOR2 = 32; //ABAJO
int MOTOR0 = 33; //ON-OFF MOTOR

//CABINA
int BOTON1 = 22; //IR AL PISO 1
int BOTON2 = 23; //IR AL PISO 2
int BOTON3 = 24; //IR AL PISO 3

//LLAMAR ELEVADOR
int BOTON4 = 25; //LLAMAR DESDE PISO 1
int BOTON5 = 26; //LLAMAR DESDE PISO 2
int BOTON6 = 27; //LLAMAR DESDE PISO 3

int PISO_ACTUAL = 2; //PISO DONDE COMIENZA EL ELEVADOR


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  pinMode(BOTON1, INPUT);
  pinMode(BOTON2, INPUT);
  pinMode(BOTON3, INPUT);
  pinMode(BOTON4, INPUT);
  pinMode(BOTON5, INPUT);
  pinMode(BOTON6, INPUT);
  pinMode(BOTON7, INPUT);
  pinMode(BOTON8, INPUT);
  pinMode(BOTON9, INPUT);
  pinMode(MOTOR0, OUTPUT);
  pinMode(MOTOR1, OUTPUT);
  pinMode(MOTOR2, OUTPUT);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);


}

void loop()
{
  // put your main code here, to run repeatedly:
  digitalWrite(37, HIGH); //ENCENDER LUZ DE CABINA

  //LUZ DEL PISO 1
  B7STATE = digitalRead(BOTON7); //LEER ESTADO DEL BOTON DE LA LUZ DEL PISO 1

  if (B7STATE && B7PREVIOUS == 0)
  {
    B7ON = 1 - B7ON;
  }

  B7PREVIOUS = B7STATE;

  if (B7ON)
  {
    digitalWrite(LED1, HIGH);
  }
  else
  {
    digitalWrite(LED1, LOW);
  }

  //LUZ DEL PISO 2
  B8STATE = digitalRead(BOTON8); //LEER ESTADO DEL BOTON DE LA LUZ DEL PISO 2

  if (B8STATE && B8PREVIOUS == 0)
  {
    B8ON = 1 - B8ON;
  }

  B8PREVIOUS = B8STATE;

  if (B8ON)
  {
    digitalWrite(LED2, HIGH);
  }
  else
  {
    digitalWrite(LED2, LOW);
  }

  //LUZ DEL PISO 3
  B9STATE = digitalRead(BOTON9); //LEER ESTADO DEL BOTON DE LA LUZ DEL PISO 3

  if (B9STATE && B9PREVIOUS == 0)
  {
    B9ON = 1 - B9ON;
  }

  B9PREVIOUS = B9STATE;

  if (B9ON)
  {
    digitalWrite(LED3, HIGH);
  }
  else
  {
    digitalWrite(LED3, LOW);
  }


  BOTON1 = digitalRead(22); //LEER ESTADO DEL BOTON DEL PISO 1 DENTRO DE LA CABINA
  BOTON2 = digitalRead(23); //LEER ESTADO DEL BOTON DEL PISO 2 DENTRO DE LA CABINA
  BOTON3 = digitalRead(24); //LEER ESTADO DEL BOTON DEL PISO 3 DENTRO DE LA CABINA

  BOTON4 = digitalRead(25); //LEER ESTADO DEL BOTON PARA LLAMAR ELEVADOR DESDE EL PISO 1
  BOTON5 = digitalRead(26); //LEER ESTADO DEL BOTON PARA LLAMAR ELEVADOR DESDE EL PISO 2
  BOTON6 = digitalRead(27); //LEER ESTADO DEL BOTON PARA LLAMAR ELEVADOR DESDE EL PISO 3


  if (BOTON1 || BOTON4 == HIGH) //SI SE PRESIONA EL BOTON DEL PISO 1 DENTRO O FUERA DE LA CABINA
  {
    if (PISO_ACTUAL == 2) //SI EL PISO ACTUAL ES EL 2
    {
      digitalWrite(MOTOR0, HIGH);  //ENCENDER MOTOR
      digitalWrite(MOTOR1, LOW); //ARRANCAMOS MOTOR PARA BAJAR
      digitalWrite(MOTOR2, HIGH);
      delay(1000);  //TIEMPO DE BAJADA DEL ASCENSOR DEL PISO 2 AL PISO 1
      digitalWrite(MOTOR0, LOW);  //SE DETIENE EL MOTOR

      PISO_ACTUAL == 1; //AHORA EL PISO ACTUAL ES EL 1
    }
    if (PISO_ACTUAL == 3) //SI EL PSIO ACTUAL ES EL 3
    {
      digitalWrite(MOTOR0, HIGH);  //ENCENDER MOTOR
      digitalWrite(MOTOR1, LOW); //ARRANCAMOS MOTOR PARA BAJAR
      digitalWrite(MOTOR2, HIGH);
      delay(2000);  //TIEMPO DE BAJADA DEL ASCENSOR DEL PISO 3 AL PISO 1
      digitalWrite(MOTOR0, LOW);  //SE DETIENE EL MOTOR

      PISO_ACTUAL == 1; //AHORA EL PISO ACTUAL ES EL 1
    }
  }
  else if (BOTON2 || BOTON5 == HIGH) //SI SE PRESIONA EL BOTON DEL PISO 2 DENTRO O FUERA DE LA CABINA
  {
    if (PISO_ACTUAL == 1) //SI EL PISO ACTUAL ES EL 1
    {
      digitalWrite(MOTOR0, HIGH);  //ENCENDER MOTOR
      digitalWrite(MOTOR1, HIGH); //ARRANCAMOS EL MOTOR PARA SUBIR
      digitalWrite(MOTOR2, LOW);
      delay(1000); //TIEMPO DE SUBIDA DEL PISO 1 AL PISO 2
      digitalWrite(MOTOR0, LOW);  //SE DETIENE EL MOTOR

      PISO_ACTUAL == 2; //AHORA EL PISO ACTUAL ES 2
    }
    if (PISO_ACTUAL == 3) //SI EL PISO ACTUAL ES EL 3
    {
      digitalWrite(MOTOR0, HIGH);  //ENCENDER MOTOR
      digitalWrite(MOTOR1, LOW); //ARRANCAMOS EL MOTOR PARA BAJAR
      digitalWrite(MOTOR2, HIGH);
      delay(1000); //TIEMPO DE BAJADA DEL PISO 3 AL PISO 2
      digitalWrite(MOTOR0, LOW);  //SE DETIENE EL MOTOR

      PISO_ACTUAL == 2; //AHORA EL PISO ACTUAL ES 2
    }
  }
  else if (BOTON3 || BOTON6 == HIGH) //SI SE PRESIONA EL BOTON DEL PISO 3 DENTRO O FUERA DE LA CABINA
  {
    if (PISO_ACTUAL == 1) //SI EL PISO ACTUAL ES EL 1
    {
      digitalWrite(MOTOR0, HIGH);  //ENCENDER MOTOR
      digitalWrite(MOTOR1, HIGH); //ARRANCAMOS EL MOTOR PARA SUBIR
      digitalWrite(MOTOR2, LOW);
      delay(2000); //TIEMPO DE SUBIDA DEL PISO 1 AL PISO 3
      digitalWrite(MOTOR0, LOW);  //SE DETIENE EL MOTOR

      PISO_ACTUAL == 3; //AHORA EL PISO ACTUAL ES 3
    }
    if (PISO_ACTUAL == 2) //SI EL PISO ACTUAL ES EL 2
    {
      digitalWrite(MOTOR0, HIGH);  //ENCENDER MOTOR
      digitalWrite(MOTOR1, HIGH); //ARRANCAMOS EL MOTOR PARA SUBIR
      digitalWrite(MOTOR2, LOW);
      delay(1000); //TIEMPO DE SUBIDA DEL PISO 2 AL PISO 3
      digitalWrite(MOTOR0, LOW);  //SE DETIENE EL MOTOR

      PISO_ACTUAL == 3; //AHORA EL PISO ACTUAL ES 3
    }
  }
}









surbyte

#1
Oct 18, 2020, 06:14 pm Last Edit: Oct 18, 2020, 07:26 pm by surbyte
El control del motor usando el L293 es fácil si respetas la tabla de verdad

IN1          IN2        Spinning Direction
Low(0) Low(0) Motor OFF
High(1) Low(0) Forward
Low(0) High(1) Backward
High(1) High(1) Motor OFF

Estoy modificando tu programa en algunos aspectos menores y en otro que justamente hace a tu problema.
Lo primero es que debes aprender a respetar ciertas convenciones y la mas importante es que las constantes van con mayúsculas y las variables con minúsculas.
Cuando los que tenemos algún tiempo vemos un código en mayúsculas tendemos a pensar que TUS variables son constantes y se nos complica asi que ya que estas comenzando que tal hacer las cosas como las hacemos todos?
Asi que lo que he hecho fue corregir muchas variables solo en el tipo de letra. Mismo nombre en minúsculas.

Lo segundo es que un ascensor no se mueve por tiempos. el motor envejece.. las correas patinan, etc, etc y tu sistema fallará porque no llega al piso indicado.
Un movimiento de un piso a otro debe ser porque se detecta el switch del piso al que se esta dirigiendo.
Considéralo.

Lo tercero es que aprende a no usar delay() como herramienta donde hay switch involucrados. Tu código inicialmente funcionará pero cuando le pones 2000 a delay le dices NO HAGAS NADA por 2 segundos.
Cómo un ascensor no debe hacer nada por dos segundos? que tal si debe detectar puerta abierta (no es tu caso pero proyecta la idea) quiere decir que por 2 segundos no revisará puertas? o sea tienes un accidente.
Se que exagero pero te indico porque no usar delay() y eso solo es el comienzo.

La opción es millis(). Su empleo no es fácil pero tampoco es complejo. Mira en Documentación y Tutoriales los ejemplos de millis().

Hay mas para mejorar pero al menos ahora funciona correctamente.

Code: [Select]
#define B1 22 //CABINA IR A PISO 1
#define B2 23 //CABINA IR A PISO 2
#define B3 24 //CABINA IR A PISO 3
#define B4 25 //LLAMAR ELEVADOR DESDE PISO 1
#define B5 26 //LLAMAR ELEVADOR DESDE PISO 2
#define B6 27 //LLAMAR ELEVADOR DESDE PISO 3
#define b7 28 //LUCES PISO 1
#define b8 29 //LUCES PISO 2
#define b9 30 //LUCES PISO 3
#define M1 31 //on-OFF ARRIBA
#define M2 32 //MOTOR ABAJO
#define M0 33 //on-OFF MOTOR
#define L1 34 //LUZ PISO 1
#define L2 35 //LUZ PISO 2
#define L3 36 //LUZ PISO 3
#define L4 37 //LUZ CABINA

//LUZ CABINA
const int led4 = 37;

//LUZ PISO 1
int boton7 = 28; //boton
int led1 = 34; //led
int b7on = 0; //ENCENDER
int b7previous = 0; //ESTADO ANTERIOR
int b7state = 0; //ESTADO

//LUZ PISO 2
int boton8 = 29; //boton
int led2 = 35; //led
int b8on = 0; //ENCENDER
int b8previous = 0; //ESTADO ANTERIOR
int b8state = 0; //ESTADO

//LUZ PISO 3
int boton9 = 30; //boton
int led3 = 36; //led
int b9on = 0; //ENCENDER
int b9previous = 0; //ESTADO ANTERIOR
int b9state = 0; //ESTADO

//MOTOR
int M1_IN1 = 31; //ARRIBA
int M1_IN2 = 32; //ABAJO
int enable_motor = 33; //on-OFF MOTOR

//CABINA
int boton1 = 22; //IR AL PISO 1
int boton2 = 23; //IR AL PISO 2
int boton3 = 24; //IR AL PISO 3

//LLAMAR ELEVADOR
int boton4 = 25; //LLAMAR DESDE PISO 1
int boton5 = 26; //LLAMAR DESDE PISO 2
int boton6 = 27; //LLAMAR DESDE PISO 3

int piso_actual = 2; //PISO DonDE COMIENZA EL ELEVADOR


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("Ascensor esperando ordenes.");

  pinMode(boton1, INPUT_PULLUP);
  pinMode(boton2, INPUT_PULLUP);
  pinMode(boton3, INPUT_PULLUP);
  pinMode(boton4, INPUT_PULLUP);
  pinMode(boton5, INPUT_PULLUP);
  pinMode(boton6, INPUT_PULLUP);
  pinMode(boton7, INPUT_PULLUP);
  pinMode(boton8, INPUT_PULLUP);
  pinMode(boton9, INPUT_PULLUP);
  pinMode(enable_motor, OUTPUT);
  pinMode(M1_IN1, OUTPUT);
  pinMode(M1_IN2, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);


}

void loop()
{
  // put your main code here, to run repeatedly:
  digitalWrite(37, HIGH); //ENCENDER LUZ DE CABINA

  //LUZ DEL PISO 1
  b7state = digitalRead(boton7); //LEER ESTADO DEL boton DE LA LUZ DEL PISO 1
  if (!b7state && b7previous)  {
    b7on = !b7on;
    digitalWrite(led1, b7on);
  }
  b7previous = b7state;

  //LUZ DEL PISO 2
  b8state = digitalRead(boton8); //LEER ESTADO DEL boton DE LA LUZ DEL PISO 2
  if (!b8state && b8previous)  {
      b8on = !b8on;
      digitalWrite(led2, b8on);
  }
  b8previous = b8state;

  //LUZ DEL PISO 3
  b9state = digitalRead(boton9); //LEER ESTADO DEL boton DE LA LUZ DEL PISO 3
  if (!b9state && b9previous) {
      b9on = !b9on;
      digitalWrite(led3, b9on);
  }
  b9previous = b9state;
  
  boton1 = !digitalRead(22); //LEER ESTADO DEL boton DEL PISO 1 DENTRO DE LA CABINA
  boton2 = !digitalRead(23); //LEER ESTADO DEL boton DEL PISO 2 DENTRO DE LA CABINA
  boton3 = !digitalRead(24); //LEER ESTADO DEL boton DEL PISO 3 DENTRO DE LA CABINA

  boton4 = !digitalRead(25); //LEER ESTADO DEL boton PARA LLAMAR ELEVADOR DESDE EL PISO 1
  boton5 = !digitalRead(26); //LEER ESTADO DEL boton PARA LLAMAR ELEVADOR DESDE EL PISO 2
  boton6 = !digitalRead(27); //LEER ESTADO DEL boton PARA LLAMAR ELEVADOR DESDE EL PISO 3


  if (boton1 || boton4) { //SI SE PRESIonA EL boton DEL PISO 1 DENTRO O FUERA DE LA CABINA
    Serial.println("Piso 1 requerido");
    if (piso_actual == 2) {       //SI EL PISO ACTUAL ES EL 2
        bajar();
        delay(1000);                        // TIEMPO DE BAJADA DEL ASCENSOR DEL PISO 2 AL PISO 1<= MAL jamas un ascensor para por tiempo.
        parar();        
        piso_actual == 1;         // AHORA EL PISO ACTUAL ES EL 1
    }
    if (piso_actual == 3) {       //SI EL PSIO ACTUAL ES EL 3
        bajar();
        delay(2000);              // TIEMPO DE BAJADA DEL ASCENSOR DEL PISO 3 AL PISO 1 <= MAL jamas un ascensor para por tiempo.
        parar();
        piso_actual == 1;         //AHORA EL PISO ACTUAL ES EL 1
    }
  }
  else
    if (boton2 || boton5) {  // SI SE PRESIonA EL boton DEL PISO 2 DENTRO O FUERA DE LA CABINA
        Serial.println("Piso 2 requerido");
        if (piso_actual == 1) {       // SI EL PISO ACTUAL ES EL 1
            subir();
            delay(1000); //TIEMPO DE SUBIDA DEL PISO 1 AL PISO 2
            parar();
            piso_actual == 2; //AHORA EL PISO ACTUAL ES 2
       }
    if (piso_actual == 3){  //SI EL PISO ACTUAL ES EL 3
        bajar();
        delay(1000); //TIEMPO DE BAJADA DEL PISO 3 AL PISO 2
        parar();
        
        piso_actual == 2; //AHORA EL PISO ACTUAL ES 2
    }
  }
  else
    if (boton3 || boton6) { //SI SE PRESIonA EL boton DEL PISO 3 DENTRO O FUERA DE LA CABINA
        Serial.println("Piso 3 requerido");
        if (piso_actual == 1) { //SI EL PISO ACTUAL ES EL 1
            subir();
            delay(2000); //TIEMPO DE SUBIDA DEL PISO 1 AL PISO 3
            parar();
            
            piso_actual == 3; //AHORA EL PISO ACTUAL ES 3
        }
        if (piso_actual == 2){            // SI EL PISO ACTUAL ES EL 2
            subir();
            delay(1000); //TIEMPO DE SUBIDA DEL PISO 2 AL PISO 3
            parar();
            
            piso_actual == 3; //AHORA EL PISO ACTUAL ES 3
        }
  }
}

void bajar() {
  Serial.println("Bajar iniciado");
  digitalWrite(enable_motor, HIGH);   // ENCENDER MOTOR
  digitalWrite(M1_IN1, LOW);          // ARRANCAMOS MOTOR PARA BAJAR
  digitalWrite(M1_IN2, HIGH);
}

void subir() {
  Serial.println("Subir iniciado");
  digitalWrite(enable_motor, HIGH);  //ENCENDER MOTOR
  digitalWrite(M1_IN1, HIGH);       // ARRANCAMOS EL MOTOR PARA SUBIR
  digitalWrite(M1_IN2, LOW);
}

void parar() {
  Serial.println("Parar completado");
  digitalWrite(M1_IN1, LOW);          // APAGAMOS EL MOTOR
  digitalWrite(M1_IN2, LOW);  
  digitalWrite(enable_motor, LOW);    // SE DETIENE EL MOTOR
}


Y lo mas importante: Tus pulsadores no puedes definirlos como SOLO INPUT porque estan conectados al pin en modo INPUT_PULLUP.
Cuando presionas te dan un LOW y no un HIGH como esperas, entonces SIEMPRE estan activos y por eso nunca terminaba.
El código ahora corrige en el setup el modo adecuado y en el loop espera el estado de cada boton igual a LOW.
En el caso de los leds no me preocupé porque son SI/NO y memorizan el estado. En un ciclo se ponen bien pero debrías decir que el estado anterior es HIGH para que arranquen bien.

Finalmente aprovecha a usar siempre el Monitor Serie diciéndote que esta pasando en cada cambio que haces. Verás que te agrego mi modificación y espero te funcione.
Ahora lo subo, pero si usas el tuyo agrega un terminal para poder ver la salida serie a los pines 0 y 1. Conecta dos terminales que repitan que es cada pin, estan cruzados en el modulo que agregues.

Go Up