Ascensor
Dependencies: Debounced SRF05 mbed-rtos mbed
Fork of rtos_mutex by
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
Generated on Wed Jul 13 2022 06:21:18 by 1.7.2