Semáforos con Arduino y Minibloq

Los semáforos modernos, elementos indispensables para administrar el tráfico en las ciudades, son dispositivos que encierran cierta complejidad dentro de su aparente simplicidad. No se limitan simplemente a prender y apagar luces en una secuencia fija sino que pueden ser controlados a distancia para modificar su operación en respuesta a las condiciones dinámicas del tráfico vehicular. En este proyecto no iremos tan lejos, sólo construiremos un controlador de semáforos para una simple esquina con una placa Arduino UNO programada usando Minibloq, pero le haremos algunos agregados para aprovechar las capacidades de esta placa.

Circuito

En la Fig. 1 se puede apreciar el circuito del controlador. Como se trata de una esquina, tendremos dos semáforos, cada uno con tres luces. Cada luz es un led y los mismos, con sus respectivas resistencias limitadoras de corriente, están conectados a los pines 2, 3, 4, 5, 6 y 7 de la placa UNO que se usarán como salidas digitales.

Fig. 1. Circuito del semáforo

Programa

El programa, al menos en su versión mas simple, sólo debe ir prendiendo los leds en una secuencia preestablecida con retardos de tiempo entre ellas.

En un caso como este, donde tenemos varias salidas y distintas combinaciones, es conveniente representar en forma de tabla las distintas secuencias por las que debe ir pasando el programa y el estado que deben tener las luces en cada una de ellas.

Esta tabla se puede apreciar en la Fig. 2.

Fig. 2. Secuencias de los semáforos

Una observación: en algunos países la secuencia es ligeramente distinta: la luz roja acompaña a la amarilla antes de pasar a la luz verde. Si desean hacerlo de esta forma no tienen mas que cambiar los valores correspondientes en la tabla superior y reflejarlos luego en el módulo de Minibloq.

Otra observación: si se fijan bien en como cambian las luces de los semáforos notarán que luego de la secuencia 4 vuelve a repetirse la 1, así que todo el programa no es mas que un ciclo permanente que va de la secuencia 1 a la 4 y vuelve a comenzar.

Una vez que tenemos en claro como deben evolucionar la salidas de la placa para ir prendiendo las luces, sólo queda ir armando el programa en Minibloq.

En el programa que se muestra en la Fig. 3. he ido usando los bloques de control de salida digital para prender y apagar los leds y los he separado con retardos de tiempo. Estos retardos son mucho mas breves que los normales, para no tener que esperar tanto para ver como cambian las luces. También he agregado bloques de comentarios con los números de cada secuencia, para que el programa sea mas claro. Si tienen dudas acerca de como se usan los bloques de control de salidas digitales, vean este proyecto anterior.

Fig. 3. El módulo en Minibloq (click para agrandar)

El módulo de Minibloq también puede descargarse aquí.

Modo intermitente

Una función que tienen los semáforos reales es que a determinada hora (generalmente entre la medianoche y las primeras horas del día) prenden sólo las luces amarillas de manera intermitente.

Esto puede hacerse en respuesta a una señal externa o en base a la hora marcada por algún reloj interno. La placa Arduino UNO no tiene un reloj de este tipo (llamado RTC, Real Time Clock) que pueda llevar la hora aún cuando se va momentáneamente la alimentación. Existen varios en forma de módulos que se pueden agregar al proyecto, pero para este caso no usaremos ninguno. Optaremos por un simple control manual que cambia el modo de funcionamiento con una llave: en una posición los semáforos operan normalmente y en la otra se ponen intermitentes.

La llave que utilizaré para esta función es una del tipo “inversora a palanca” que tiene tres contactos o “patas”: la del centro es común y las otras normal abierto y normal cerrado.

Estas llaves se llaman SPDT (del inglés Single Pole Double Throw).

Fig. 4. Llave SPDT

El punto medio o común de la llave se conecta a un pin digital (en este caso D11) y los otros dos a +5V y GND respectivamente.

De esta manera, en una posición el pin 11 se conecta a +5V y en la otra a GND.

Fig. 5. Conexión de la llave de selección de modo

El módulo en Minibloq se debe modificar para que cambie el funcionamiento según el estado del pin 11.

Para ello usaremos un bloque condicional, que nos permite ejecutar distintas partes de un programa a partir de una condición. En este caso la condición es el valor del pin 11.

Diseñaremos el módulo para que cuando el pin 11 esté a +5V el semáforo funcione normalmente y cuando este a GND, opere el modo intermitente.

Fig. Selección del modo de funcionamiento

Como se vé en la Fig. 6, el primer bloque verifica una condición que puede tomar sólo dos valores, Verdadero o Falso. En este caso es el valor del pin 11.

