Semáforo con barrera y detección de obstáculos

Introducción

En este proyecto vamos a crear un semáforo con barrera que permita la detección de obstáculos cuyo control se realizará con una placa Arduino UNO y su estructura estará formada con piezas de Makeblock.

La funcionalidad será la siguiente:

    1. El semáforo irá cambiando automáticamente entre los distintos colores (verde, amarillo y rojo).
    2. Cuando el semáforo se encuentre en color verde la barrera se encontrará levantada.
    3. Cuando la barrera esté a punto de bajarse el semáforo empezará a parpadear en color amarillo acompañado de un aviso sonoro.
    4. Cuando la barrera esté bajando el semáforo se pondrá en color amarillo fijo y entrará en funcionamiento el sensor de ultrasonidos para detectar un posible obstáculo. Si se detecta un objeto a menos de 20 cm la barrera se levantará automáticamente y el semáforo se pondrá de color verde. Si no se detecta ningún obstáculo la barrera permanecerá bajada y el semáforo en color rojo.
    5. Únicamente se detectarán los obstáculos cuando la barrera esté bajando.

Para este proyecto he utilizado una placa basada en Arduino UNO de la marca Keyestudio con “pin header interface” que posee por cada pin una entrada de alimentación +5V y GND lo que nos facilitará y simplificará el interconexionado de los distintos elementos pero podéis utilizar como alternativa un Arduino UNO con un Arduino Sensor Shield. Con el fin de simplificar también el diseño he utilizado de la misma marca el módulo Keyestudio Traffic Light para la realización del semáforo.

Listado de componentes

Electrónica

    • Placa Keyestudio UNO con pin header interface (también se puede usar un Arduino UNO con un Arduino Sensor Shield).
    • Sensor de ultrasonidos HC-SR04.
    • Micro Servo 9g SG90 TowerPro.
    • Módulo Buzzer pasivo de Keyestudio.
    • Módulo Keyestudio Traffic Light.
    • 11 cables de tipo Dupont hembra – hembra de 20 cm de longitud de diferentes colores.
    • 4 cables de tipo Dupont macho – hembra de 20 cm de longitud de diferentes colores.
    • Conector de alimentación tipo jack de 5.5 x 2.1mm.

Alimentación

    • 2 pilas Panasonic NCR18650B de Li-Ion recargables ( 3400 mAh, 3.7V).
    • Portapilas para dos pilas 18650 con cable alimentación.

Estructura

    • 1  placa 7×9 B (Makeblock).
    • 3  ángulos 3×3 (Makeblock).
    • 1  viga 0824 176mm (Makeblock).
    • 4  vigas recortables 80mm (Makeblock).
    • 1  placa l1(Makeblock).
    • 4  separadores de 20 mm de longitud para tornillería de M4 (métrica 4).
    • 1  separador de 20 mm de longitud para tornillería de M3 (métrica 3).
    • 5  tornillos de M3 de 8 o 10 mm de longitud.
    • 3  tuercas para tornillos de M3.
    • 7  tornillos Allen Planos de M4 de 14 mm de longitud (Makeblock).
    • 7  tornillos Allen Planos de M4 de 8 mm de longitud (Makeblock).
    • 9  tuercas para tornillos de M4.

Montaje

Empezaremos por el montaje de la base que la realizaremos mediante la placa 7×9 B y 4 separadores de 20 mm de longitud de M4:

Previo al montaje del servomotor en la estructura necesitaremos aumentar el diámetro de los agujeros que por defecto trae el chasis del servo que son de M2 a M3 para de esta manera poder acoplar correctamente el servomotor en la estructura mediante tornillería de M3.

Una vez realizado el aumento del diámetro ya podemos acoplar el servomotor mediante dos tornillos y dos tuercas de M3 en las estructuras (ángulos 3×3) tal y como se muestra en la siguientes fotografías:

