Tráfico Sincronizado

Autores

  • Gerardo Aranda León
  • Álvaro de la Orden Jimenez
  • Alonso Díaz Serrano

Índice

  1. Introducción
  2. Funcionamiento
  3. Materiales
  4. Problemas durante el proyecto
  5. Desarrollo del proyecto
  6. Código
  7. 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.

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *