Tráfico Sincronizado
Autores
- Gerardo Aranda León
- Álvaro de la Orden Jimenez
- Alonso Díaz Serrano
Índice
- Introducción
- Funcionamiento
- Materiales
- Problemas durante el proyecto
- Desarrollo del proyecto
- Código
- Conclusión
Introducción
Nuestro proyecto de un sistema de trafico coordinado consiste en poder llegar a hacer un sistema fiable que se pueda llevar a la vida real y poder controlar el trafico de una intersección con diferentes componentes para dicho control.
Funcionamiento
Para llevar a cabo el proyecto empezamos con diseñar la coordinación de los diferentes componentes, tenemos dos carreteras entonces los componentes que generan ese control de tráfico lo implementamos agrupándolos en parejas (como los semáforos) ya que las carreteras son de doble sentido necesitamos 4 semáforos, en base a estos semáforos (dos grupos de dos) también coordinamos los demás componentes ya que son estos los que deciden por donde puede fluir el trafico o no.
Materiales
Placa Arduino |
Cables |
Semáforos Coches |
Zumbador |
ServoMotor |
Madera |
Pegamento/tornillos/Cinta |
Leds lumínicos |
Pajitas |
Pintura |
Resistencias |
Desplazamiento Registro |
Protoboard |
Empalmes |
Display |
Leds normales |
Problemas durante el proyecto
Al principio, tuvimos que cambiar la maqueta de cartón a madera ya que no era viable hacerlo con cartón ya que la estructura de la misma no aguantaba bien; también tuvimos problemas con las entradas de la placa de Arduino ya que en el proyecto usamos muchos componentes, también con sus cables ya que muchos de los que usábamos eran muy cortos como para poder conectarlos bien en la estructura que habíamos diseñado y con el voltaje usado al principio no nos daba para alimentar el circuito bien.
Desarrollo del proyecto
Después de hablar sobre que íbamos a presentar y tener todos los componentes, empezamos a implementar por separado la coordinación de los componentes (semáforos, valla, luces, LDR, display…) y poco a poco ir juntándolo para coordinarlo bien. En paralelo íbamos con el diseño de la maqueta, que fue un poco más lenta ya que no sabíamos como esconder los cables para que quedase el proyecto bien de cara a la entrega y presentación.
Código
#include <EasyBuzzer.h>
#include <Servo.h>
Servo servoMotor;
int latchPin = 13;
int dataPin = 11;
int clockPin = 12;
int zumbador = 10;
int latchPin2 = 9;
int dataPin2 = 8;
int clockPin2 = 7;
int latchPin3 = 5;
int dataPin3 = 6;
int clockPin3 = 4;
//byte valorRegistro3;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin2, OUTPUT);
pinMode(dataPin2, OUTPUT);
pinMode(clockPin2, OUTPUT);
pinMode(latchPin3, OUTPUT);
pinMode(dataPin3, OUTPUT);
pinMode(clockPin3, OUTPUT);
pinMode(2,OUTPUT);
pinMode(A0,INPUT);
pinMode(A1,INPUT);
pinMode(A2,INPUT);
pinMode(A3,INPUT);
EasyBuzzer.setPin(zumbador);
servoMotor.attach(3);
apagarDisplay();
servoMotor.write(0);
Serial.begin(9600);
}
void loop() {
ponerVerdeCalle1();
esperar(10000);
ponerAmarilloCalle1();
esperar(2000);
ponerVerdeCalle2();
apagarDisplay();
cuentaAtras();
apagarDisplay();
ponerAmarilloCalle2();
esperar(2000);
}
void verificarLuz(){
int umbralLuz = 300;
int valorLdr[4];
int sensores[] = {A0,A1,A2,A3};
for(int i = 0; i < 4; i++){
valorLdr[i] = analogRead(sensores[i]);
if(valorLdr[i] < umbralLuz){
encenderLeds();
}
}
if((valorLdr[0] > umbralLuz) && (valorLdr[1] > umbralLuz) && (valorLdr[2] > umbralLuz) && (valorLdr[3] > umbralLuz)){
apagarLeds();
}
}
void encenderLeds(){
digitalWrite(2, HIGH);
}
void apagarLeds(){
digitalWrite(2,LOW);
}
void bajarBarrera(){
for (int i = 0; i <= 110; i++)
{
servoMotor.write(i);
esperar(25);
}
}
void subirBarrera(){
for (int i = 110; i > 0; i–)
{
servoMotor.write(i);
delay(25);
}
}
void esperar(int tiempo){
int valor_tiempo = 0;
while(valor_tiempo < tiempo){
verificarLuz();
delay(1);
valor_tiempo++;
}
}
int sonarPitido(int duracionPitido, int pitidos) {
int suma = 0;
for (int i = 0; i < pitidos; i++) {
EasyBuzzer.update();
EasyBuzzer.beep(1200);
esperar(duracionPitido);
suma += 300;
EasyBuzzer.stopBeep();
esperar(100);
suma += 100;
}
if(suma >= 1000){
return 1000;
}
return suma;
}
void display(byte numero){
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, numero);
digitalWrite(latchPin, HIGH);
}
void display2(byte numero){
digitalWrite(latchPin2, LOW);
shiftOut(dataPin2, clockPin2, LSBFIRST, numero);
digitalWrite(latchPin2, HIGH);
}
void display3(byte numero){
digitalWrite(latchPin3, LOW);
shiftOut(dataPin3, clockPin3, LSBFIRST, numero);
digitalWrite(latchPin3, HIGH);
}
void apagarDisplay(){
display(0b00000000);
}
int parpadearDisplay(byte numero){
int suma = 0;
for(int i = 0; i < 2; i++){
apagarDisplay();
esperar(200);
display(numero);
esperar(200);
suma += 400; //200 primer delay + 200 segundo delay
}
return suma;
}
void apagarContador(){
display(0b00000000);
}
void ponerVerdeCalle1(){
subirBarrera();
display3(0b10000100);
display2(0b01100000);
}
void ponerAmarilloCalle1(){
display3(0b01000100);
}
void ponerVerdeCalle2(){
bajarBarrera();
display3(0b00110000);
display2(0b10010000);
}
void ponerAmarilloCalle2(){
display3(0b00101000);
}
void cuentaAtras(void){
int tiempoPitidos = 0;
int tiempoParpadeoDisplay = 0;
byte numeros[] = {
0b11111100, //cero
0b01100000, //uno
0b11011010, //dos
0b11110010, //tres
0b01100110, //cuatro
0b10110110, //cinco
0b10111110, //seis
0b11100000, //siete
0b11111110, //ocho
0b11110110 //nueve
};
for(int i = 9; i >= 0; i–){
if(i > 3) {
display(numeros[i]);
tiempoPitidos = sonarPitido(360, 4);
tiempoParpadeoDisplay = 0;
}else{
tiempoPitidos = sonarPitido(300, 2);
tiempoParpadeoDisplay = parpadearDisplay(numeros[i]);
}
if((1000 – tiempoPitidos – tiempoParpadeoDisplay) > 0){
esperar(1000 – tiempoPitidos – tiempoParpadeoDisplay);
}
}
}
Conclusión
Este proyecto de una maqueta escalable que consiste en control de tráfico nos ha hecho enfrentarnos a problemas que a lo mejor no se nos han planteado antes en ninguna asignatura de la carrera, ya que nunca hemos hecho un proyecto que el resultado final sea algo físico.
Con esto me refiero a problemas de diseño, como al hacer la maqueta las soluciones ingeniosas y el ser ‘avispado’ puede venir bien para el desarrollo de la misma. También el hecho de ver tu proyecto final en funcionamiento es una sensación que no hemos tenido en ninguna otra asignatura.
En resumen, este proyecto es un buen ejemplo de un desafío en el que tenemos que aplicar conocimientos que hemos aprendido en la carrera y en la asignatura, y unos problemas más prácticos para el diseño físico de la maqueta o el que se nos puede ocurrir para tener un buen resultado final.