Ascensor
Dependencies: Debounced SRF05 mbed-rtos mbed
Fork of rtos_mutex by
main.cpp
- Committer:
- ProcesadoresESDJ
- Date:
- 2017-06-08
- Revision:
- 8:489cb2245a3a
- Parent:
- 7:bd0aa7f21f53
File content as of revision 8:489cb2245a3a:
#include "mbed.h" #include "SRF05.h" #include "DebouncedIn.h" #include "rtos.h" /* Para este proyecto se crearán tres hilos: 1. Sensado - correspondiente al sensado de la distancia de la cabina con respecto al SRF05. 2. Botones - correspondiente a los 8 botones instalados en el ascensor: - Tres de selección del piso deseado. - Uno de paro de emergencia. - Cuatro de llamado del ascensor en cada piso: uno en el primero (subir), uno en el tercero (bajar) y dos en el segundo (subir, bajar). 3. Pisos - correspondiente al llamado a cada uno de los pisos, dentro de su sección crítica se configurarán las salidas de los servos para la apertura de puertas en cada uno. El recurso compartido será la disponibilidad del ascensor para ser llamado, el cual se llamará "disponible". */ // Declaración de puertos de transmisión y recepción para comunicación serial Serial pc(USBTX, USBRX); // Declaración de pines para las puertas a partir de salidas PWM PwmOut servo1(PTD0); // servo 1 - primer piso PwmOut servo2(PTD5); // servo 2 - segundo piso PwmOut servo3(PTA13); // servo 3 - tercer piso int STOP=0; // estado detenido inicializado en 0 // variables de estado para el giro del motor DC - up, down int motor_up; int motor_down; // Declaración de pines para los botones DebouncedIn boton1(PTC11); // Botón de llamado desde el primer piso DebouncedIn boton2b(PTC10); // Botón de llamado desde el segundo piso para bajar DebouncedIn boton2s(PTC6); // Botón de llamado desde el segundo piso para subir DebouncedIn boton3(PTC5); // Botón de llamado desde el tercer piso DebouncedIn boton1i(PTC4); // Botón para ir al primer piso DebouncedIn boton2i(PTC3); // Botón para ir al segundo piso DebouncedIn boton3i(PTC0); // Botón para ir al tercer piso DebouncedIn boton_p(PTC7); // Botón de paro // Declaración pines del sensor de ultrasonido SRF05 sensor(PTD3,PTD1); // (Trigger, Echo) // Declaración pines digitales para los led's indicadores de piso DigitalOut led1(PTE5); // piso 1 DigitalOut led2(PTE4); // piso 2 DigitalOut led3(PTE3); // piso 3 // Declaración pines de salida para el motor principal tipo PWM para inversión de giro PwmOut ascender(PTC1); PwmOut bajada(PTC2); DigitalOut enable(PTB3); // Hilos Thread pul; Thread sen; Thread pis; //A continuación se describe el número de botones a usar // los pisos del ascensor, el botón de paro // y las distancias entre los pisos int i = 0; int botones[4]; // Botones de selección de piso int pisos[3]; // Número de pisos del ascensor int paro; // variable de paro int disponible=0; // Estado de ejecución del ascensor float distancia; // Distancia real medida del sensor float dist_p3=8.0; // Distancia del sensor al piso 3 float dist_p2=28.0; // Distancia del sensor al piso 2 float dist_p1=47.0; // Distancia del sensor al piso 1 // Evaluación de estado de los pulsadores void pulsadores(void const *args){ while(1) { // Si se presiona el botón de paro se activa el estado detenido y el estado de paro if (boton_p.read()==1){ // Lectura de boton de paro STOP=1; paro=1; } // Si se presiona el botón de llamado desde el primer piso, es porque se activó el botón 0 if (boton1.read()==1){ botones[0]=1; } // Si se presiona el botón de llamado desde el segundo piso para bajar, es porque se activó el botón 1 // Lo que hará que baje al primer piso if (boton2b.read()==1){ botones[1]=1; } // Si se presiona el botón de llamado desde el segundo piso para subir, es porque se activó el botón 2 // Lo que hará que suba al tercer piso if (boton2s.read()==1){ botones[2]=1; } // Si se presiona el botón de llamado desde tercer piso, es porque se activó el botón 3 if (boton3.read()==1){ botones[3]=1; } // Si se presiona el botón para ir al primer piso, la cabina se desplazará al primer piso if (boton1i.read()==1){ pisos[0]=1; } // Si se presiona el botón para ir al segundo piso, la cabina se desplazará al segundo piso if (boton2i.read()==1){ pisos[1]=1; } // Si se presiona el botón para ir al tercer piso, la cabina se desplazará al tercer piso if (boton3i.read()==1){ pisos[2]=1; } // Thread::wait(1000.0*0.02); } } // Función de lectura de distancia por el SRF05 void sensar(void const *args){ while(1) { distancia=sensor.read(); // Lectura del sensor //Thread::wait(1000.0*0.02); distancia=floor(distancia); } } void subir(void){ ascender.period_ms(20); bajada.period_ms(20); ascender.pulsewidth_ms(15); bajada.pulsewidth_ms(0); } void bajar(void){ ascender.period_ms(20); bajada.period_ms(20); ascender.pulsewidth_ms(0); bajada.pulsewidth_ms(8); } void parar(void){ ascender.period_ms(20); bajada.period_ms(20); ascender.pulsewidth_ms(0); bajada.pulsewidth_ms(0); } void puertas(void){ // Para el primer piso if(pisos[0]==1){ // Abrir puerta servo1.period(0.025); servo1.pulsewidth(0.0008); wait(5); // Duración apertura // Cerrar puerta servo1.period(0.025); servo1.pulsewidth(0.0008); wait(5); } // Segundo Piso else if(pisos[1]==1){ // Abrir puerta servo2.period(0.025); servo2.pulsewidth(0.0055); wait(5); // Duración apertura // Cerrar puerta servo2.period(0.025); servo2.pulsewidth(0.0008); wait(5); } // Tercer piso else{ // Abrir servo3.period(0.025); servo3.pulsewidth(0.0055); wait(5); // Duración apertura // Cerrar servo3.period(0.025); servo3.pulsewidth(0.0055); wait(5); } } void reinicio(void){ for(i=0;i==3;i++) { botones[i]=0; if(i!=3) pisos[i]=0; } } void piso (void const *args) { while(1) { if(botones[0]==1) //Llamado desde el primer piso { if(distancia<dist_p1)//si no esta en el primer piso, baja { bajar(); }else{ parar(); puertas(); botones[0]=0; } }//Fin botones[0] if(botones[1]==1) //Llamado desde el segundo piso para bajar { if(distancia<dist_p2)//si esta en el tercer piso, baja { bajar(); }else if(distancia>dist_p2){// si esta en el primer piso sube subir(); }else{ // en el segundo piso para y baja al primer piso parar(); puertas(); botones[1]=0; botones[0]=1; } }//Fin botones[1] if(botones[2]==1) //Llamado desde el segundo piso para subir { if(distancia<dist_p2)//si esta en el tercer piso, sube { subir(); }else if(distancia>dist_p2){// si esta en el primer piso baja bajar(); }else{ // en el segundo piso para y sube al tercer piso parar(); puertas(); botones[2]=0; botones[3]=1; } }//Fin botones[2] if(botones[3]==1) //Llamado desde el tercer piso { if(distancia>dist_p3)//si no esta en el primer tercer piso sube { subir(); }else{ parar(); puertas(); botones[3]=0; } }//Fin botones[3] if(pisos[0]==1)//Ir al piso 1 { botones[0]=1; pisos[0]=0; }//Fin pisos [0] if(pisos[1]==1)//Ir al piso 2 { if(distancia<dist_p2)//si esta en el tercer piso, sube { subir(); }else if(distancia>dist_p2){// si esta en el primer piso baja bajar(); }else{ // en el segundo piso para y sube al tercer piso parar(); puertas(); pisos[1]=0; } }//Fin pisos[1] if(pisos[2]==1)//Ir al piso 3 { botones[3]=1; pisos[2]=0; }//Fin pisos [2] if(STOP==1) { parar(); reinicio(); }//Fin STOP }//Fin while }//Fin piso int main(void) { parar(); pul.start(callback(pulsadores,(void *)"pulsa")); sen.start(callback(sensar,(void *)"sensor")); pis.start(callback(piso,(void *)"pisos")); }//Fin main