lunes, 3 de agosto de 2015

Semáforos controlados por unidades de emergencia Segunda parte


En esta segunda parte del proyecto se explicaran las mejoras que se hicieron las cuales son:

1.- Saber qué tipo de unidad de rescate (ambulancia o patrulla) es la que activa el receptor infrarrojo para solicitar el cambio del estado próximo del semáforo

2.- Haciendo uso de un módulo de bluetooth en arduino enviar los datos pertenecientes a la unidad de rescate identificada, a una aplicación móvil


3.- La aplicación móvil de debe desplegar la información obtenida por el bluetooth, esta información indicara la fecha (dd/mm/yyyy), la hora (hh:mm:ss), tipo de unidad de rescate (ambulancia o patrulla), la calle y el número de semáforo por el que paso


4.- Como función extra  la aplicación móvil también es capaz de enviar SMS a algún otro dispositivo móvil con la misma información que esta aplicación despliega, la razón es muy simple y es que de este modo podemos enviar los datos a algún otro dispositivo que se encuentre fuera del rango de alcance del módulo bluetooth el cual es de aproximadamente 10 a 15 metros.



PROCEDIMIENTO:


Paso 1: Diferenciar las unidades de emergencia

Para poder identificar qué tipo de unidad de emergencia es la que requiere el cambio de estado del semáforo se podía hacer de varias formas, una de ellas era utilizando sensores de color o con sensores de contraste, estos sensores no los encontramos disponibles en las electrónicas cercanas solo comprado por mercado libre y debido a que no había tiempo suficiente para que nos llegase él envió decidimos seguir utilizando los receptores infrarrojos.
Cada unidad de rescate tiene un emisor de luz infrarroja ubicada a diferentes alturas de modo que cada unidad solo sea capaz de enviar el haz de luz proveniente de su emisor a un determinado receptor infrarrojo, en este caso las ambulancias son las que cargan el emisor infrarrojo en la parte baja y las patrullas en la parte de arriba con una diferencia de 3 cm entre ambos para evitar que un receptor infrarrojo detecte el equivocado.

  • -   Ambulancias con el emisor abajo
  • -   Patrullas con el emisor en la parte de arriba






Paso 2: Configuración del módulo bluetooth

Una vez solucionada la forma en que se identifica la unidad de rescate, procedimos a conectar el módulo de bluetooth, nosotros utilizamos el modelo HC-06 (Configuración bluetooth).


La conexión no es complicada, lo único que varía es que el pin RXD del módulo va conectado al pin TXD de arduino y el pin TXD del módulo al pin RXD de arduino, esto es debido a que el pin RXD se encarga de recibir datos y el TXD transmite datos, de esta forma los datos que se transmiten por del módulo en el pin TXD los recibe arduino en su pin RXD y los que recibe el modulo en RXD son los que le trasmite arduino en el pin TXD.

Para configurarlo utilizamos arduino y comandos AT, ejecute el siguiente código para configurar el modulo bluetooth.


char NOMBRE[5] = "B06"; //NOMBRE DEL BLUETOOTH
char BPS = '4'; //BAUDIOS 9600, 1 = 1200... 4 = 9600
char PASS[10] = "0000"; //CONTRASEÑA PARA VINCULAR EL DISPOSITIVO BLUETOOTH

void setup() {
  Serial.begin(9600);
  pinMode(13,OUTPUT);
  digitalWrite(13,HIGH);
  delay(10000);
  digitalWrite(13,LOW);

  Serial.print("AT");
  delay(1000);

  Serial.print("AT+NAME");
  Serial.print(NOMBRE);
  delay(1000);

  Serial.print("AT+BAUD");
  Serial.print(BPS);
  delay(1000);

  Serial.print("AT+PIN");
  Serial.print(PASS);
  delay(1000);
}



Una vez configurado el modulo Bluetooth es necesario vincularlo, para usarlo en la aplicación móvil posteriormente.



