Construye un sencillo sistema para controlar el tráfico

Construye un semáforo con tu Arduino

Vamos a resolver un hipotético problema con nuestras placas Arduino Uno. Imagina que tienes un problema con un puente de un solo carril que cruza un río. Cada semana, uno o dos accidentes ocurren por la noche, cuando los conductores cansados circulan a través del puente sin detenerse primero para ver si el camino está despejado. Has sugerido instalar semáforos pero el alcalde quiere ver demostrado el proyecto antes de firmar la compra. Podrías alquilar luces temporales, pero son caras. En cambio, has decidido construir un modelo del puente con el tráfico utilizando LEDs y un Arduino para controlar unas luces que simulen un semáforo.

Nuestro objetivo

Nuestro objetivo es instalar semáforos de tres colores en cada extremo del carril único del puente. Las luces permiten que el tráfico fluya sólo en una dirección a la vez. Cuando los sensores situados en cualquier extremo del puente detectan un coche hará que espere mediante una luz roja. Las luces cambiarán y permitirán que el tráfico fluya en la dirección opuesta.

El Algoritmo

Usaremos dos botones para simular los sensores del vehículo en cada extremo del puente. Cada juego de luces tendrá LEDs rojos, amarillos y verdes. Inicialmente, el sistema permitirá que el tráfico fluya de oeste a este, por lo que las luces orientadas a la oeste se pondrán a verde y las luces de la del este se pondrán en rojo.

Cuando un vehículo se acerca al puente y que acabará pulsando el botón la luz es roja, entonces el sistema encenderá la luz en el lado opuesto de verde a amarillo y a rojo, y luego tendrá que un período de tiempo establecido para permitir que cualquier vehículo que se encuentre ya en el puente pueda terminar el cruce. A continuación, la luz amarilla encendida en ell lado del vehículo en espera parpadeará como un aviso de «prepararse» para el conductor y finalmente la luz cambiará a verde. La luz permanecerá verde hasta que el coche se acerque al otro lado, momento en el que se repite el proceso.

Lista de componentes

Esto es lo que necesitarás para crear este proyecto:

  • Dos LEDs rojos (LED1 y LED2)
  • Dos LEDs amarillos (LED3 y LED4)
  • Dos LEDs verdes (LED5 y LED6)
  • Seis resistencias de 560 Ω (de R1 a R6)
  • Dos resistencias de 10 kΩ (R7 y R8)
  • Dos condensadores de 100 nF (C1 y C2)
  • Dos pulsadores (S1 y S2)
  • Una placa de medición de tamaño mediano
  • Un Arduino y un cable USB
  • Varios cables de conexión

El Esquema

Debido a que estamos controlando sólo seis LEDs y recibiendo la entrada de dos botones, el diseño no será demasiado difícil. La siguiente figura nos muestra el esquema de nuestro proyecto.
semaforo arduino

El código

// Semáforo Arduino
// define the pins that the buttons and lights are connected to:
#define westButton 3
#define eastButton 13
#define westRed 2
#define westYellow 1
#define westGreen 0
#define eastRed 12
#define eastYellow 11
#define eastGreen 10
#define yellowBlinkTime 500 // 0.5 seconds for yellow light blink
boolean trafficWest = true; // west = true, east = false
int flowTime = 10000; // amount of time to let traffic flow
int changeDelay = 2000; // amount of time between color changes
void setup()
{
// setup digital I/O pins
pinMode(westButton, INPUT);
pinMode(eastButton, INPUT);
pinMode(westRed, OUTPUT);
pinMode(westYellow, OUTPUT);
pinMode(westGreen, OUTPUT);
pinMode(eastRed, OUTPUT);
pinMode(eastYellow, OUTPUT);
pinMode(eastGreen, OUTPUT);

// set initial state for lights - west side is green first
digitalWrite(westRed, LOW);
digitalWrite(westYellow, LOW);
digitalWrite(westGreen, HIGH);
digitalWrite(eastRed, HIGH);
digitalWrite(eastYellow, LOW);
digitalWrite(eastGreen, LOW);
}
void loop()
{
if ( digitalRead(westButton) == HIGH ) // request west>east traffic flow
{
if ( trafficWest != true )
// only continue if traffic flowing in the opposite (east) direction
{
trafficWest = true; // change traffic flow flag to west>east
delay(flowTime); // give time for traffic to flow
digitalWrite(eastGreen, LOW); // change east-facing lights from green
// to yellow to red
digitalWrite(eastYellow, HIGH);
delay(changeDelay);
digitalWrite(eastYellow, LOW);
digitalWrite(eastRed, HIGH);
delay(changeDelay);
for ( int a = 0; a < 5; a++ ) // blink yellow light { digitalWrite(westYellow, LOW); delay(yellowBlinkTime); digitalWrite(westYellow, HIGH); delay(yellowBlinkTime); } digitalWrite(westYellow, LOW); digitalWrite(westRed, LOW); // change west-facing lights from red to green digitalWrite(westGreen, HIGH); } } if ( digitalRead(eastButton) == HIGH ) // request east>west traffic flow
{
if ( trafficWest == true )
// only continue if traffic flow is in the opposite (west) direction
{
trafficWest = false; // change traffic flow flag to east>west
delay(flowTime); // give time for traffic to flow
digitalWrite(westGreen, LOW);
// change west lights from green to yellow to red
digitalWrite(westYellow, HIGH);
delay(changeDelay);
digitalWrite(westYellow, LOW);
digitalWrite(westRed, HIGH);
delay(changeDelay);
for ( int a = 0 ; a < 5 ; a++ ) // blink yellow light
{
digitalWrite(eastYellow, LOW);
delay(yellowBlinkTime);
digitalWrite(eastYellow, HIGH);
delay(yellowBlinkTime);
}
digitalWrite(eastYellow, LOW);
digitalWrite(eastRed, LOW); // change east-facing lights from red to green
digitalWrite(eastGreen, HIGH);
}
}
}

Nuestro código comienza usando #define en para asociar los números de pin digital con etiquetas para todos los LED utilizados, así como los dos botones.
Tenemos LEDs rojos, amarillos y verdes y un botón cada uno para cada lado del puente. La variable booleana trafficWest se utiliza para hacer un seguimiento y comprobar que la forma en que el tráfico es en realizad de oeste a este, y falso si es de este a oeste.

La variable entera flowTime es el período mínimo de tiempo que los vehículos tienen para cruzar el puente. Cuando un vehículo hace que se encienda una luz roja, el sistema retrasa este período para dar el tiempo necesario a los del otro lado para cruzar el
puente.

La variable entera variableDelay es el período de tiempo entre que hay para que los semáforos cambien de verde a amarillo y a rojo.
Antes de que el código entre en la sección void loop (), se establece para el tráfico del flujo de oeste a este en la configuración de void setup()

Una vez que se está ejecutando, el programa no hace nada hasta que uno de los botones esté presionado. Cuando se presiona el botón del lado este, la línea
if (trafficWest == true)
asegura que las luces cambian sólo si el tráfico se dirige en la dirección opuesta. El resto de la sección de código se compone de una simple secuencia de espera y luego encender y apagar varios LED para simular el tráfico. Tenéis el resultado en el siguiente vídeo.

 

 

Recordar que tanto este tutorial como el resto del artículo 10 proyectos sencillos son un extracto de su libro Arduino Workshop que su autor ha puesto en descarga gratuita, podéis conseguir el libro completo en Amazon. Este proyecto en concreto lo podéis encontrar aquí.

Pin It on Pinterest

Shares