Ahora toca acoplar el módulo Keyestudio Traffic Light a una viga recortable de 80 mm mediante un tornillo y tuerca de M3 tal y como se muestra en las siguientes imágenes:

Seguidamente fijaremos la viga que contiene el semáforo a la viga 0824 de 176 mm mediante 2 tornillos Allen Planos de M4 de 14 mm de longitud junto con sus respectivas tuercas:

Para poder acoplar el sensor de ultrasonidos HC-SR04 a la estructura de ángulo 3 x 3 necesitaremos cortar una viga recortable de 80 mm para dejar una pieza de solo 3 agujeros tal y como se muestra en la siguiente imagen:

Por otro lado uniremos 4 conectores de cable dupont hembra – hembra mediante cinta aislante negra con el fin de facilitar el montaje:

Mediante 2 tornillos Allen Planos de M4 de 14 mm de longitud junto con sus respectivas tuercas aprisionaremos (lo justo para que quede bien sujeto) los 4 conectores dupont entre la estructura de ángulo 3 x 3 y la pieza recortada de la viga de 80 mm para finalmente conectar el sensor de ultrasonidos:

Para la creación de la barrera uniremos dos vigas recortables de 80 mm mediante un tornillo Allen Plano de M4 de 8mm de longitud con su respectiva tuerca:

Ahora ya tenemos todos los elementos necesarios para empezar el montaje final.

Para comenzar el montaje final fijaremos el servomotor a la base mediante un tornillo Allen Plano de M4 de 8 mm de longitud junto a una tuerca de M4 en la parte inferior:

Posteriormente fijaremos el sensor de ultrasonidos a la base mediante un tornillo Allen Plano de M4 de 14 mm de longitud junto a una tuerca de M4 en la parte inferior (fijaros que superponemos el ángulo 3 x 3 del servomotor con el ángulo 3 x 3 del sensor de ultrasonidos):

Ahora toca unir la viga 0824 de 176 mm que contiene el semáforo a la base a través de dos tornillos Allen Planos de M4 de 8 mm de longitud.

La barrera la uniremos con el servomotor con el tornillo y la pieza  que se muestran en la siguiente imagen y que ya vienen junto al servomotor cuando lo compramos:

Ahora añadiremos un separador de 20 mm de longitud de M3 a la base para posteriormente acoplar el módulo Buzzer pasivo de Keyestudio. Los tornillos que usamos tanto para fijar el separador a la base así como el módulo al separador serán de unos 8 / 10 mm de longitud de M3:

Ahora uniremos 4 cables de tipo Dupont hembra – hembra de 20 cm de longitud de diferentes colores con 4 cables de tipo Dupont macho – hembra de 20 cm de longitud (haciendo coincidir los mismos colores) con el fin de aumentar la longitud y poder conectar el módulo Keyestudio Traffic Light (semáforo) con la placa de Arduino.

Posteriormente conectamos los cables al módulo y pasamos los cables por la ranura central de la viga 0824 de 176 mm que taparemos con la placa  placa l1 (la cual fijaremos con dos tornillos Allen Planos de M4 de 14 mm de longitud junto a tuercas de M4) tal y como se muestra en la siguiente imágen:

En este punto solo nos faltará conectar todos los elementos a la placa Arduino y poner la alimentación.

Las conexiones a la placa Arduino UNO serán las siguientes:

    • Sensor de ultrasonidos:

    TRIGGER PIN = 3
    ECHO PIN = 4

    • Semáforo:

    LUZ ROJA PIN  = 10
    LUZ AMARILLA PIN  = 11
    LUZ VERDE PIN  = 12

    • Servo:

    SERVO PIN = 9

    • Buzzer:

    BUZZER PIN = 7

Por último alimentaremos nuestra placa mediante 2 pilas recargables Panasonic NCR18650B de Li-Ion (las cuales nos darán muchas horas de juego) a través de un conector de alimentación tipo jack de 5.5 x 2.1mm que hemos conectado al portapilas.

