![](/media/cache/profiles/88620f53e8130fe210652d43137a905b.jpg.50x50_q85.jpg)
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
main.cpp@0:ac92624618d0, 2017-06-09 (annotated)
- 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?
User | Revision | Line number | New 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 | } |