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

Revision:
0:ac92624618d0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Jun 09 15:52:51 2017 +0000
@@ -0,0 +1,197 @@
+#include "mbed.h"
+#include "SRF05.h" // Librería del sensor de nivel.
+#include "rtos.h" // Librería de tiempo real.
+
+// PUERTAS.
+PwmOut servo1(PTB0); // Declaración del servomotor de la puerta del piso 1.
+PwmOut servo2(PTB1); // Declaración del servomotor de la puerta del piso 2.
+PwmOut servo3(PTB2); // Declaración del servomotor de la puerta del piso 3.
+    // Ejemplo:
+    /*servo1.period(0.025); 
+    servo2.period(0.025);
+    servo3.period(0.025);
+    servo1.pulsewidth(0.00055);
+    servo2.pulsewidth(0.0022);
+    servo3.pulsewidth(0.0022);*/
+    
+// MOTOR.
+PwmOut giro1(PTC1);
+PwmOut giro2(PTC2);
+DigitalOut enable(PTB3);
+    // Ejemplo:
+    // giro1.period_ms(20);
+    // giro2.period_ms(20);
+
+// PULSADORES.
+/*DebouncedIn boton1(PTC11); // Botones de la parte frontal del ascensor.
+DebouncedIn boton2b(PTC10);  // En este caso no se va a utilizar.
+DebouncedIn boton2s(PTC6);
+DebouncedIn boton3(PTC5);*/
+
+// Botones de la parte de abajo del ascensor.
+DigitalIn boton1i(PTC4); // Piso 1.
+DigitalIn boton2i(PTC3); // Piso 2.
+DigitalIn boton3i(PTC0); // Piso 3.
+DigitalIn botonp(PTC7); // Paro de emergencia.
+
+// SENSOR DE NIVEL.
+SRF05 sensor(PTD3, PTD1); // Declaración del sensor de nivel. objeto de tipo SRF05
+
+// LEDS.
+DigitalOut led1(PTE5);
+DigitalOut led2(PTE4);
+DigitalOut led3(PTE3);
+
+// VARIABLES AUXILIARES.
+float med = 0; // Medida actual del sensor de nivel (distancia).
+float piso1; // Valor de distancia del sensor al piso 1.
+float piso2; // Valor de distancia del sensor al piso 2.
+float piso3; // Valor de distancia del sensor al piso 3.
+
+int llamada1 = 0; // Variable que indica que se llamó el ascensor desde el piso 1.
+int llamada2 = 0; // Variable que indica que se llamó el ascensor desde el piso 2.
+int llamada3 = 0; // Variable que indica que se llamó el ascensor desde el piso 3.
+int pAbiertas = 0; // Variable que indica que las puertas se encuentran abiertas.
+
+// HILOS Y SEMÁFOROS.
+Thread t1; // Hilo del sensor.
+Thread t2; // Hilo de los servomotores.
+Thread t3; // Hilo del movimiento del motor.
+Semaphore sem(1); // Semáforo.
+
+void medida(){ // Función de la medida del sensor de nivel.
+    while(1){
+        med = sensor.read(); // Realiza la lectura de la posición actual del ascensor. SRF05
+    }
+}
+
+void puertas(){ // Función de la apertura y cierre de puertas.
+    while(1){
+        if(med == piso1 && llamada1 == 1){
+            sem.wait();
+            servo1.period(0.02);
+            servo1.pulsewidth(0.002); // Activar el servo 1 moviéndolo a 90°.
+            pAbiertas = 1;
+            Thread::wait(5000); // Esperar 5 segundos.
+            servo1.period(0.02);
+            servo1.pulsewidth(0.0015); // Activar el servo 1 moviéndolo a 0°.
+            pAbiertas = 0;
+            llamada1 = 0;
+            sem.release();
+        }
+        if(med == piso2 && llamada2 == 1){
+            sem.wait();
+            servo2.period(0.02);
+            servo2.pulsewidth(0.002); // Activar el servo 2 moviéndolo a 90°.
+            pAbiertas = 1;
+            Thread::wait(5000); // Esperar 5 segundos.
+            servo2.period(0.02);
+            servo2.pulsewidth(0.0015); // Activar el servo 2 moviéndolo a 0°.
+            llamada2 = 0;
+            sem.release();
+        }
+        if(med == piso3 && llamada3 == 1){
+            sem.wait();
+            servo3.period(0.02);
+            servo3.pulsewidth(0.002); // Activar el servo 3 moviéndolo a 90° (abrir).
+            pAbiertas = 1;
+            Thread::wait(5000); // Esperar 5 segundos.
+            servo3.period(0.02);
+            servo3.pulsewidth(0.0015); // Activar el servo 3 moviéndolo a 0° (cerrar).
+            pAbiertas = 0;
+            llamada3 = 0;
+            sem.release();
+        }
+    }
+}
+
+void mover(){ // Función del movimiento del ascensor.
+    while(1){
+        if(!boton1i && med != piso1 && med < piso1 && pAbiertas != 1){ // Pulsar el botón de piso 1.
+            sem.wait();
+            llamada1 = 1;
+            while(med <= piso1){ // Bajar al piso 1 desde cualqueira de los demás pisos.
+                giro1.period(0.02); // Activar giro1 (bajar).
+                giro1.pulsewidth(0.01);
+                giro2.period(0.02);
+                giro2.pulsewidth(0);
+                if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor.
+                    break;
+                }
+            }
+            giro1.period(0.02); // Parar.
+            giro1.pulsewidth(0);
+            sem.release();
+        }
+        if(!boton2i && med != piso2 && med < piso2 && pAbiertas != 1){ // Pulsar el botón de piso 2.
+            sem.wait();
+            llamada2 = 1;
+            while(med <= piso2){ // Bajar al piso 2 desde el tercer piso.
+                giro1.period(0.02); // Activar giro1 (bajar).
+                giro1.pulsewidth(0.01);
+                giro2.period(0.02);
+                giro2.pulsewidth(0);
+                if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor.
+                    break;
+                }
+            }
+            giro1.period(0.02); // Parar.
+            giro1.pulsewidth(0);
+            sem.release();
+        }
+        if(!boton2i && med != piso2 && med > piso2 && pAbiertas != 1){ // Pulsar el botón de piso 2.
+            sem.wait();
+            llamada2 = 1;
+            while(med >= piso2){ // Subir al piso 2 desde el primer piso.
+                giro1.period(0.02); // Activar giro2 (subir).
+                giro1.pulsewidth(0);
+                giro2.period(0.02);
+                giro2.pulsewidth(0.01);
+                if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor.
+                    break;
+                }
+            }
+            giro2.period(0.02); // Parar.
+            giro2.pulsewidth(0);
+            sem.release();
+        }
+        if(!boton3i && med != piso2 && med > piso3 && pAbiertas != 1){ // Pulsar el botón de piso 3.
+            sem.wait();
+            llamada3 = 1;
+            while(med >= piso3){ // Subir al piso 2 desde el primer piso.
+                giro1.period(0.02); // Activar giro2 (subir).
+                giro1.pulsewidth(0);
+                giro2.period(0.02);
+                giro2.pulsewidth(0.01);
+                if(!botonp){ // Si se pulsa el botón de paro de emergencia se para el ascensor.
+                    break;
+                }
+            }
+            giro2.period(0.02); // Parar.
+            giro2.pulsewidth(0);
+            sem.release();
+        }
+        if(!boton1i && med == piso1){ // Pulsar el botón de piso 1 en el primer piso.
+            sem.wait();
+            llamada1 = 1;
+            sem.release();
+        }
+        if(!boton2i && med == piso2){ // Pulsar el botón de piso 2 en el segundo piso.
+            sem.wait();
+            llamada2 = 1;
+            sem.release();
+        }
+        if(!boton3i && med == piso3){ // Pulsar el botón de piso 3 en el tercer piso.
+            sem.wait();
+            llamada3 = 1;
+            sem.release();
+        }   
+    }   
+}
+
+int main(){ // Función principal.
+    t1.start(medida);
+    t2.start(puertas);
+    t3.start(mover);
+    enable = 1; // Habilitar el Puente H.
+}