Código del Ascensor. Oswaldo Andrés Giraldo Giraldo. Héctor Andrés Hoyos Ceballos. Jose Fernando Montoya Vargas. María Fernanda Villa Tamayo. Sistemas en Tiempo Real.

Dependencies:   SRF05 mbed-rtos mbed

Committer:
joshema216
Date:
Fri Jun 09 15:52:51 2017 +0000
Revision:
0:ac92624618d0
C?digo del ascensor. Sistemas en Tiempo Real.; Oswaldo Andr?s Giraldo Giraldo. H?ctor Andr?s Hoyos Ceballos. Jose Fernando Montoya Vargas. Mar?a Fernanda Villa Tamayo.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
joshema216 0:ac92624618d0 1 #include "mbed.h"
joshema216 0:ac92624618d0 2 #include "SRF05.h" // Librería del sensor de nivel.
joshema216 0:ac92624618d0 3 #include "rtos.h" // Librería de tiempo real.
joshema216 0:ac92624618d0 4
joshema216 0:ac92624618d0 5 // PUERTAS.
joshema216 0:ac92624618d0 6 PwmOut servo1(PTB0); // Declaración del servomotor de la puerta del piso 1.
joshema216 0:ac92624618d0 7 PwmOut servo2(PTB1); // Declaración del servomotor de la puerta del piso 2.
joshema216 0:ac92624618d0 8 PwmOut servo3(PTB2); // Declaración del servomotor de la puerta del piso 3.
joshema216 0:ac92624618d0 9 // Ejemplo:
joshema216 0:ac92624618d0 10 /*servo1.period(0.025);
joshema216 0:ac92624618d0 11 servo2.period(0.025);
joshema216 0:ac92624618d0 12 servo3.period(0.025);
joshema216 0:ac92624618d0 13 servo1.pulsewidth(0.00055);
joshema216 0:ac92624618d0 14 servo2.pulsewidth(0.0022);
joshema216 0:ac92624618d0 15 servo3.pulsewidth(0.0022);*/
joshema216 0:ac92624618d0 16
joshema216 0:ac92624618d0 17 // MOTOR.
joshema216 0:ac92624618d0 18 PwmOut giro1(PTC1);
joshema216 0:ac92624618d0 19 PwmOut giro2(PTC2);
joshema216 0:ac92624618d0 20 DigitalOut enable(PTB3);
joshema216 0:ac92624618d0 21 // Ejemplo:
joshema216 0:ac92624618d0 22 // giro1.period_ms(20);
joshema216 0:ac92624618d0 23 // giro2.period_ms(20);
joshema216 0:ac92624618d0 24
joshema216 0:ac92624618d0 25 // PULSADORES.
joshema216 0:ac92624618d0 26 /*DebouncedIn boton1(PTC11); // Botones de la parte frontal del ascensor.
joshema216 0:ac92624618d0 27 DebouncedIn boton2b(PTC10); // En este caso no se va a utilizar.
joshema216 0:ac92624618d0 28 DebouncedIn boton2s(PTC6);
joshema216 0:ac92624618d0 29 DebouncedIn boton3(PTC5);*/
joshema216 0:ac92624618d0 30
joshema216 0:ac92624618d0 31 // Botones de la parte de abajo del ascensor.
joshema216 0:ac92624618d0 32 DigitalIn boton1i(PTC4); // Piso 1.
joshema216 0:ac92624618d0 33 DigitalIn boton2i(PTC3); // Piso 2.
joshema216 0:ac92624618d0 34 DigitalIn boton3i(PTC0); // Piso 3.
joshema216 0:ac92624618d0 35 DigitalIn botonp(PTC7); // Paro de emergencia.
joshema216 0:ac92624618d0 36
joshema216 0:ac92624618d0 37 // SENSOR DE NIVEL.
joshema216 0:ac92624618d0 38 SRF05 sensor(PTD3, PTD1); // Declaración del sensor de nivel. objeto de tipo SRF05
joshema216 0:ac92624618d0 39
joshema216 0:ac92624618d0 40 // LEDS.
joshema216 0:ac92624618d0 41 DigitalOut led1(PTE5);
joshema216 0:ac92624618d0 42 DigitalOut led2(PTE4);
joshema216 0:ac92624618d0 43 DigitalOut led3(PTE3);
joshema216 0:ac92624618d0 44
joshema216 0:ac92624618d0 45 // VARIABLES AUXILIARES.
joshema216 0:ac92624618d0 46 float med = 0; // Medida actual del sensor de nivel (distancia).
joshema216 0:ac92624618d0 47 float piso1; // Valor de distancia del sensor al piso 1.
joshema216 0:ac92624618d0 48 float piso2; // Valor de distancia del sensor al piso 2.
joshema216 0:ac92624618d0 49 float piso3; // Valor de distancia del sensor al piso 3.
joshema216 0:ac92624618d0 50
joshema216 0:ac92624618d0 51 int llamada1 = 0; // Variable que indica que se llamó el ascensor desde el piso 1.
joshema216 0:ac92624618d0 52 int llamada2 = 0; // Variable que indica que se llamó el ascensor desde el piso 2.
joshema216 0:ac92624618d0 53 int llamada3 = 0; // Variable que indica que se llamó el ascensor desde el piso 3.
joshema216 0:ac92624618d0 54 int pAbiertas = 0; // Variable que indica que las puertas se encuentran abiertas.
joshema216 0:ac92624618d0 55
joshema216 0:ac92624618d0 56 // HILOS Y SEMÁFOROS.
joshema216 0:ac92624618d0 57 Thread t1; // Hilo del sensor.
joshema216 0:ac92624618d0 58 Thread t2; // Hilo de los servomotores.
joshema216 0:ac92624618d0 59 Thread t3; // Hilo del movimiento del motor.
joshema216 0:ac92624618d0 60 Semaphore sem(1); // Semáforo.
joshema216 0:ac92624618d0 61
joshema216 0:ac92624618d0 62 void medida(){ // Función de la medida del sensor de nivel.
joshema216 0:ac92624618d0 63 while(1){
joshema216 0:ac92624618d0 64 med = sensor.read(); // Realiza la lectura de la posición actual del ascensor. SRF05
joshema216 0:ac92624618d0 65 }
joshema216 0:ac92624618d0 66 }
joshema216 0:ac92624618d0 67
joshema216 0:ac92624618d0 68 void puertas(){ // Función de la apertura y cierre de puertas.
joshema216 0:ac92624618d0 69 while(1){
joshema216 0:ac92624618d0 70 if(med == piso1 && llamada1 == 1){
joshema216 0:ac92624618d0 71 sem.wait();
joshema216 0:ac92624618d0 72 servo1.period(0.02);
joshema216 0:ac92624618d0 73 servo1.pulsewidth(0.002); // Activar el servo 1 moviéndolo a 90°.
joshema216 0:ac92624618d0 74 pAbiertas = 1;
joshema216 0:ac92624618d0 75 Thread::wait(5000); // Esperar 5 segundos.
joshema216 0:ac92624618d0 76 servo1.period(0.02);
joshema216 0:ac92624618d0 77 servo1.pulsewidth(0.0015); // Activar el servo 1 moviéndolo a 0°.
joshema216 0:ac92624618d0 78 pAbiertas = 0;
joshema216 0:ac92624618d0 79 llamada1 = 0;
joshema216 0:ac92624618d0 80 sem.release();
joshema216 0:ac92624618d0 81 }
joshema216 0:ac92624618d0 82 if(med == piso2 && llamada2 == 1){
joshema216 0:ac92624618d0 83 sem.wait();
joshema216 0:ac92624618d0 84 servo2.period(0.02);
joshema216 0:ac92624618d0 85 servo2.pulsewidth(0.002); // Activar el servo 2 moviéndolo a 90°.
joshema216 0:ac92624618d0 86 pAbiertas = 1;
joshema216 0:ac92624618d0 87 Thread::wait(5000); // Esperar 5 segundos.
joshema216 0:ac92624618d0 88 servo2.period(0.02);
joshema216 0:ac92624618d0 89 servo2.pulsewidth(0.0015); // Activar el servo 2 moviéndolo a 0°.
joshema216 0:ac92624618d0 90 llamada2 = 0;
joshema216 0:ac92624618d0 91 sem.release();
joshema216 0:ac92624618d0 92 }
joshema216 0:ac92624618d0 93 if(med == piso3 && llamada3 == 1){
joshema216 0:ac92624618d0 94 sem.wait();
joshema216 0:ac92624618d0 95 servo3.period(0.02);
joshema216 0:ac92624618d0 96 servo3.pulsewidth(0.002); // Activar el servo 3 moviéndolo a 90° (abrir).
joshema216 0:ac92624618d0 97 pAbiertas = 1;
joshema216 0:ac92624618d0 98 Thread::wait(5000); // Esperar 5 segundos.
joshema216 0:ac92624618d0 99 servo3.period(0.02);
joshema216 0:ac92624618d0 100 servo3.pulsewidth(0.0015); // Activar el servo 3 moviéndolo a 0° (cerrar).
joshema216 0:ac92624618d0 101 pAbiertas = 0;
joshema216 0:ac92624618d0 102 llamada3 = 0;
joshema216 0:ac92624618d0 103 sem.release();
joshema216 0:ac92624618d0 104 }
joshema216 0:ac92624618d0 105 }
joshema216 0:ac92624618d0 106 }
joshema216 0:ac92624618d0 107
joshema216 0:ac92624618d0 108 void mover(){ // Función del movimiento del ascensor.
joshema216 0:ac92624618d0 109 while(1){
joshema216 0:ac92624618d0 110 if(!boton1i && med != piso1 && med < piso1 && pAbiertas != 1){ // Pulsar el botón de piso 1.
joshema216 0:ac92624618d0 111 sem.wait();
joshema216 0:ac92624618d0 112 llamada1 = 1;
joshema216 0:ac92624618d0 113 while(med <= piso1){ // Bajar al piso 1 desde cualqueira de los demás pisos.
joshema216 0:ac92624618d0 114 giro1.period(0.02); // Activar giro1 (bajar).
joshema216 0:ac92624618d0 115 giro1.pulsewidth(0.01);
joshema216 0:ac92624618d0 116 giro2.period(0.02);
joshema216 0:ac92624618d0 117 giro2.pulsewidth(0);
joshema216 0:ac92624618d0 118 if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor.
joshema216 0:ac92624618d0 119 break;
joshema216 0:ac92624618d0 120 }
joshema216 0:ac92624618d0 121 }
joshema216 0:ac92624618d0 122 giro1.period(0.02); // Parar.
joshema216 0:ac92624618d0 123 giro1.pulsewidth(0);
joshema216 0:ac92624618d0 124 sem.release();
joshema216 0:ac92624618d0 125 }
joshema216 0:ac92624618d0 126 if(!boton2i && med != piso2 && med < piso2 && pAbiertas != 1){ // Pulsar el botón de piso 2.
joshema216 0:ac92624618d0 127 sem.wait();
joshema216 0:ac92624618d0 128 llamada2 = 1;
joshema216 0:ac92624618d0 129 while(med <= piso2){ // Bajar al piso 2 desde el tercer piso.
joshema216 0:ac92624618d0 130 giro1.period(0.02); // Activar giro1 (bajar).
joshema216 0:ac92624618d0 131 giro1.pulsewidth(0.01);
joshema216 0:ac92624618d0 132 giro2.period(0.02);
joshema216 0:ac92624618d0 133 giro2.pulsewidth(0);
joshema216 0:ac92624618d0 134 if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor.
joshema216 0:ac92624618d0 135 break;
joshema216 0:ac92624618d0 136 }
joshema216 0:ac92624618d0 137 }
joshema216 0:ac92624618d0 138 giro1.period(0.02); // Parar.
joshema216 0:ac92624618d0 139 giro1.pulsewidth(0);
joshema216 0:ac92624618d0 140 sem.release();
joshema216 0:ac92624618d0 141 }
joshema216 0:ac92624618d0 142 if(!boton2i && med != piso2 && med > piso2 && pAbiertas != 1){ // Pulsar el botón de piso 2.
joshema216 0:ac92624618d0 143 sem.wait();
joshema216 0:ac92624618d0 144 llamada2 = 1;
joshema216 0:ac92624618d0 145 while(med >= piso2){ // Subir al piso 2 desde el primer piso.
joshema216 0:ac92624618d0 146 giro1.period(0.02); // Activar giro2 (subir).
joshema216 0:ac92624618d0 147 giro1.pulsewidth(0);
joshema216 0:ac92624618d0 148 giro2.period(0.02);
joshema216 0:ac92624618d0 149 giro2.pulsewidth(0.01);
joshema216 0:ac92624618d0 150 if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor.
joshema216 0:ac92624618d0 151 break;
joshema216 0:ac92624618d0 152 }
joshema216 0:ac92624618d0 153 }
joshema216 0:ac92624618d0 154 giro2.period(0.02); // Parar.
joshema216 0:ac92624618d0 155 giro2.pulsewidth(0);
joshema216 0:ac92624618d0 156 sem.release();
joshema216 0:ac92624618d0 157 }
joshema216 0:ac92624618d0 158 if(!boton3i && med != piso2 && med > piso3 && pAbiertas != 1){ // Pulsar el botón de piso 3.
joshema216 0:ac92624618d0 159 sem.wait();
joshema216 0:ac92624618d0 160 llamada3 = 1;
joshema216 0:ac92624618d0 161 while(med >= piso3){ // Subir al piso 2 desde el primer piso.
joshema216 0:ac92624618d0 162 giro1.period(0.02); // Activar giro2 (subir).
joshema216 0:ac92624618d0 163 giro1.pulsewidth(0);
joshema216 0:ac92624618d0 164 giro2.period(0.02);
joshema216 0:ac92624618d0 165 giro2.pulsewidth(0.01);
joshema216 0:ac92624618d0 166 if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor.
joshema216 0:ac92624618d0 167 break;
joshema216 0:ac92624618d0 168 }
joshema216 0:ac92624618d0 169 }
joshema216 0:ac92624618d0 170 giro2.period(0.02); // Parar.
joshema216 0:ac92624618d0 171 giro2.pulsewidth(0);
joshema216 0:ac92624618d0 172 sem.release();
joshema216 0:ac92624618d0 173 }
joshema216 0:ac92624618d0 174 if(!boton1i && med == piso1){ // Pulsar el botón de piso 1 en el primer piso.
joshema216 0:ac92624618d0 175 sem.wait();
joshema216 0:ac92624618d0 176 llamada1 = 1;
joshema216 0:ac92624618d0 177 sem.release();
joshema216 0:ac92624618d0 178 }
joshema216 0:ac92624618d0 179 if(!boton2i && med == piso2){ // Pulsar el botón de piso 2 en el segundo piso.
joshema216 0:ac92624618d0 180 sem.wait();
joshema216 0:ac92624618d0 181 llamada2 = 1;
joshema216 0:ac92624618d0 182 sem.release();
joshema216 0:ac92624618d0 183 }
joshema216 0:ac92624618d0 184 if(!boton3i && med == piso3){ // Pulsar el botón de piso 3 en el tercer piso.
joshema216 0:ac92624618d0 185 sem.wait();
joshema216 0:ac92624618d0 186 llamada3 = 1;
joshema216 0:ac92624618d0 187 sem.release();
joshema216 0:ac92624618d0 188 }
joshema216 0:ac92624618d0 189 }
joshema216 0:ac92624618d0 190 }
joshema216 0:ac92624618d0 191
joshema216 0:ac92624618d0 192 int main(){ // Función principal.
joshema216 0:ac92624618d0 193 t1.start(medida);
joshema216 0:ac92624618d0 194 t2.start(puertas);
joshema216 0:ac92624618d0 195 t3.start(mover);
joshema216 0:ac92624618d0 196 enable = 1; // Habilitar el Puente H.
joshema216 0:ac92624618d0 197 }