28 de abril de 2012

Semáforo con Arduino Uno

Cómputo Integrado
Laboratorio

Programa y circuito para la creación de cruce de semáforos con Arduino Uno. El estado verde tiene una duración de 6 segundos, más el tiempo de parpadeo, el estado amarillo es de 3 segundos y el estado rojo se encuentra activo mientras el otro semáforo pasa por el estado verde y amarillo. El botón sirve para terminar el tiempo del semáforo con luz verde activo en el momento y así pasar la actividad al otro semáforo.

Material usado

  • Arduino Uno y cable para conexión USB
  • 1 push button
  • 1 resistencia de 10K ohms
  • 6 resistencias de 330 ohms
  • 2 leds de 10 mm, color verde difuso
  • 2 leds de 10 mm, color ámbar difuso
  • 2 leds de 10 mm, color rojo difuso
  • 1 protoboard
  • Cables para conexiones

Yo use cables para conexión macho-macho y algo de cable de ethernet. Los leds use de 10mm para que fuese más vistoso, pero pudo haber sido leds sencillos de 5mm.

Circuito


El circuito es sencillo y fácil de elaborar, yo use Fritzing para mostrárselos aquí y vean como son las conexiones.


Y aquí una imagen de como quedo el circuito ya montado en el protoboard.


Código


Este es el programa creado para hacer funcionar los dos semáforos. Cada semáforo es una función, y al termino de cada función se manda a llamar a la otra función. La función loop inicializa el semáforo con uno en luz verde y el otro en luz roja.


Esta es una imagen del circuito, con el programa ya subido al Arduino y funcionando.


Vídeo


Un vídeo de muestra con el semáforo funcionando.


Versión modificada


El semáforo anterior tiene un push button que cuando es presionado mientras el semáforo se encuentra en luz verde, termina su tiempo y empieza a parpadear la luz amarilla, para después cambiar a rojo, en pocas palabras el botón tiene la función de cambiar de semáforo.

Esta versión es de un semáforo manual, es decir, no cambia de un semáforo a otro hasta que es presionado el botón.
Aquí les dejo el código modificado, quite los comentarios ya que son prácticamente los mismos que en el anterior. Podemos ver el cambio dentro del ciclo while donde cambiamos la condición.


Y aquí esta el vídeo para ver cuál fue la diferencia que tenemos en este semáforo que cambia manualmente.