Si la condición se verifica (el valor del pin es “Verdadero” o está a una valor alto -5V-) se ejecutan todos los bloques que están a continuación (Modo Normal). Si, en cambio, la condición es falsa (el valor del pin es “Falso” o está a un valor bajo -GND-) se ejecutan los bloques que están debajo de la cruz (Modo Intermitente). Finalmente, el último bloque marca el final de la condición.

El módulo modificado para leer la llave selectora puede descargarse aquí.

Si no tienen una llave selectora como la que usé yo, también pueden emplear una que tenga sólo dos pines, llamadas SPST (Single Pole Single Throw). El único cambio que deben hacer es agregar una resistencia que asegure un valor lógico en el pin 11 cuando la llave esté abierta, para evitar lecturas falsas. Esto puede hacerse de dos formas: conectando una resistencia a Vcc (Pull-up) o conectando la resistencia a GND (Pull-down).

Estas dos opciones se ven en la siguiente imagen:

Fig. 7. Conexión pull-up y pull-down

En ambos casos las resistencias deben ser de valores elevados, como 4K7 o 10K. En la conexión “pull-up”, la entrada está a nivel ALTO a través de la resistencia hasta que se cierra la llave, con lo que pasa a nivel BAJO. En la conexión pull-down, la lógica se invierte: la entrada está a nivel BAJO con la llave abierta y pasa a nivel ALTO cuando se cierra.

Funcionamiento

Este es un video que muestra como funcionan los semáforos con la llave selectora.

Este otro video muestra una implementación del proyecto (sin el modo intermitente) utilizando lámparas de 220V controladas con un módulo de cuatro relés hecho con mis alumnos.

Espero que les haya gustado este proyecto y que les haya servido para seguir aprendiendo a programar el Arduino con Minibloq. Dejen sus comentarios y consultas, será hasta la próxima.

14 comentarios en «Semáforos con Arduino y Minibloq»

      • Vale. Ahora tengo otra duda. Podria ponerle una palanca adicional para agregar un modo mas? Lo que quiero es agregar otra secuencia de encendio pero que la elija yo con una palanca. Como lo hago, con un IF o un WHILE con minibloq?

        Responder
        • Hola José, si claro que se puede. Yo lo pondría en la respuesta NO de la pregunta por la llave del modo.En vez de realizar la secuencia de intermitencia, pondría otra pregunta por otro pin para la segunda llave y según su valor realizaría la secuencia de MODO INTERMITENTE o la que agregues, tal como se ve en la imagen.

          Semáforos

          Responder
  1. Hola que tal, felicitaciones por la pagina, muy didactica. Consulta, ¿Tendras algun tutorial para crear bloques de minibloq? tengo que manejar una araña con varios movimientos y debería crear bloques nuevos para hacerlo y en la pagina de minibloq no encontre mucha información. Desde ya, muchas gracias

    Responder
    • Hola Fabian, gracias! Lamentablemente nunca intenté crear bloques, así que no te sabría decir como hacerlo. En el blog de Mnibloq hay algo http://blog.minibloq.org/2012/06/how-to-add-user-defined-blocks.html y me parece haber leído algo mas sobre este bloque de retardo en uS en otras páginas. Como ultimo recurso podes intentar contactar con Julián, el creador de Minibloq, aunque me parece que hace un tiempo que no da soporte porque tiene el proyecto medio abandonado (una pena). Un abrazo

      Responder
      • Gracias por la respuesta, voy a tratar de contactarlo, aunque es cierto que parece que el proyecto está abandonado. Una lástima porque era interesante para introducir a los chicos a la programación de forma sencilla. Habrá que evaluar otros proyectos también. Gracias nuevamente y saludos.

        Responder
        • Me contacte con Juliá, pero hace años que dejo de dar soporte para minibloq, por lo cual habra que arreglarse para descifra como estan diagramados. Una lastima…
          Voy a seguir experimentando, si puedo sacar algo en limpio te cuento. Saludos!!

          Responder
  2. Profe interesantes sus explicaciones ayudan muchisimo. Requiero su ayuda, que procedimientos debo realizar para que funciones juntos los sensores ultrasonido y el de choque, en una tarjeta DUINOBOT v.2.3 MULTIPLO

    Responder
    • Hola Manolo, no tengo a mano el Duinobot de la escuela para probarlo (aunque creo que es de una versión anterior) pero si mal no recuerdo no hay inconvenientes en usar los dos sensores al mismo tiempo. ¿Cual es el inconveniente que has tenido?

      Responder

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Habilitar notificaciones OK No, gracias