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.
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í.
Debe estar conectado para enviar un comentario.