Paso 3:Crear la aplicación móvil

Para esto utilizamos una herramienta muy útil llamada APP INVENTOR (http://appinventor.mit.edu/explore/)



Esta aplicación nos facilita la creación de aplicaciones android, y es que básicamente para el desarrollo de una aplicación se basa en la creación de pantallas donde a cada pantalla tiene su vista es decir los elementos que son visibles para el usuario y el código que contiene las funciones de lo que realiza cada elemento dentro de la vista de la pantalla, en la vista se tienen distintos componentes como son botones, label, textbox, checkbox, etc, los cuales nos facilitan la construcción de la interfaz gráfica de usuario, el código se crea por medio de bloques de código los cuales no son más que todas las funciones o métodos que tiene cada elemento que se esté utilizando en la interfaz gráfica de usuario y también algunos otros elementos que se integren al proyecto pero que no son visibles para el usuario como son el bluetooth y el reloj.



Componentes utilizados para crear la aplicación:


Interfaz gráfica:


Explicación del código

Para conectar el dispositivo bluetooth del dispositivo móvil donde se encuentra ejecutando la aplicación móvil al módulo de bluetooth HC-06, lo primero que hicimos fue agregar un componente a la vista llamado list picker este componente posee dos métodos uno llamado BeforePicking este se encarga de realizar algo antes de que el list picker sea presionado, en este apartado se pregunta si el bluetooth del dispositivo móvil se encuentra disponible y si es así entonces obtiene todos los nombres de las direcciones bluetooth que se encuentran vinculadas al dispositivo móvil y estas a su vez  son agregadas como elementos al list picker, puesto que en el paso 2 ya hemos vinculado el modulo bluetooth este aparecerá dentro de esta lista.

Bloque de código BeforePicking


Después de agregar la lista de direcciones bluetooth al list picker, se utiliza el método AfterPicking este método se encarga de hacer algo después de que un elemento es seleccionado en el list picker, aquí lo que hacemos es conectar el bluetooth del dispositivo móvil utilizando el método Connectaddres del componente bluetooth este requiere de una dirección bluetooth y esta la obtenemos del elemento que se seleccione en el list picker.

Bloque de código AfterPicking


Una vez que logramos establecer una conexión entre ambos bluetooth, procedemos a configurar nuestro componente textbox, el cual estará recibiendo todos los mensajes que se reciban de arduino la cual contiene información perteneciente a la unidad de rescate que activo el receptor infrarrojo y  el semáforo al que se le solicito el cambio de estado.

Para esto utilizamos la función Timer del reloj, una función que se está ejecutando cada segundo lo primero que hacemos es verificar si el bluetooth está conectado y si los bytes que se dispone a recibir son mayores a 0, de cumplirse ambas funciones entonces en una variable global creada con anterioridad llamada btexto obtendrá los datos de la fecha actual (dd/mm/yyyy) y hora (hh:mm:ss) 

provenientes del componente reloj estos son concatenados con el tipo de vehículo, la calle por la que transita y numero de semáforo al que se le solicito el cambio de estado estos son enviados por arduino a través del módulo HC-06.

Una vez obtenida esta información en la variable btexto se la pasamos al componente textbox, debido a que el método set text de este componente sobrescribe todo lo que se tenía con anterior decidimos hacer un join el cual concatena todo lo que se tenía anteriormente en el textbox mas lo que se obtuvo en la variable global.

Posteriormente redactamos un SMS pesándole como texto, toda la información de la variable btexto, el número de teléfono el cual establecimos estático y el método SendMessage, que se encarga de enviar el mensaje

La razón por la que usamos una variable global es porque una vez utilizada la función ReceiveText para recibir el texto que envía arduino, estos datos son borrados de la función por ello tenemos que almacenarlos para que puedan ser enviados la primera vez al textbox y la segunda vez al texto del SMS, la variable global no hace falta limpiarla ya que el meto set sobrescribe todo lo que esta tenía anteriormente.


Bloque de código:





Paso 4: Armar el circuito 

Para armar el circuito lo  que se deben agregar es el modulo bluetooth y los dos receptores infrarrojos mas en cada calle los cuales deben estar un poco mas arriba que los utilizados en la parte anterior del proyecto 

Diagrama:


Paso 5: Creación y ejecución del código en arduino

Una vez armado el circuito, debe copiar y ejecutar el siguiente código, el cual es muy similar al utilizado en la parte 1 del proyecto ( Parte 1 );
.

int verde1 = 2;
int amarillo1 = 3;
int rojo1 = 4;

int verde2 = 6;
int amarillo2 = 7;
int rojo2 = 8;

int millisActuales;
int millisAnteriores=0;

int receptor1 = A1;
int receptor2 = A2;
int receptor3 = A3;
int receptor4 = A4;

int tiempo2 = 0;

void setup() {
  Serial.begin(9600);
 
  pinMode(verde1,OUTPUT);
  pinMode(amarillo1,OUTPUT);
  pinMode(rojo1,OUTPUT);
 
  pinMode(verde2,OUTPUT);
  pinMode(amarillo2,OUTPUT);
  pinMode(rojo2,OUTPUT);

  pinMode(receptor1,INPUT);
  pinMode(receptor2,INPUT);
}

void loop() {
  inicio(); 
}

void inicio(){
  millisActuales = millis();
  //Se leen los valores de los sensores infrarrojos 1 y 2
  int valor1 = analogRead(receptor1);
  int valor2 = analogRead(receptor2);
  int valor3 = analogRead(receptor3);
  int valor4 = analogRead(receptor4);

  /*
   * para calcular el tiempo exacto entre cada loop restamos los milisegundos del utimo loop (millisAnteriores) de los milisegundos actuales (millisActuales)
   * el primer loop los millisAnteriores son igual a 0, despues incrementan en 20,000 por loop y asi sucecivamente, esto se hace debido a que la funcion millis
   * no se puede reiniciar a no ser que se aplique un overflow
   *
   * Ahora tambien se agrega un valor mas, que es el tiempo2 cuya funcion es la de acelerar la trancicion de los semaforos de verde a rojo dependiendo de que semaforo sea
   *
   */ 
  int tiempo = millisActuales - millisAnteriores + tiempo2;
  if(tiempo < 7000){
    /*
     * semaforo 1 en verde y semaforo 2 en rojo por 7 segundos
     */
    digitalWrite(verde1,HIGH);
    digitalWrite(amarillo1,LOW);
    digitalWrite(rojo1,LOW);
 
    digitalWrite(verde2,LOW);
    digitalWrite(amarillo2,LOW);
    digitalWrite(rojo2,HIGH);

    /*
     * Tras obtener el valor del sensor infrarrojo numero 2, es decir el sensor ubicado en el semaforo 2
     * se compara si este valor es mayor a 90, es decir, si detecto una luz infrarroja proveniente de la unidad
     * de rescate, si la condicion se cumple entonces al tiempo2 se le asigna el valor de los milisegundos que resten
     * para terminar el estado del semaforo 1 (que esta en verde) y acelerar su transicion a rojo, haciendo que el
     * semaforo 1 pase rapidamente de verde a amarillo, dando 3 segundo a los vehiculos a pasar o detenerse
     *
     */
    if(valor3 > 140 || valor4 > 140){
      tiempo2 = 7000 - (millisActuales - millisAnteriores);
      /*
       * Si el valor3 que corresponde al receptor infrarrojo 3 incrementa a más de 90 quiere decir que
       * detecto un haz de luz infrarrojo proveniente de la unidad de emergencia, la ambulancia es la unica capaz
       * de emitir un haz de luz al receptor infrarrojo 1 o 3 (valor1 o valor3), por lo tanto los datos enviados
       * al bluetooth hacen referencia a los de una ambulancia
       */
      if(valor3 > 140){
        Serial.println();
        Serial.println("Ambulancia A019");
        Serial.println("Av. Independencia");
        Serial.println("Semaforo: 327");
        Serial.println();
      }

      /*
       * De igual forma que con el if anterior este se hace para saber si fue una patrulla la que paso por
       * el receptor infrarrojo, enviado de esta forma al bluetooth los datos pertenecientes a una patrulla
       */
      if(valor4 > 140){
        Serial.println();
        Serial.println("Patrulla P043");
        Serial.println("Av. Independencia");
        Serial.println("Semaforo: 327");
        Serial.println();
      }
    }
  }
 
  if(tiempo > 7000 && tiempo < 10000){
    digitalWrite(verde1,LOW);
    digitalWrite(amarillo1,HIGH);
    digitalWrite(rojo1,LOW);
 
    digitalWrite(verde2,LOW);
    digitalWrite(amarillo2,LOW);
    digitalWrite(rojo2,HIGH);
  }

  if(tiempo > 10000 && tiempo < 17000){
    /*
     * semaforo 1 en rojo y semaforo 2 en verde por 7 segundos
     */
    digitalWrite(verde1,LOW);
    digitalWrite(amarillo1,LOW);
    digitalWrite(rojo1,HIGH);
 
    digitalWrite(verde2,HIGH);
    digitalWrite(amarillo2,LOW);
    digitalWrite(rojo2,LOW);

    /*
     * Esta funcion es similar a la anterior del semaforo 1, solo que en esta se comprueba si el
     * sensor infrarrojo 1, que se encuentra en el semaforo 1 detecto luz infrarroja para acelerar
     * la transicion del semaforo 2 a rojo, pasando primero por un cambio a amarillo de 3 segundos
     * nuevamente para que los vehiculos tengan tiempo de pasar o detenerse.
     */
    if(valor1 > 140 || valor2 > 140){
      tiempo2 = 17000 - (millisActuales - millisAnteriores);

      /*
       * Solo la ambulancia es capaz de incrementar los valores del receptor infrarrojo 1 o 3 (valor1 o valor3)
       */
      if(valor1 > 140){
        Serial.println();
        Serial.println("Ambulancia A019");
        Serial.println("Av. Independencia");
        Serial.println("Semaforo: 327");
        Serial.println();
      }

      /*
       * Solo la patrulla es capaz de incrementar los valores del receptor infrarrojo 2 o 4 (valor2 o valor4)
       */
      if(valor2 > 140){
        Serial.println();
        Serial.println("Patrulla P043");
        Serial.println("Av. Independencia");
        Serial.println("Semaforo: 327");
        Serial.println();
      }
     
    }
  }

  if(tiempo > 17000 && tiempo < 20000){
    digitalWrite(verde1,LOW);
    digitalWrite(amarillo1,LOW);
    digitalWrite(rojo1,HIGH);
 
    digitalWrite(verde2,LOW);
    digitalWrite(amarillo2,HIGH);
    digitalWrite(rojo2,LOW);
  }

  if(tiempo > 20000){
    /*
    * Una vez terminados 20 segundos el valor de millisAnteriores pasa a ser el de los millisActuales para que el
    * tiempo nunca supere los 20 segundos, y siempre sea un ciclo entre 0 y 20 segundos.
    */
    millisAnteriores = millisActuales;
   
    /*
     * La variable tiempo2 la tenemos definida global y su valor se mantiene tras realizarce cada loop por ello
     * que se resete su valor a 0
     */
    
    tiempo2 = 0;
  }
}



Paso 6: Pruebas







Nota: Puede descargar la aplicación móvil(.apk) o descargar el archivo del desarrollo de la aplicación 
(.aia) y realizar las modificaciones que desee en app inventor .





FIN  :)


-------------------------------------------------------------------------------

No hay comentarios:

Publicar un comentario