En las ciudades muchos delitos o muertes pueden haber sido evitadas si la ayuda de una ambulancia o la policía hubiera llegado a tiempo, en Oaxaca gran parte de la sociedad carece de una cultura vial que ayude a las personas a recibir el auxilio por parte de las unidades de socorro de manera pronta y oportuna. Todos alguna vez hemos estado en carretera mientras alguna unidad de emergencia necesita circular con libertad mientras diversas unidades de motor tienen la imposibilidad de moverse debido a la cantidad de autos que desean circular o no tienen paso por parte del semáforo.
Objetivo:
Explicar como crear una maqueta que simula el control de semáforos por unidades de emergencia como ambulancias, bomberos, etc. utilizando el microcontrolador Arduino y sensores infrarrojos.Materiales a utilizar:
| Material | Cantidad | Precio Unitario | Imagen | Configuración |
| Arduino Uno: Para poder controlar el funcionamiento de los dispositivos | 1 | $300 |
|
Info |
| Protoboard : Placa para interconectar los componentes electrónicos utilizados | 1 | $60 |
|
Info |
| Sensor infrarrojo (GP1UE26RK0VF) :Para detectar la presencia y distancia de un vehículo | 2 | $13 |
|
Info |
| Led emisor de luz infearroja(IR) :Para detectar la presencia y distancia de un vehículo | 2 | $6 | Info | |
| Leds(Verde, Rojo, Amarillo):Para simular los semaforos | 6 | $5 |
|
Info |
| Resistenciasde 220 Ohms:Para controlar la corriente adecuada en el circuito | 6 | $5 |
|
Info |
| Pila 1.5 v: Para alimentar los leds emisores de luz infrarroja que se montan en los vehículos | 2 | $20 | ||
| Cable UTPPara conectar los componetes | 1/2 metro | $10 |
|
|
| Conectores Macho- macho y hembra-Macho: Para conectar los dispositivos al arduino | 10 | $2 |
|
|
| Coches de juguetePara simular las ambuancias | 2 | $15 |
|
|
| Papel Cascaron, pinturas(gris, blanca,amarilla), tijeras, pegamento, cartulinaPara simular las calles, casas, semaforos, etc | 1 | $40 |
Presupuesto aproximado: $520
Procedimiento para armar la maqueta
1. Pintar dos calles en el papel cascaron y pintarlas según los colores que desee.
2. Armar algunas casas, escuelas, edificios según su creatividad, en este caso se compraron laminas para armas, las cuales las puede conseguir en una papelería o puede dibujar y armas sus propias casas o puede consultar la direccion: http://www.jopasi.org/casas.php, en la cual encontrará muchos moldes para armar(hospitales, Iglesias, farmacias, escuelas, etc.)
3. Armar 2 semáforos en los cuales colocaremos los leds mas adelante
4. Pegar las piezas que armó alrededor de las calles.
Una vez que tenga lista su maqueta proceda a armar el circuito electrónico para simular el funcionamiento de los semáforos inteligentes
Procedimiento para armar el circuito eléctrico
Diagrama:
1.- Primero leeremos los datos que
nos arroja el sensor infrarrojo, para ello conectamos sus pines basándonos en
su datasheet
Conexiones:
· Pin
1 - Output conectar al pin A0 de arduino
· Pin
2 - GND conectar al al pin GND de arduino
· Pin
3 – VCC a 3.3v de arduino
2.- Después conectamos un led emisor infrarrojo, la patita
más corta se conecta a una resistencia de 220 ohm y esta se conecta a GND, la
patita más larga a corriente 5v.
Para poder observar que el led esta emitiendo luz es necesario verlo a través de una cámara, debido a que la luz es imperceptible para el ojo humano
3. Ejecute el siguiente código y observe que valores muestra en la consola serial:
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println(analogRead(A0));
delay(1000);
}
|
Resultados obtenidos:
4.- Una vez que conectamos correctamente el sensor y obtener
sus datos procedemos a conectar los leds que pertenecerán a los semáforos(verde, amarillo y rojo) para
hacer las simulaciones de su funcionamiento normal, es decir sin los sensores
infrarrojos, para programar sus tiempos de cambio, la forma en la que se
alternan y en la que se sincronizan.
Semáforo 1:led Verde1--> Pin digital 2 de Arduino
led Amarillo1--> Pin digital 3 de Arduino
led Rojo1--> Pin digital 4 de Arduino
Semáforo 2:
led Verde2--> Pin digital 5 de Arduino
led amarillo2--> Pin digital 6 de Arduino
led ROjo2--> Pin digital 7 de Arduino
5. Ejecute el siguiente código para ver el funcionamiento normal de los semáforos, Se usa la función millis() debido a que se necesita estar leyendo constantemente los
datos que nos arrojan los sensores infrarrojos, y esto no es posible usando delay() los cuales pausan todos los procesos impidiendo así que se
obtengan las lecturas de los sensores infrarrojos de forma constante.
int verde1 = 2;
int amarillo1 = 3;
int rojo1 = 4;
int amarillo2 = 6;
int rojo2 = 7;
int millisActuales; //para almacenar el valor de los milisegundos que se leen de la función millis()
int millisAnteriores=0; //almacena el valor de los milisegundos tras haber terminado un loop, necesario para calcular los intervalos de tiempo entre los loops
void setup() {
Serial.begin(9600);
pinMode(verde1,OUTPUT);
pinMode(amarillo1,OUTPUT);
pinMode(rojo1,OUTPUT);
pinMode(verde2,OUTPUT);
pinMode(amarillo2,OUTPUT);
pinMode(rojo2,OUTPUT);
}
void loop() {
//se optine el valor de los milisegundos que lleva en ejecucion arduino
millisActuales = millis();
inicio();
//imprime el valor de los milisegundos
Serial.println(millisActuales);
}
void inicio(){
/*
* Para calcular el tiempo exacto entre cada loop restamos los milisegundos del ultimo loop (millisAnteriores) de los milisegundos actuales (millisActuales)
* El primer loop los millisAnteriores son igual a 0, después incrementan en 20,000 por loop y así sucesivamente, esto se hace debido a que la funcion millis, no se puede reiniciar a no ser que se aplique un overflow
*/
int tiempo = millisActuales - millisAnteriores;
if(tiempo < 7000){
//semáforo 1, led verde encendido 7 segundos
digitalWrite(verde1,HIGH);
digitalWrite(amarillo1,LOW);
digitalWrite(rojo1,LOW);
//semáforo 2, led rojo encendido 7 segundos
digitalWrite(verde2,LOW);
digitalWrite(amarillo2,LOW);
digitalWrite(rojo2,HIGH);
}
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){
digitalWrite(verde1,LOW);
digitalWrite(amarillo1,LOW);
digitalWrite(rojo1,HIGH);
digitalWrite(verde2,HIGH);
digitalWrite(amarillo2,LOW);
digitalWrite(rojo2,LOW);
}
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;
}
}
|
Resutados:
6. Ahora con el siguiente el código hace que todo funcione (que nos costó un dolor de cabeza) porque no solo es leer los datos de los sensores sino, modificar parte del
funcionamiento lógico de los semáforos para prevenir accidentes a la hora de
realizar los cambios cuando una unidad de emergencia lo requiera.
int verde1 = 2;
int amarillo1 = 3;
int rojo1 = 4;
int verde2 = 5;
int amarillo2 = 6;
int rojo2 = 7;
int millisActuales;
int millisAnteriores=0;
const char receptor1 = A0;
ionst char receptor2 = A1;
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);
/*
* 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 así sucesivamente, esto se hace debido a que la funcion millis no se puede reiniciar a no ser que se aplique un overflow
*
* Ahora también se agrega un valor más, que es el tiempo2 cuya función es la de acelerar la transición de los semáforos de verde a rojo dependiendo de que semáforo sea
*
*/
int tiempo = millisActuales - millisAnteriores + tiempo2;
Serial.println(tiempo);
if(tiempo < 7000){
/*
* semáforo 1 en verde y semáforo 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 número 2, es decir el sensor ubicado en el semáforo 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 condición se cumple entonces al tiempo2 se le asigna el valor de los milisegundos que resten
* para terminar el estado del semáforo 1 (que esta en verde) y acelerar su transición a rojo, haciendo que el
* semáforo 1 pase rápidamente de verde a amarillo, dando 3 segundo a los vehículos a pasar o detenerse
*
*/
if(valor2 > 90){
tiempo2 = 7000 - (millisActuales - millisAnteriores);
}
}
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){
/*
* Semáforo 1 en rojo y semáforo 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 función es similar a la anterior del semáforo 1, solo que en esta se comprueba si el
* sensor infrarrojo 1, que se encuentra en el semáforo 1 detecto luz infrarroja para acelerar
* la transición del semáforo 2 a rojo, pasando primero por un cambio a amarillo de 3 segundos
* nuevamente para que los vehículos tengan tiempo de pasar o detenerse.
*/
if(valor1 > 90){
tiempo2 = 17000 - (millisActuales - millisAnteriores);
}
}
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 realizarse cada loop por ello
* que se reinicie su valor a 0
*/
tiempo2 = 0;
}
}
|
Resultados:
8. Veamos como funcionan los semáforos con el uso de sensores infrarrojos
Funcionamiento:
El led emisor de luz infrarroja esta montado sobre la ambulancia, y el receptor de luz esta en el semáforo. El receptor de luz obtendrá valores variados de acuerdo a la distancia a la que se encuentre el emisor de luz y de acuerdo a esos valores es que se programa en el microcontrolador (Arduino Uno) el funcionamiento del semáforo (tiempo en que tarda en cambiar cada estado).
Para evitar accidentes la forma en que funcionan los
semáforos automáticos es mediante la aceleración entre sus transiciones de
estado, es decir, si el semáforo donde pasara en un determinado tiempo una
unidad de rescate se encuentra en rojo, se acelera el proceso de transición de
todos los semáforos que se encuentren alrededor de este de modo que este pueda
pasar a verde dentro de pocos segundos.
Ejemplo con dos semáforos:
Estados
|
Semáforo
1
|
Semáforo
2
|
Tiempo
|
q0
|
7
segundos
|
||
q1
|
3
segundo
|
||
q2
|
7
segundos
|
||
q3
|
3
segundo
|
Suponiendo que el estado actual es q0 y una unidad de
rescate este próxima al semáforo 2, entonces rápidamente se acelera la
transición del estado q0 a q1, quitando así los segundos restantes (7 en este
caso) para que durante 3 segundos los vehículos que transiten por el semáforo 1
puedan o terminar de cruzar o detenerse, de este modo cuando la unidad de
rescate llegue al semáforo 2 pueda pasar sin problemas, esto se aplica de la
misma forma para el semáforo 2, si se está en el estado q2 entonces se acelera
la transición al estado q3.
Beneficios en la vida real y tiempo de vida :)
Los los semáforos inteligentes se agiliza la circulación de los vehículos, evitando el trafico que a veces se produce, en este caso con el control de los semáforos por un vehículo como las ambulancias, bomberos, etc. se ven beneficiados las personas las cuales su vida esta en peligro, permitiendo que el traslado a un hospital sea mucho mas rápido, ya que unos minutos son suficientes para poder salvar a una persona.
Los países de primer mundo tienen prácticamente todos los servicios automatizados evitando grandes problemas de tiempo. En dado caso de que nuestro prototipo se llegue a implementar en la ciudad en un futuro el tiempo de vida será mientras se le siga invirtiendo al mantenimiento y mejoras, de acuerdo a los resultados que obtenga su implementación en la realidad, que sin duda alguna sería un gran beneficio para la población.
Inconconvenientes :(
Muchas cosas que intentamos hacer no se lograron a la primera o simplemente no se podía y tuvimos que recurrir a distintas alternativas
1.- El primer problema que tuvimos fue cuando intentamos
utilizar un sensor infrarrojo como este:
Es un diodo receptor infrarrojo, cuya función es la de un
diodo pero este diodo solo permite el flojo de corriente en una dirección
cuando una luz infrarroja es captada por el mismo.
Por tanto si decidíamos utilizarlo se necesitaría de un
transistor como el siguiente:
Una resistencia de 100k ohm donde un extremo de la esta va
conectada a la patita más larga de nuestro diodo receptor infrarrojo y el otro
extremo de la resistencia a la gate del transistor, el colector del transistor
a corriente 5v y el emisor a un jumper que va conectado a un pin digital de
arduino y a su vez a tierra.
La intención de esto es que cuando el diodo receptor detecte
un haz de luz infrarroja deje fluir corriente a la gate del transistor y con la
resistencia de 100k ohm la gate del transistor solo reciba entre 0 a 1 amperes
la necesaria para abrir o cerrarla, en este caso el diodo dejaría pasar 1 Amper
a la gate del transistor haciendo que este deje pasar 5v del ánodo al emisor y
ello cree una lectura de HIGH en nuestro pin digital de arduino.
La razón por la que decidimos no hacerlo de esta forma, es
que encontramos otro dispositivo con el que se podía hacer todo lo anterior
mucho más fácil.
2.- Durante la práctica aprendimos sobre las desventajas de
utilizar la función delay, y que existe otra alternativa con la función millis
aunque su aplicación resulta un poco más complicada en algunos casos.
Créditos:
Díaz Jimenez Magaly P.
Leal Barragán Santiago
López López David
Créditos:
Díaz Jimenez Magaly P.
Leal Barragán Santiago
López López David














hola santiago quisiera que me expliques como funciona la aplicacion en que equipo y las caracteristicas por favor que necesito en mi computadora o celular? como puedo hacerlo sera que me explicas paso a paso gracia si podrias mandrme la informacion katerinne.ofs@gmail.com
ResponderEliminar