Ahora ya solo nos faltará cargar el Sketch a nuestra placa.

Programación

El Sketch que debemos cargar en el Arduino con la funcionalidad descrita en la introducción de este tutorial es el que se muestra a continuación:

NOTA: Se ha utilizado la librería NewPing para el sensor de Ultrasonidos.

#include <Servo.h>
#include <NewPing.h>

///////////////////////////////
// Definición de pines
///////////////////////////////

// Sensor de ultrasonidos
int TRIGGER_PIN = 3; 
int ECHO_PIN = 4;
int MAX_DISTANCIA = 200;

// Semáforo
int SEMAFORO_LUZROJA_PIN  = 10; 
int SEMAFORO_LUZAMARILLA_PIN  = 11; 
int SEMAFORO_LUZVERDE_PIN  = 12; 


// Servo
int SERVO_PIN = 9;

// Buzzer
int BUZZER_PIN = 7;

///////////////////////////////

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCIA); 
Servo servo; 

bool saltarojo = false;
int velocidad_barrera = 20;

void setup()
{
  
  // Semáforo
  pinMode(SEMAFORO_LUZROJA_PIN, OUTPUT);
  pinMode(SEMAFORO_LUZVERDE_PIN, OUTPUT); 
  pinMode(SEMAFORO_LUZAMARILLA_PIN, OUTPUT); 

  // Buzzer
  pinMode (BUZZER_PIN, OUTPUT);

  // Servo
  servo.attach(SERVO_PIN);  

  // Si el servo (la barrera) no se encuentra en su posicion inicial (levantada) la ponemos 
  if (servo.read() != 180)
  {
     servo.write(180);     
     delay(2000);          // Damos 2 seg para que de tiempo a volver a la posicion
  }
 
}

void loop()
{

  if (saltarojo == true)
    velocidad_barrera = 5;
  else
    velocidad_barrera = 20;  

  saltarojo = false;
     
  // Semáforo en verde y subiendo barrera
  digitalWrite(SEMAFORO_LUZVERDE_PIN, HIGH);
  
  int posicion_barrera = servo.read();
  for (int j=posicion_barrera; j <= 180; j++) 
  { 
    servo.write(j); 
    delay(velocidad_barrera);
  }

  // Dejar el semaforo en verde durante 5 segundos
  delay(5000);
  digitalWrite(SEMAFORO_LUZVERDE_PIN, LOW);


  // Semáforo en amarillo parpadeando 3 veces con sonido de aviso
  for(int i=0;i<3;i++)
  { 
    digitalWrite(SEMAFORO_LUZAMARILLA_PIN, HIGH);
    
    // Aviso acústico
    for (int j = 0; j <250; j++) 
    {
      digitalWrite(BUZZER_PIN, HIGH);
      delay (1);
      digitalWrite(BUZZER_PIN, LOW);
      delay (1);
    }
    
    digitalWrite(SEMAFORO_LUZAMARILLA_PIN, LOW);
    delay(500);
    
  }

  // Semáforo en amarillo fijo y bajando barrera
   digitalWrite(SEMAFORO_LUZAMARILLA_PIN, HIGH);
   
   for (int j = 180; j > 90 ; j--) 
   {
     
      unsigned int distancia = sonar.ping_cm();
      if (distancia < 20 && distancia != NO_ECHO)
      {
        digitalWrite(SEMAFORO_LUZAMARILLA_PIN, LOW);
        saltarojo = true;
        break;
      }
      servo.write(j);      
      delay(20);
      
   }

   
  // Dejar el semaforo en rojo durante 5 segundos
  if (saltarojo == false)
  {
    digitalWrite(SEMAFORO_LUZAMARILLA_PIN, LOW);
    digitalWrite(SEMAFORO_LUZROJA_PIN, HIGH);
    delay(5000);
    digitalWrite(SEMAFORO_LUZROJA_PIN, LOW);
  
  }

}