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:

FaseSemáforo 1Semáforo 2Tiempo
1VerdeRojo7 segundos
2AmarilloRojo2 segundos
3RojoVerde7 segundos
4RojoAmarillo2 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áforoLuzPin Arduino UNO
1Rojo (R1)7
1Amarillo (A1)8
1Verde (V1)9
2Rojo (R2)4
2Amarillo (A2)5
2Verde (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áforoLuzGPIO ESP8266Etiqueta en la placa
1Rojo (R1)12D6
1Amarillo (A1)13D7
1Verde (V1)14D5
2Rojo (R2)5D1
2Amarillo (A2)4D2
2Verde (V2)16D0

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

Entradas populares de este blog

Semáforo Esquinero de Dos Vías con Temporizadores NE555

Control secuencial de un motor paso a paso 28BYJ-48 mediante una máquina de estados de 2 bits

Contador binario ascendente y descendente utilizando el reloj como bit menos significativo