joshema 216 / Mbed 2 deprecated Ascensor

Dependencies:   SRF05 mbed-rtos mbed

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" // Librería del sensor de nivel.
00003 #include "rtos.h" // Librería de tiempo real.
00004 
00005 // PUERTAS.
00006 PwmOut servo1(PTB0); // Declaración del servomotor de la puerta del piso 1.
00007 PwmOut servo2(PTB1); // Declaración del servomotor de la puerta del piso 2.
00008 PwmOut servo3(PTB2); // Declaración del servomotor de la puerta del piso 3.
00009     // Ejemplo:
00010     /*servo1.period(0.025); 
00011     servo2.period(0.025);
00012     servo3.period(0.025);
00013     servo1.pulsewidth(0.00055);
00014     servo2.pulsewidth(0.0022);
00015     servo3.pulsewidth(0.0022);*/
00016     
00017 // MOTOR.
00018 PwmOut giro1(PTC1);
00019 PwmOut giro2(PTC2);
00020 DigitalOut enable(PTB3);
00021     // Ejemplo:
00022     // giro1.period_ms(20);
00023     // giro2.period_ms(20);
00024 
00025 // PULSADORES.
00026 /*DebouncedIn boton1(PTC11); // Botones de la parte frontal del ascensor.
00027 DebouncedIn boton2b(PTC10);  // En este caso no se va a utilizar.
00028 DebouncedIn boton2s(PTC6);
00029 DebouncedIn boton3(PTC5);*/
00030 
00031 // Botones de la parte de abajo del ascensor.
00032 DigitalIn boton1i(PTC4); // Piso 1.
00033 DigitalIn boton2i(PTC3); // Piso 2.
00034 DigitalIn boton3i(PTC0); // Piso 3.
00035 DigitalIn botonp(PTC7); // Paro de emergencia.
00036 
00037 // SENSOR DE NIVEL.
00038 SRF05 sensor(PTD3, PTD1); // Declaración del sensor de nivel. objeto de tipo SRF05
00039 
00040 // LEDS.
00041 DigitalOut led1(PTE5);
00042 DigitalOut led2(PTE4);
00043 DigitalOut led3(PTE3);
00044 
00045 // VARIABLES AUXILIARES.
00046 float med = 0; // Medida actual del sensor de nivel (distancia).
00047 float piso1; // Valor de distancia del sensor al piso 1.
00048 float piso2; // Valor de distancia del sensor al piso 2.
00049 float piso3; // Valor de distancia del sensor al piso 3.
00050 
00051 int llamada1 = 0; // Variable que indica que se llamó el ascensor desde el piso 1.
00052 int llamada2 = 0; // Variable que indica que se llamó el ascensor desde el piso 2.
00053 int llamada3 = 0; // Variable que indica que se llamó el ascensor desde el piso 3.
00054 int pAbiertas = 0; // Variable que indica que las puertas se encuentran abiertas.
00055 
00056 // HILOS Y SEMÁFOROS.
00057 Thread t1; // Hilo del sensor.
00058 Thread t2; // Hilo de los servomotores.
00059 Thread t3; // Hilo del movimiento del motor.
00060 Semaphore sem(1); // Semáforo.
00061 
00062 void medida(){ // Función de la medida del sensor de nivel.
00063     while(1){
00064         med = sensor.read(); // Realiza la lectura de la posición actual del ascensor. SRF05
00065     }
00066 }
00067 
00068 void puertas(){ // Función de la apertura y cierre de puertas.
00069     while(1){
00070         if(med == piso1 && llamada1 == 1){
00071             sem.wait();
00072             servo1.period(0.02);
00073             servo1.pulsewidth(0.002); // Activar el servo 1 moviéndolo a 90°.
00074             pAbiertas = 1;
00075             Thread::wait(5000); // Esperar 5 segundos.
00076             servo1.period(0.02);
00077             servo1.pulsewidth(0.0015); // Activar el servo 1 moviéndolo a 0°.
00078             pAbiertas = 0;
00079             llamada1 = 0;
00080             sem.release();
00081         }
00082         if(med == piso2 && llamada2 == 1){
00083             sem.wait();
00084             servo2.period(0.02);
00085             servo2.pulsewidth(0.002); // Activar el servo 2 moviéndolo a 90°.
00086             pAbiertas = 1;
00087             Thread::wait(5000); // Esperar 5 segundos.
00088             servo2.period(0.02);
00089             servo2.pulsewidth(0.0015); // Activar el servo 2 moviéndolo a 0°.
00090             llamada2 = 0;
00091             sem.release();
00092         }
00093         if(med == piso3 && llamada3 == 1){
00094             sem.wait();
00095             servo3.period(0.02);
00096             servo3.pulsewidth(0.002); // Activar el servo 3 moviéndolo a 90° (abrir).
00097             pAbiertas = 1;
00098             Thread::wait(5000); // Esperar 5 segundos.
00099             servo3.period(0.02);
00100             servo3.pulsewidth(0.0015); // Activar el servo 3 moviéndolo a 0° (cerrar).
00101             pAbiertas = 0;
00102             llamada3 = 0;
00103             sem.release();
00104         }
00105     }
00106 }
00107 
00108 void mover(){ // Función del movimiento del ascensor.
00109     while(1){
00110         if(!boton1i && med != piso1 && med < piso1 && pAbiertas != 1){ // Pulsar el botón de piso 1.
00111             sem.wait();
00112             llamada1 = 1;
00113             while(med <= piso1){ // Bajar al piso 1 desde cualqueira de los demás pisos.
00114                 giro1.period(0.02); // Activar giro1 (bajar).
00115                 giro1.pulsewidth(0.01);
00116                 giro2.period(0.02);
00117                 giro2.pulsewidth(0);
00118                 if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor.
00119                     break;
00120                 }
00121             }
00122             giro1.period(0.02); // Parar.
00123             giro1.pulsewidth(0);
00124             sem.release();
00125         }
00126         if(!boton2i && med != piso2 && med < piso2 && pAbiertas != 1){ // Pulsar el botón de piso 2.
00127             sem.wait();
00128             llamada2 = 1;
00129             while(med <= piso2){ // Bajar al piso 2 desde el tercer piso.
00130                 giro1.period(0.02); // Activar giro1 (bajar).
00131                 giro1.pulsewidth(0.01);
00132                 giro2.period(0.02);
00133                 giro2.pulsewidth(0);
00134                 if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor.
00135                     break;
00136                 }
00137             }
00138             giro1.period(0.02); // Parar.
00139             giro1.pulsewidth(0);
00140             sem.release();
00141         }
00142         if(!boton2i && med != piso2 && med > piso2 && pAbiertas != 1){ // Pulsar el botón de piso 2.
00143             sem.wait();
00144             llamada2 = 1;
00145             while(med >= piso2){ // Subir al piso 2 desde el primer piso.
00146                 giro1.period(0.02); // Activar giro2 (subir).
00147                 giro1.pulsewidth(0);
00148                 giro2.period(0.02);
00149                 giro2.pulsewidth(0.01);
00150                 if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor.
00151                     break;
00152                 }
00153             }
00154             giro2.period(0.02); // Parar.
00155             giro2.pulsewidth(0);
00156             sem.release();
00157         }
00158         if(!boton3i && med != piso2 && med > piso3 && pAbiertas != 1){ // Pulsar el botón de piso 3.
00159             sem.wait();
00160             llamada3 = 1;
00161             while(med >= piso3){ // Subir al piso 2 desde el primer piso.
00162                 giro1.period(0.02); // Activar giro2 (subir).
00163                 giro1.pulsewidth(0);
00164                 giro2.period(0.02);
00165                 giro2.pulsewidth(0.01);
00166                 if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor.
00167                     break;
00168                 }
00169             }
00170             giro2.period(0.02); // Parar.
00171             giro2.pulsewidth(0);
00172             sem.release();
00173         }
00174         if(!boton1i && med == piso1){ // Pulsar el botón de piso 1 en el primer piso.
00175             sem.wait();
00176             llamada1 = 1;
00177             sem.release();
00178         }
00179         if(!boton2i && med == piso2){ // Pulsar el botón de piso 2 en el segundo piso.
00180             sem.wait();
00181             llamada2 = 1;
00182             sem.release();
00183         }
00184         if(!boton3i && med == piso3){ // Pulsar el botón de piso 3 en el tercer piso.
00185             sem.wait();
00186             llamada3 = 1;
00187             sem.release();
00188         }   
00189     }   
00190 }
00191 
00192 int main(){ // Función principal.
00193     t1.start(medida);
00194     t2.start(puertas);
00195     t3.start(mover);
00196     enable = 1; // Habilitar el Puente H.
00197 }