CONTROL DE DOS SEMÁFOROS MEDIANTE ARDUINO UNO Y ESP8266
CONTROL DE DOS SEMÁFOROS MEDIANTE ARDUINO UNO Y ESP8266
1. Introducción
En esta práctica desarrollaremos un sistema de control para dos semáforos que regulan el tránsito en dos vías que se cruzan. El proyecto tiene como finalidad aplicar los conocimientos adquiridos en electrónica digital y sistemas lógicos programables, incorporando una alternativa de implementación mediante microcontroladores.
El circuito que sirve de referencia para este ejercicio proviene de una versión desarrollada mediante lógica digital. En el diagrama original se emplean circuitos integrados como el temporizador NE555, flip-flops 7474, compuertas lógicas 7408, diodos 1N4007 y transistores 2N2222, entre otros componentes.
En aquella implementación, la generación de pulsos, la secuencia de estados y la activación de las luces se realizan mediante componentes electrónicos y circuitos lógicos interconectados.
En esta nueva versión, conservaremos el principio de funcionamiento y la secuencia de control, pero sustituiremos la lógica cableada por un programa ejecutado en un microcontrolador. Para ello utilizaremos dos alternativas:
Arduino UNO, basado en el microcontrolador ATmega328P.
Adafruit Feather HUZZAH ESP8266, basado en el microcontrolador ESP8266.
Ambas placas permiten controlar el mismo circuito de semáforos. La diferencia principal estará en la asignación de pines y en la plataforma de hardware utilizada.
2. Descripción del funcionamiento
El sistema está compuesto por dos semáforos de tres luces cada uno:
Semáforo 1: rojo, amarillo y verde.
Semáforo 2: rojo, amarillo y verde.
El funcionamiento se basa en una secuencia alternada. Mientras un semáforo habilita el paso mediante su luz verde, el otro permanece en rojo. Antes de cambiar el sentido de circulación, la luz verde se apaga y se activa la luz amarilla durante un intervalo de transición.
La secuencia se desarrolla en cuatro fases:
| Fase | Semáforo 1 | Semáforo 2 | Tiempo |
|---|---|---|---|
| 1 | Verde | Rojo | 7 segundos |
| 2 | Amarillo | Rojo | 2 segundos |
| 3 | Rojo | Verde | 7 segundos |
| 4 | Rojo | Amarillo | 2 segundos |
Consideración sobre los tiempos: los tiempos efectivos serán:
Rojo: 9 segundos.
Verde: 7 segundos.
Amarillo: 2 segundos.
El ciclo completo tiene una duración de 18 segundos.
3. Implementación con Arduino UNO
Para esta primera implementación utilizaremos una placa Arduino UNO. Cada una de las seis luces será controlada mediante una salida digital independiente.
3.1. Asignación de pines
La siguiente tabla muestra las conexiones que deberán realizarse entre Arduino UNO y el circuito de semáforos:
| Semáforo | Luz | Pin Arduino UNO |
|---|---|---|
| 1 | Rojo (R1) | 7 |
| 1 | Amarillo (A1) | 8 |
| 1 | Verde (V1) | 9 |
| 2 | Rojo (R2) | 4 |
| 2 | Amarillo (A2) | 5 |
| 2 | Verde (V2) | 6 |
Cada salida digital deberá conectarse a su correspondiente resistencia limitadora de corriente y LED, respetando la polaridad de los componentes.
3.2. Programa para Arduino UNO
El siguiente programa implementa la secuencia de funcionamiento descrita anteriormente.
// SEMAFORO DE DOS VIAS
// CÓDIGO PARA EL Adafruit Feather HUZZAH ESP8266
// Semaforo 1
const int ROJO1 = 13;// D0 DEL ESP8266
const int AMARILLO1 = 12;// D1 DEL ESP8266
const int VERDE1 = 14;// D2 DEL ESP8266
// Semaforo 2
const int ROJO2 = 4; // D5 DEL ESP8266
const int AMARILLO2 = 5; // D6 DEL ESP8266
const int VERDE2 = 16; // D7 DEL ESP8266
void setup() {
pinMode(ROJO1, OUTPUT);
pinMode(AMARILLO1, OUTPUT);
pinMode(VERDE1, OUTPUT);
pinMode(ROJO2, OUTPUT);
pinMode(AMARILLO2, OUTPUT);
pinMode(VERDE2, OUTPUT);
// Inicializar las salidas
digitalWrite(ROJO1, LOW);
digitalWrite(AMARILLO1, LOW);
digitalWrite(VERDE1, LOW);
digitalWrite(ROJO2, LOW);
digitalWrite(AMARILLO2, LOW);
digitalWrite(VERDE2, LOW);
}
void loop() {
// FASE 1: Semaforo 1 verde
// Semaforo 2 rojo
digitalWrite(ROJO1, LOW);
digitalWrite(AMARILLO1, LOW);
digitalWrite(VERDE1, HIGH);
digitalWrite(ROJO2, HIGH);
digitalWrite(AMARILLO2, LOW);
digitalWrite(VERDE2, LOW);
delay(7000);
// FASE 2: Semaforo 1 amarillo
digitalWrite(VERDE1, LOW);
digitalWrite(AMARILLO1, HIGH);
delay(2000);
// FASE 3: Semaforo 1 rojo
// Semaforo 2 verde
digitalWrite(AMARILLO1, LOW);
digitalWrite(ROJO1, HIGH);
digitalWrite(ROJO2, LOW);
digitalWrite(VERDE2, HIGH);
delay(7000);
// FASE 4: Semaforo 2 amarillo
digitalWrite(VERDE2, LOW);
digitalWrite(AMARILLO2, HIGH);
delay(2000);
// Preparar siguiente ciclo
digitalWrite(AMARILLO2, LOW);
digitalWrite(ROJO2, HIGH);
}3.3. Explicación del programa
El programa utiliza dos funciones fundamentales:
pinMode(): configura cada pin del microcontrolador como salida digital.digitalWrite(): establece el estado lógico de cada salida. El valor HIGH activa la salida y LOW la desactiva.
La función delay() permite establecer el tiempo durante el cual se mantiene cada fase. Su argumento está expresado en milisegundos. Por ejemplo, delay(7000) representa un intervalo de 7 segundos.
La función loop() ejecuta continuamente las cuatro fases, por lo que una vez finalizada la última etapa, el sistema vuelve automáticamente al inicio de la secuencia.
4. Implementación con Adafruit Feather HUZZAH ESP8266
Como segunda alternativa, utilizaremos la placa Adafruit Feather HUZZAH ESP8266.
El principio de funcionamiento y el programa son prácticamente idénticos a los utilizados con Arduino UNO. Sin embargo, debemos considerar que el ESP8266 tiene una arquitectura de pines diferente.
En este caso utilizaremos los números GPIO correspondientes a las entradas y salidas del microcontrolador.
4.1. Asignación de pines
| Semáforo | Luz | GPIO ESP8266 | Etiqueta en la placa |
|---|---|---|---|
| 1 | Rojo (R1) | 12 | D6 |
| 1 | Amarillo (A1) | 13 | D7 |
| 1 | Verde (V1) | 14 | D5 |
| 2 | Rojo (R2) | 5 | D1 |
| 2 | Amarillo (A2) | 4 | D2 |
| 2 | Verde (V2) | 16 | D0 |
Es importante distinguir entre el número GPIO y la identificación impresa en la placa. Por ejemplo, el pin D6 de la Feather HUZZAH corresponde al GPIO 12.
4.2. Programa para ESP8266
El siguiente código conserva la misma secuencia y los mismos intervalos de tiempo utilizados en Arduino UNO.
// SEMAFORO DE DOS VIAS
// Adafruit Feather HUZZAH ESP8266
// Semaforo 1
const int ROJO1 = 12;
const int AMARILLO1 = 13;
const int VERDE1 = 14;
// Semaforo 2
const int ROJO2 = 5;
const int AMARILLO2 = 4;
const int VERDE2 = 16;
void setup() {
pinMode(ROJO1, OUTPUT);
pinMode(AMARILLO1, OUTPUT);
pinMode(VERDE1, OUTPUT);
pinMode(ROJO2, OUTPUT);
pinMode(AMARILLO2, OUTPUT);
pinMode(VERDE2, OUTPUT);
// Inicializar las salidas
digitalWrite(ROJO1, LOW);
digitalWrite(AMARILLO1, LOW);
digitalWrite(VERDE1, LOW);
digitalWrite(ROJO2, LOW);
digitalWrite(AMARILLO2, LOW);
digitalWrite(VERDE2, LOW);
}
void loop() {
// FASE 1: Semaforo 1 verde
// Semaforo 2 rojo
digitalWrite(ROJO1, LOW);
digitalWrite(AMARILLO1, LOW);
digitalWrite(VERDE1, HIGH);
digitalWrite(ROJO2, HIGH);
digitalWrite(AMARILLO2, LOW);
digitalWrite(VERDE2, LOW);
delay(7000);
// FASE 2: Semaforo 1 amarillo
digitalWrite(VERDE1, LOW);
digitalWrite(AMARILLO1, HIGH);
delay(2000);
// FASE 3: Semaforo 1 rojo
// Semaforo 2 verde
digitalWrite(AMARILLO1, LOW);
digitalWrite(ROJO1, HIGH);
digitalWrite(ROJO2, LOW);
digitalWrite(VERDE2, HIGH);
delay(7000);
// FASE 4: Semaforo 2 amarillo
digitalWrite(VERDE2, LOW);
digitalWrite(AMARILLO2, HIGH);
delay(2000);
// Preparar siguiente ciclo
digitalWrite(AMARILLO2, LOW);
digitalWrite(ROJO2, HIGH);
}5. Consideraciones para la simulación en Proteus
Para realizar la simulación, se debe disponer del modelo de la placa correspondiente en Proteus y establecer las conexiones de acuerdo con la tabla de asignación de pines.
El programa se desarrolla y compila desde Arduino IDE. Posteriormente, el archivo generado se carga en las propiedades del modelo de microcontrolador utilizado en Proteus.
Es importante recordar que los dos programas son alternativas de implementación del mismo sistema. No deben ejecutarse simultáneamente sobre un mismo conjunto de luces.
Asimismo, deben respetarse las tensiones de alimentación y los niveles lógicos de cada placa. El ESP8266 trabaja con lógica de 3,3 V, mientras que Arduino UNO trabaja con lógica de 5 V. Por ello, no se deben conectar directamente señales de 5 V a las entradas del ESP8266.
6. Conclusiones
La implementación mediante microcontroladores permite simplificar considerablemente el circuito original desarrollado con lógica digital. En lugar de utilizar múltiples circuitos integrados para generar estados, establecer secuencias y controlar las salidas, estas operaciones pueden realizarse mediante un programa.
Sin embargo, esta simplificación no elimina la importancia de comprender el funcionamiento de los circuitos lógicos. Por el contrario, permite relacionar los conceptos de estados, secuencias y señales digitales con una aplicación práctica de programación de microcontroladores.
Finalmente, la utilización de Arduino UNO y ESP8266 permite comprobar que un mismo principio de funcionamiento puede implementarse en diferentes plataformas de hardware, modificando principalmente la asignación de pines y conservando la lógica del programa.

Comentarios
Publicar un comentario