Ascensor

Dependencies:   Debounced SRF05 mbed-rtos mbed

Fork of rtos_mutex by mbed official

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "SRF05.h"
00003 #include "DebouncedIn.h"
00004 #include "rtos.h"
00005  
00006  
00007 /*
00008 Para este proyecto se crearán tres hilos:
00009  
00010 1. Sensado - correspondiente al sensado de la distancia de la cabina con respecto al SRF05.
00011  
00012 2. Botones - correspondiente a los 8 botones instalados en el ascensor:
00013 - Tres de selección del piso deseado.
00014 - Uno de paro de emergencia.
00015 - 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).
00016  
00017 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.
00018  
00019 El recurso compartido será la disponibilidad del ascensor para ser llamado, el cual se llamará "disponible".
00020 */ 
00021  
00022 // Declaración de puertos de transmisión y recepción para comunicación serial
00023 Serial pc(USBTX, USBRX);
00024  
00025 // Declaración de pines para las puertas a partir de salidas PWM
00026 PwmOut servo1(PTD0);    // servo 1 - primer piso
00027 PwmOut servo2(PTD5);    // servo 2 - segundo piso
00028 PwmOut servo3(PTA13);    // servo 3 - tercer piso
00029 int STOP=0;                     // estado detenido inicializado en 0
00030  
00031 // variables de estado para el giro del motor DC - up, down
00032 int motor_up;
00033 int motor_down;
00034  
00035 // Declaración de pines para los botones
00036 DebouncedIn boton1(PTC11);      // Botón de llamado desde el primer piso
00037 DebouncedIn boton2b(PTC10);     // Botón de llamado desde el segundo piso para bajar
00038 DebouncedIn boton2s(PTC6);      // Botón de llamado desde el segundo piso para subir
00039 DebouncedIn boton3(PTC5);       // Botón de llamado desde el tercer piso
00040 DebouncedIn boton1i(PTC4);      // Botón para ir al primer piso
00041 DebouncedIn boton2i(PTC3);      // Botón para ir al segundo piso
00042 DebouncedIn boton3i(PTC0);      // Botón para ir al tercer piso
00043 DebouncedIn boton_p(PTC7);      // Botón de paro
00044  
00045 // Declaración pines del sensor de ultrasonido
00046 SRF05 sensor(PTD3,PTD1);        // (Trigger, Echo)
00047  
00048 // Declaración pines digitales para los led's indicadores de piso
00049 DigitalOut led1(PTE5);          // piso 1
00050 DigitalOut led2(PTE4);          // piso 2
00051 DigitalOut led3(PTE3);          // piso 3
00052  
00053 // Declaración pines de salida para el motor principal tipo PWM para inversión de giro
00054 PwmOut ascender(PTC1);    
00055 PwmOut bajada(PTC2);
00056 DigitalOut enable(PTB3);  
00057     
00058 // Hilos
00059 Thread pul;
00060 Thread sen;
00061 Thread pis;
00062  
00063    
00064 //A continuación se describe el número de botones a usar
00065 // los pisos del ascensor, el botón de paro
00066 // y las distancias entre los pisos
00067  
00068 int i = 0;
00069 int botones[4];                     // Botones de selección de piso
00070 int pisos[3];                       // Número de pisos del ascensor
00071 int paro;                           // variable de paro
00072 int disponible=0;                   // Estado de ejecución del ascensor              
00073 float distancia;                    // Distancia real medida del sensor
00074 float dist_p3=8.0;                  // Distancia del sensor al piso 3
00075 float dist_p2=28.0;                 // Distancia del sensor al piso 2
00076 float dist_p1=47.0;                 // Distancia del sensor al piso 1
00077  
00078 // Evaluación de estado de los pulsadores
00079 void pulsadores(void const *args){
00080     
00081     while(1) {
00082         
00083         // Si se presiona el botón de paro se activa el estado detenido y el estado de paro
00084         if (boton_p.read()==1){    // Lectura de boton de paro
00085             STOP=1;           
00086             paro=1; 
00087             }
00088         // Si se presiona el botón de llamado desde el primer piso, es porque se activó el botón 0   
00089         if (boton1.read()==1){
00090             botones[0]=1; 
00091             }
00092         // Si se presiona el botón de llamado desde el segundo piso para bajar, es porque se activó el botón 1
00093         // Lo que hará que baje al primer piso 
00094         if (boton2b.read()==1){
00095             botones[1]=1;
00096             }
00097         // Si se presiona el botón de llamado desde el segundo piso para subir, es porque se activó el botón 2
00098         // Lo que hará que suba al tercer piso 
00099         if (boton2s.read()==1){
00100             botones[2]=1; 
00101             }
00102         // Si se presiona el botón de llamado desde tercer piso, es porque se activó el botón 3     
00103         if (boton3.read()==1){
00104             botones[3]=1; 
00105             }
00106         // Si se presiona el botón para ir al primer piso, la cabina se desplazará al primer piso
00107         if (boton1i.read()==1){
00108             pisos[0]=1; 
00109             }
00110         // Si se presiona el botón para ir al segundo piso, la cabina se desplazará al segundo piso
00111         if (boton2i.read()==1){
00112             pisos[1]=1; 
00113             }
00114         // Si se presiona el botón para ir al tercer piso, la cabina se desplazará al tercer piso
00115         if (boton3i.read()==1){
00116             pisos[2]=1; 
00117             }
00118       // Thread::wait(1000.0*0.02);
00119     }
00120 }
00121  
00122 // Función de lectura de distancia por el SRF05
00123 void sensar(void const *args){
00124     
00125     while(1) {
00126         
00127         distancia=sensor.read();        // Lectura del sensor
00128         //Thread::wait(1000.0*0.02);
00129         distancia=floor(distancia); 
00130     }
00131 }
00132 void subir(void){ 
00133         ascender.period_ms(20);
00134         bajada.period_ms(20);
00135         ascender.pulsewidth_ms(15);
00136         bajada.pulsewidth_ms(0);
00137 }
00138  
00139 void bajar(void){
00140     
00141         ascender.period_ms(20);
00142         bajada.period_ms(20);
00143         ascender.pulsewidth_ms(0);
00144         bajada.pulsewidth_ms(8);
00145 }
00146  
00147 void parar(void){
00148         ascender.period_ms(20);
00149         bajada.period_ms(20);
00150         ascender.pulsewidth_ms(0);
00151         bajada.pulsewidth_ms(0);
00152  }
00153  
00154  
00155 void puertas(void){
00156  
00157     // Para el primer piso
00158     if(pisos[0]==1){
00159         
00160         // Abrir puerta
00161         servo1.period(0.025);   
00162         servo1.pulsewidth(0.0008);
00163         wait(5);                // Duración apertura
00164         // Cerrar puerta
00165         servo1.period(0.025);   
00166         servo1.pulsewidth(0.0008);
00167         wait(5);
00168 }
00169 // Segundo Piso
00170 else if(pisos[1]==1){
00171     // Abrir puerta
00172     servo2.period(0.025);   
00173             servo2.pulsewidth(0.0055);
00174             wait(5);                // Duración apertura
00175         // Cerrar puerta
00176         servo2.period(0.025);   
00177                 servo2.pulsewidth(0.0008);
00178         wait(5);
00179 }
00180 // Tercer piso
00181             else{
00182         // Abrir
00183 servo3.period(0.025);   
00184                 servo3.pulsewidth(0.0055);
00185 wait(5);                // Duración apertura
00186         // Cerrar
00187         servo3.period(0.025);   
00188                 servo3.pulsewidth(0.0055);
00189 wait(5);
00190 }    
00191 }
00192  
00193  
00194 void reinicio(void){
00195     for(i=0;i==3;i++)
00196         {
00197             botones[i]=0;
00198             if(i!=3)
00199                 pisos[i]=0;
00200             
00201         }
00202 }
00203  
00204 void piso (void const *args)
00205 {   
00206     while(1)
00207     {
00208         if(botones[0]==1) //Llamado desde el primer piso
00209         {
00210             if(distancia<dist_p1)//si no esta en el primer piso, baja
00211             {
00212                 bajar();
00213         }else{
00214             parar();
00215             puertas();
00216             botones[0]=0;
00217         }
00218     }//Fin botones[0]
00219  
00220     if(botones[1]==1) //Llamado desde el segundo piso para bajar
00221     {
00222         if(distancia<dist_p2)//si esta en el tercer piso, baja
00223         {
00224             bajar();
00225         }else if(distancia>dist_p2){// si esta en el primer piso sube
00226             subir();
00227  
00228         }else{  // en el segundo piso para y baja al primer piso
00229             parar();
00230             puertas();
00231             botones[1]=0;
00232             botones[0]=1;
00233         }
00234     }//Fin botones[1]
00235     
00236  
00237     if(botones[2]==1) //Llamado desde el segundo piso para subir
00238     {
00239         if(distancia<dist_p2)//si esta en el tercer piso, sube
00240         {
00241             subir();
00242         }else if(distancia>dist_p2){// si esta en el primer piso baja
00243             bajar();
00244  
00245         }else{  // en el segundo piso para y sube al tercer piso
00246             parar();
00247             puertas();
00248             botones[2]=0;
00249             botones[3]=1;
00250         }
00251     }//Fin botones[2]
00252  
00253     if(botones[3]==1) //Llamado desde el tercer piso
00254     {
00255         if(distancia>dist_p3)//si no esta en el primer tercer piso sube
00256         {
00257             subir();
00258         }else{
00259             parar();
00260             puertas();
00261             botones[3]=0;
00262         }
00263     }//Fin botones[3]
00264     
00265     if(pisos[0]==1)//Ir al piso 1
00266     {
00267         botones[0]=1;
00268         pisos[0]=0;
00269     }//Fin pisos [0]
00270     
00271     if(pisos[1]==1)//Ir al piso 2
00272     {
00273         if(distancia<dist_p2)//si esta en el tercer piso, sube
00274         {
00275             subir();
00276         }else if(distancia>dist_p2){// si esta en el primer piso baja
00277             bajar();
00278  
00279         }else{  // en el segundo piso para y sube al tercer piso
00280             parar();
00281             puertas();
00282             pisos[1]=0;
00283         }
00284  
00285     }//Fin pisos[1]
00286  
00287     if(pisos[2]==1)//Ir al piso 3
00288     {
00289         botones[3]=1;
00290         pisos[2]=0;
00291     }//Fin pisos [2]
00292     
00293     if(STOP==1)
00294     {
00295         parar();
00296         reinicio();
00297     }//Fin STOP
00298  
00299     }//Fin while
00300 }//Fin piso 
00301  
00302 int main(void)
00303 {
00304  
00305     parar();
00306     pul.start(callback(pulsadores,(void *)"pulsa"));
00307     sen.start(callback(sensar,(void *)"sensor"));
00308     pis.start(callback(piso,(void *)"pisos"));
00309  
00310 }//Fin main
00311