33 comentarios:

  1. Muy buen proyecto, lo acabo de testear y funca bien!

    ResponderEliminar
  2. Hola que tal, he estado buscando información sobre como usar el arduino pero ya de una forma más real.. para conectarlo en un semáforo un poco más real, no nada más en protoboar.. pero no encuentro nada, es que en mi escuela hay un semaforo didáctico, y necesitamos conectarlo usando el arduino como programación

    ResponderEliminar
    Respuestas
    1. La programación sería básicamente lo mismo, lo que deberías de buscar es el diagrama esquemático del semáforo didáctico con el que cuentas, y ver mediante electrónica como conectar con las salidas digitales del Arduino.

      Eliminar
  3. hola ote es k me toca haser dos semafors de calle y un peatonal lo cual tiens k demorar
    20 segundos Rojo
    10 segundos Amarillo
    20 segundos Verde
    el peatonal tien k tener dos led y el resto tiene k tener 3 lo cual el peatona tien ke star solo pero nos e como se hace en arduino se me alludarias porfavor

    ResponderEliminar
    Respuestas
    1. Puedes programar tres funciones, una para cada semáforo, tal y como lo hice yo en mi código.

      Eliminar
  4. BUEN DIA DISCULPA KE PROGRAMA UTILIZASTE PARA EL PROYECTO

    ResponderEliminar
    Respuestas
    1. Se llama "Arduino IDE", disponible para diferentes sistemas operativos.

      Eliminar
  5. Amigo no hay forma de que funcione sin el pulsador

    ResponderEliminar
    Respuestas
    1. Si, en las funciones semaphoreOne() y semaphoreTwo() elimina el bloque del ciclo while.

      Eliminar
  6. yo copie el programa y el circuito y no me funciona

    ResponderEliminar
    Respuestas
    1. Alguien mas ya había intentado y le funcionó, verifica que hayas copiado bien.

      Eliminar
  7. Muy buen proyecto amigo, oye tendras ese codigo para c# ?

    ResponderEliminar
  8. Hola Ramon
    Ya lo hice y no funcionó, sale el siguiente texto,avrdude: stk500_getsync(): not in sync: resp=0x00
    Gracias

    ResponderEliminar
    Respuestas
    1. Ese error sale en consola cuando tu computadora no pudo conectar correctamente con el Arduino. Busca en algún foro si alguien tiene la solución para este problema. Suerte.

      Eliminar
  9. por favor dime con sabes cual es el pulsador y tambn en la seccion de int porque no estan nombrados los 6 leds?

    ResponderEliminar
    Respuestas
    1. No necesite nombrarlos porque preferí inicializarlos en el "setup" directo con el número de pin, y para no hacerlo uno por uno los inicialice con un "for". Puedes también declarar cada uno de los led tal y como lo hice con el botón, y sería algo así:
      const int led1 = 2;
      const int led2 = 3;
      ... etc.
      y luego en el "setup" ya sin usar el "for",
      pinMode(led1, OUTPUT);
      pinMode(led2, OUTPUT);
      ... etc.
      y cambiarías también líneas como,
      digitalWrite(2, LOW);
      por
      digitalWrite(led1, LOW);
      funciona de las dos maneras, solo es cuestión de como se te hace más cómodo.
      Para el botón, ya que esta declarado y se que esta en el pin 8 del Arduino, al cual nombre "button", y solo es cuestión de tomar lectura de el con "digitalRead(button)".
      Espero haya aclarado algo tus dudas.

      Eliminar
  10. hola muchas gracias funciono de maravilla pero solo tengo un problema, los leds no se alumbran muy bien, al parecer les falta voltaje o algo asi para q se iluminen mejor, que hacer en este caso ?? Gracias de antemano :)

    ResponderEliminar
    Respuestas
    1. Fijate que resistencias le estas poniendo a los led ya que si es de un omiaje muy alto no alumbraria bien, ponle una de 330 omios.

      Eliminar
  11. ahora tengo otra duda bro, bueno ya sabemos que el pin 8 es el PB asi que mi siguinte cuestion es: que seccion debo de eliminar para que solo funcione sin el PB osea quitar el PB del circuito y del codigo de arduino, que solo sean los 6 led delñ semaforo, gracias y espero no fregar tanto porq enserio me quiero enseñar a manejar el arduino
    const int button = 8;

    void setup() {
    for (int pin = 2; pin <= 7; pin++) {
    pinMode(pin, OUTPUT);
    }
    pinMode(button, INPUT);
    }

    void semaphoreOne() {
    digitalWrite(2, HIGH);
    int count = 0;
    while (true) {
    if (digitalRead(button) == true) {
    break;
    }
    }
    digitalWrite(2, LOW);
    delay(500);
    digitalWrite(2, HIGH);
    delay(500);
    digitalWrite(2, LOW);
    delay(500);
    digitalWrite(2, HIGH);
    delay(500);
    digitalWrite(2, LOW);
    delay(500);
    digitalWrite(2, HIGH);
    delay(500);
    digitalWrite(2, LOW);
    delay(500);
    digitalWrite(2, HIGH);
    delay(500);
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    delay(2500);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(7, LOW);
    semaphoreTwo();
    }

    void semaphoreTwo() {
    digitalWrite(5, HIGH);
    int count = 0;
    while (true) {
    if (digitalRead(button) == true) {
    break;
    }
    }
    digitalWrite(5, LOW);
    delay(500);
    digitalWrite(5, HIGH);
    delay(500);
    digitalWrite(5, LOW);
    delay(500);
    digitalWrite(5, HIGH);
    delay(500);
    digitalWrite(5, LOW);
    delay(500);
    digitalWrite(5, HIGH);
    delay(500);
    digitalWrite(5, LOW);
    delay(500);
    digitalWrite(5, HIGH);
    delay(500);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    delay(2500);
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    digitalWrite(4, LOW);
    semaphoreOne();
    }

    void loop() {
    for (int pin = 2; pin <= 7; pin++) {
    digitalWrite(pin, LOW);
    }
    digitalWrite(2, HIGH);
    digitalWrite(7, HIGH);
    semaphoreOne();
    }

    ResponderEliminar
    Respuestas
    1. Solo elimina la sección correspondiente al "if" que se encuentra dentro del "while" para cada función de semáforo.

      Eliminar
    2. ok osea en este esta seccion borro desde while
      void semaphoreTwo() {
      digitalWrite(5, HIGH);
      int count = 0;

      DE AQUI,,,,, while (true) {
      if (digitalRead(button) == true) { ,,,,,,,,HASTA AQUI?
      break; ESTO NO LO BORRO?
      }

      Eliminar
    3. Quita todo esto:
      int count = 0;
      while (true) {
      if (digitalRead(button) == true) {
      break;
      }
      }
      y pon un delay:
      delay(5000);
      donde le darás el tiempo que quieres que dure en verde.

      Eliminar
  12. q mas amigo necesito hacer un juego de semaforos pero no puedo usa un arduino me podria colaborar

    ResponderEliminar
  13. amigo, fiz exatamente igual ao seu projeto, mas não funcionou, os leds não acendem. Você poderia me ajudar? por favor. Sou Brasileira
    -------
    google tradutor:
    Amigo, hizo exactamente lo mismo que su proyecto, pero no funcionó, los LEDs no se encienden. ¿Podría usted ayudarme? por favor. soy brasileño

    ResponderEliminar
    Respuestas
    1. Olá Erika, provavelmente é um problema com a conexão do circuito. Agregame em G+ para conversar.

      Eliminar
  14. Muy bueno,me encanto tu blog,seguire viendo todo lo que has echo con arduino.

    ResponderEliminar
  15. Que tal disculpa como podria hacer para que en el momento en el que desde el puerto COM3 le mande un 1todas las luces del semaforo empiezen a parpadear y cuando le doy 0 vuelva al semaforo normal? si no es mucho pedir para saber :c

    ResponderEliminar
    Respuestas
    1. Hola disculpa no haber respondido en su momento, tal vez ya no necesites la ayuda, pero respondo por si alguien más necesita hacer algo como lo que comentas.

      Para poder controlar el Arduino desde la PC necesitas hacer una conexión serial, para que desde la consola de la IDE puedas mandarle datos al Arduino, y este las procese.

      En la página oficial de Arduino tienen un ejemplo donde mandan por puerto serial un entero para encender un led RGB de determinado color (http://arduino.cc/en/Tutorial/ReadASCIIString), ahí tienes una buena base para aprender a enviar datos, recibirlos y tomar acciones, y una vez practicado con ese ejemplo, será sencillo modificar el código del semáforo para dar solución al problema.

      Eliminar