Autor Tema: Semáforo para automóviles y peatones controlado por pulsador  (Leído 1995 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Carlos

  • Moderador Global
  • ****
  • Mensajes: 325
1. Descripción
En este proyecto se controlará con una tarjeta Arduino un semáforo para automóviles y peatones.
El semáforo se encuentra por defecto en verde para automóviles.
Cuando un peatón presiona el pulsador, se inicia la secuencia para poner verde el semáforo de peatones.
El tiempo que estará en verde para peatones depende de la posición de un potenciómetro.
El semáforo terminará en verde para los automóviles.
Si se presiona el pulsador, el sistema memoriza la petición del peatón, pero deberá esperar un tiempo mínimo antes de comenzar la siguiente secuencia.

Fotografía del proyecto:
   


2. Esquema eléctrico
   


3. Planos mecánicos
Este proyecto no tiene planos mecánicos


4. Listado de componentes
Código: [Seleccionar]
2  Led Rojo
2  Led Verde
1  Led Ambar
5  Resistencias de 330 ohmios.
1  Pulsador normalmente abierto
1  Potenciómetro de 10K
9  Cables macho-macho (11 si se conectan las dos tiras + y  - de la protoboard)
9  Puentes pequeños (se pueden hacer con cable de red)

1  Placa Arduino Uno
1  Placa Protoboard

El valor de las resistencias de 330 Ohmios se puede reducir hasta 120 ohmios para aumentar el brillo de los led.


5. Esquema de montaje eléctrico y mecánico
   El montaje es sencillo y se puede realizar a partir de la fotografía de la protoboard del punto 1 y del esquema eléctrico del punto 2


6. Programas

Código: Text
  1. /*
  2.    Control de semáfofo temporizado con pulsador
  3.    El peatón debe presionar un pulsador para solicitar paso.
  4.    Entonces, el semáforo corta el paso a los automóviles y
  5.    da paso a los peatones.
  6.    
  7.    Fecha: 06/05/2015
  8.    Licencia: GPLv3 http://www.gnu.org/licenses/gpl.txt
  9.    Web page: www.picuino.com/foro
  10.    
  11. */
  12.  
  13.  
  14. /*************************************************************
  15.    DEFINICIÓN DE CONSTANTES
  16.  *************************************************************/
  17. // Definición de pines
  18. const int led_verde_auto = 13;
  19. const int led_ambar_auto = 12;
  20. const int led_rojo_auto = 11;
  21. const int led_verde_peaton = 10;
  22. const int led_rojo_peaton = 9;
  23. const int pin_pulsador = 8;
  24.  
  25. // Tiempo mínimo que permanecerá en verde el semáforo para automóviles
  26. const int tiempo_minimo_verde_auto = 7000;
  27.  
  28.  
  29. /*************************************************************
  30.    FUNCIONES AUXILIARES DEL PROGRAMA
  31.  *************************************************************/
  32.  
  33. //
  34. // Inicializa semáforo. Verde para automóviles
  35. //
  36. void semaforo_init(void) {
  37.    // Enciende el led verde para automóviles. Apaga los demás leds
  38.    digitalWrite(led_verde_auto, HIGH);
  39.    digitalWrite(led_rojo_auto, LOW);
  40.    digitalWrite(led_ambar_auto, LOW);
  41.  
  42.    // Enciende el led rojo para peatones. Apaga los demás leds
  43.    digitalWrite(led_rojo_peaton, HIGH);
  44.    digitalWrite(led_verde_peaton, LOW);
  45. }
  46.  
  47.  
  48. //
  49. // Cambia el semáforo de automóviles a rojo
  50. //
  51. void semaforo_auto_rojo(void) {
  52.    
  53.    // Apaga el led verde para coches
  54.    digitalWrite(led_verde_auto,  LOW);
  55.  
  56.    // Enciende el led ambar para coches y parpadea 3 veces
  57.    for(int i=4; i>0; i--) {
  58.       delay(500);
  59.       digitalWrite(led_ambar_auto, HIGH);
  60.       delay(500);
  61.       digitalWrite(led_ambar_auto, LOW);
  62.    }
  63.  
  64.    // Enciende el led rojo para coches
  65.    digitalWrite(led_rojo_auto, HIGH);
  66. }
  67.  
  68.  
  69. //
  70. // Espera a que se presione el pulsador
  71. //
  72. void semaforo_espera_pulsador(void) {
  73.    int presionado;
  74.    long time;
  75.    
  76.    // Espera a que se presione el pulsador
  77.    // Debe permanecer esperando un tiempo mínimo
  78.    time = millis() + tiempo_minimo_verde_auto;
  79.    presionado = 0;
  80.    while(1) {
  81.       // Lee el estado del pulsador
  82.       if (digitalRead(pin_pulsador) == LOW)
  83.          presionado = 1;
  84.          
  85.       // Si ha pasado el tiempo de verde para coches
  86.       // y se ha presionado el pulsador, salir
  87.       if ((millis() > time) && (presionado == 1))
  88.          break;
  89.    }
  90. }
  91.  
  92.  
  93. //
  94. // Espera un tiempo que depende del potenciómetro
  95. //
  96. void semaforo_delay(void) {
  97.    int tiempo_peatones;
  98.    
  99.    // Calcula el tiempo de espera.
  100.    // 2 segundos más el tiempo que añada el potenciómetro
  101.    tiempo_peatones = 2000 + 5 * analogRead(A0);
  102.    
  103.    // Envía por el puerto serie el tiempo de espera
  104.    Serial.print("Tiempo peatones=");
  105.    Serial.println(tiempo_peatones);
  106.  
  107.    // Espera
  108.    delay(tiempo_peatones);
  109. }
  110.  
  111. //  
  112. // Cambia el semáforo de peatones a rojo
  113. //
  114. void semaforo_peatones_rojo(void) {
  115.  
  116.    // Parpadea el led verde 3 veces
  117.    for(int i=3; i>0; i--) {
  118.       digitalWrite(led_verde_peaton, LOW);
  119.       delay(500);
  120.       digitalWrite(led_verde_peaton, HIGH);
  121.       delay(500);
  122.    }
  123.  
  124.    // Enciende el led rojo para peatones y apaga el verde
  125.    digitalWrite(led_verde_peaton, LOW);
  126.    digitalWrite(led_rojo_peaton, HIGH);
  127. }
  128.  
  129.  
  130. /*************************************************************
  131.    FUNCIONES PRINCIPALES DEL PROGRAMA
  132.  *************************************************************/
  133.  
  134. //
  135. // Inicialización del programa
  136. //
  137. void setup() {
  138.    // Define las salidas de Arduino
  139.    pinMode(led_verde_auto, OUTPUT);
  140.    pinMode(led_ambar_auto, OUTPUT);
  141.    pinMode(led_rojo_auto, OUTPUT);
  142.    pinMode(led_verde_peaton, OUTPUT);
  143.    pinMode(led_rojo_peaton, OUTPUT);
  144.  
  145.    // Define las entradas con resistencia de Pull-up
  146.    pinMode(pin_pulsador, INPUT_PULLUP);
  147.    
  148.    // Inicializa el puerto de comunicaciones
  149.    Serial.begin(9600);
  150.    Serial.println("Semaforo en marcha");
  151. }
  152.  
  153. //
  154. // Programa principal
  155. //
  156. void loop() {
  157.    
  158.    // Inicializa semáforo. Verde para automóviles
  159.    semaforo_init();
  160.    
  161.    // Espera a que se presione el pulsador
  162.    semaforo_espera_pulsador();
  163.    
  164.    // Cambia el semáforo de automóviles a rojo
  165.    semaforo_auto_rojo();
  166.  
  167.    // Espera antes de permitir paso a peatones
  168.    delay(1500);
  169.  
  170.    // Enciende el led verde para peatones
  171.    digitalWrite(led_rojo_peaton, LOW);
  172.    digitalWrite(led_verde_peaton, HIGH);
  173.  
  174.    // Espera un tiempo que depende del potenciómetro
  175.    semaforo_delay();
  176.  
  177.    // Cambia el semáforo de peatones a rojo
  178.    semaforo_peatones_rojo();
  179.  
  180.    // Espera antes de permitir el paso a los automóviles
  181.    delay(2000);
  182.  
  183.    // Comienza un nuevo ciclo  
  184. }
  185.  


7. Ajustes y puesta en marcha

a. Se debe ajustar el potenciómetro para conseguir que el led verde para peatón permanezca encendido el tiempo deseado.

b. Se puede ajustar el tiempo mínimo que permanece encendido el led verde para automóviles, dentro del programa en la definición de constantes.



« Última modificación: 02/Dic./2015, 17:07:21 p. m. por Carlos »

Carlos

  • Moderador Global
  • ****
  • Mensajes: 325
Re:Semáforo para automóviles y peatones controlado por pulsador
« Respuesta #1 en: 02/Jun./2015, 21:14:08 p. m. »
Video del proyecto funcionando:

https://www.youtube.com/watch?v=3dGjZMrAW6E
« Última modificación: 25/Ago./2019, 12:21:37 p. m. por Carlos »

Isa

  • Freshie
  • *
  • Mensajes: 1
Re:Semáforo para automóviles y peatones controlado por pulsador
« Respuesta #2 en: 31/Ago./2015, 12:18:23 p. m. »
a. Se debe ajustar el potenciómetro para conseguir que el led verde para peatón permanezca encendido el tiempo deseado.

¿Hacia dónde hay que girar para que aumente el tiempo?

Carlos

  • Moderador Global
  • ****
  • Mensajes: 325
Re:Semáforo para automóviles y peatones controlado por pulsador
« Respuesta #3 en: 31/Ago./2015, 12:22:02 p. m. »
Depende de cómo se monte el cableado.
Girando hacia el cable que está conectado a positivo (5 voltios) el tiempo aumenta.
Girando hacia el cable que está conectado a negativo (GND o masa) el tiempo disminuye.

En el montaje de la fotografía el tiempo aumenta girando hacia la derecha (sentido horario)

Un saludo.