lunes, 21 de marzo de 2016

Semáforo para vehículos y paso de peatones con Arduino UNO

A continuación expongo el bloque de programación y el montaje del automatismo de un paso de peatones con semáforo accionado. Lo he realizado con una placa Arduino UNO y el bloque de programación lo he adaptado a partir de un ejercicio práctico presente en la página 34 del siguiente manual:


El programa se divide en varias partes o bloques, con el fin de establecer un orden y una estructura. Así se hace más sencillo su entendimiento o la tarea de buscar fallos.



La primera actividad es asignar variables a las distintas luces que tenemos (salidas de datos) y el botón de accionamiento del paso de peatones (entrada de datos), pero sin hacer distinción de momento.

// Projecto: Semáforo interactivo para paso de peatones

int cochesRojo = 12; // asignación variable luz roja coches
int cochesAmarillo = 11; // asignación variable luz amarilla coches
int cochesVerde = 10; // asignación variable luz verde coches
int peatRojo = 9; // asignación luz roja peatones
int peatVerde = 8; //asignación luz verde peatones
int boton = 2; // asignación del pin 2 variable botón accionamiento peatones

Seguidamente declaramos la variable cruceTiempo para permitir el paso de peatones durante 5 segundos.

También declaramos la variable cambioTiempo del tipo unsigned long para guardar el instante en que termina el ciclo y la luz se vuelve a poner en verde para los coches. Esto nos va a ser útil para evitar que el paso de peatones pueda ser accionando constantemente, bloqueando el paso de vehículos.

int cruceTiempo = 5000; // tiempo permitido para que el peatón cruce
unsigned long cambioTiempo; // variable para guardar el tiempo desde que hemos activado el paso para peatones

A continuación se establece que variables son entradas o salidas.

void setup() {
pinMode(cochesRojo, OUTPUT); // asignación del pin 12 como salida
pinMode(cochesAmarillo, OUTPUT); // asignación del pin 11 como salida
pinMode(cochesVerde, OUTPUT); // asignación del pin 10 como salida
pinMode(peatRojo, OUTPUT); // asignación del pin 9 como salida
pinMode(peatVerde, OUTPUT); // asignación del pin 8 como salida
pinMode(boton, INPUT); // asignación del pin 2 como entrada

Arranca el ciclo son los estados activos (HIGH) de luz verde para vehículos y roja para peatones


digitalWrite(cochesVerde, HIGH);
digitalWrite(peatRojo, HIGH);
}

Para poder accionar el paso de peatones necesitamos que se cumplan dos condiciones. Una es que el botón de accionamiento haya sido pulsado. La otra es que, al menos, hayan pasado 5 segundos desde la finalización del último ciclo. Y lo segundo, lo realizamos gracias a la función millis().

void loop() {

int state = digitalRead(boton);

if (state == HIGH && (millis() - cambioTiempo) > 5000) {

Una vez reunidas las dos condiciones para poder accionar el paso de peatones, llamamos y definimos a la función cambioLuces() que se va a encargar de iniciar el ciclo secuencial.

cambioLuces();

}
}

void cambioLuces()
{

El ciclo emula el funcionamiento habitual de este tipo de semáforos en España. Para los vehículo se pasa de luz verde a roja, pasando 2 segundos por la amarilla. Entonces, tras un segundo como tiempo de seguridad, el semáforo para peatones pasa de rojo a verde. Los peatones tienen 5 segundos para pasar.

digitalWrite(cochesVerde, LOW); // apaga verde coches
digitalWrite(cochesAmarillo, HIGH); // enciende amarillo coches
delay(2000); // el ciclo se detiene 2 segundos
digitalWrite(cochesAmarillo, LOW); // apaga amarillo coches
digitalWrite(cochesRojo, HIGH); // enciende rojo coches
delay(1000); // el ciclo se detiene un segundo como precaución
digitalWrite(peatRojo, LOW); // apaga rojo peatones
digitalWrite(peatVerde, HIGH); // enciende verde peatones
delay(cruceTiempo); // el ciclo se detiene 5 segundos para que peatón cruce

Antes de pasar a rojo para los peatones, se inicia el parpadeo de la luz verde. Esto lo ejecutamos mediante un bucle for que alterna el encendido y apagado de la luz verde, a intervalos iguales de 5 segundos. Al final del bucle, la luz verde queda en estado apagado (LOW).

for (int x=0; x<10; x++) {
digitalWrite(peatVerde, HIGH);
delay(250);
digitalWrite(peatVerde, LOW);
delay(250);

// al finalizar el bucle la luz verde peatones queda apagada

}

Y el ciclo termina de manera secuencial volviendo al estado de luz verde para vehículos y roja para peatones, con un intervalo de medio segundo entre medias.

digitalWrite(peatRojo, HIGH); // cambio a rojo para peatones
delay(500); // el siclo se detiene medio segundo
digitalWrite(cochesRojo, LOW); // apaga roja coches
digitalWrite(cochesVerde, HIGH); // enciende verde coches

Eso sí, guardamos en la variable cambioTiempo el instante, según el reloj, en el que terminó el ciclo. Esto nos permitirá gestionar la espera mínima de 5 segundos antes de poder volver a accionar el paso de peatones. Y volvemos al inicio del programa

cambioTiempo = millis();

}



La función millis()


Se trata de una función de la librería de Arduino que devuelve el número de milisegundos transcurridos desde el inicio del programa en Arduino hasta el momento actual. Nos da un número entero y simplemente indica cuanto tiempo lleva encendida la placa, a modo de reloj. 

lunes, 7 de marzo de 2016

Cuatro ejemplos de procesos secuenciales y combinacionales

Los procesos automáticos podemos clasificarlos en secuenciales y combinacionales. Atendiendo a la realización de operaciones obedecidas señales o impulsos preestablecidos, nos encontramos un tipo u otro, y en la mayoría de los casos la combinación de los dos.

Proceso Secuencial

La característica que define a un proceso secuencial es la realización de un esquema de funcionamiento fijo. Éste se compone de varias etapas ordenadas y el paso de unas a otras se realiza de manera determinada y prefijada. Y establecida esta definición, podemos dividir los procesos secuenciales en lineales y cíclicos.

Un proceso secuencial lineal se compone de un principio y un fin con una serie de etapas intermedias. Se trata de una sucesión de etapas sin retorno al origen para comenzar de nuevo el proceso. Eso si, el sistema puede iniciar la secuencia de nuevo cuando sea menester. Un ejemplo clásico sería una cadena de montaje de coches Ford, en la que cada obrero iba realizando tareas repetitivas sobre los componentes que conformaban aquellos primeros vehículos fabricados en serie.


Un proceso secuencial cíclico queda definido porque se recorren las etapas establecidas, unas tras otras, pero siendo la etapa inicial y última, la misma. El sistema va realizando las tareas prefijadas hasta volver a la posición inicial, de forma que quede listo para un nuevo ciclo. Un ejemplo, es el funcionamiento de un semáforo para tráfico rodado. A continuación expongo el enlace a un vídeo muy simpático sobre un semáforo casero elaborado con un sistema electromecánico. Pero después detallo otro ejemplo mediante el uso de semiconductores.



La característica principal de cualquier proceso combinacional es la independencia de unas etapas respecto a otras dentro del proceso. Cada etapa se desarrolla en función de condiciones iniciales, independientemente de las etapas anteriores. Un ejemplo que se me ocurre de proceso combinacional, es la carga y descarga de contenedores de mercancías en un puerto. En función del destino de los contenedores, la grúa actúa cogiendo los contenedores del barco y depositándolos en camiones o vagones de tren concretos. En el ejemplo del siguiente video, el proceso no es automático, pero creo que sirve de ejemplo.



Como sugerencia práctica dentro del curso de Automatización Industrial que estoy realizando, procedo a exponer cuatro sistemas o máquinas que nos encontramos en nuestro entorno, que funcionan mediante procesos secuenciales o combinacionales.

SEMÁFORO

Creo que el ejemplo más sencillo y cercano para mostrar en qué consiste un proceso secuencial, es un semáforo. El proceso comienza con el encendido de la luz verde. Pasado un tiempo se activa la luz amarilla para avisar a los vehículos del cambio de la luz verde a roja. Finalmente, luces verde y amarilla se apagan y se activa la roja. El proceso termina con el encendido de la luz roja, llegando a la etapa final que también es la inicial. Por tanto se trata de un proceso secuencial cíclico.

A continuación expongo un vídeo de El Profe García, sobre la confección de un circuito secuencial de semáforo con elementos semiconductores:



Un semáforo también puede ser una combinación de proceso secuencial y combinacional. Por ejemplo, con un paso de peatones que sea accionado por éstos y que haga que los coches se detengan. He realizado un montaje al respecto pero del que hablaré en otra entrada más adelante.

MÁQUINA EXPENDEDORA

Un ejemplo que me gusta mucho, de proceso combinacional, es el de una máquina expendedora con carro robotizado. Partiendo de un estado inicial, en función del dinero introducido y el producto elegido (condiciones), el carro se dirige al estante seleccionado, recoge el producto, lo deposita en la salida y vuelve otra vez a su posición de reposo.



En el proceso descrito, el carro realiza tareas secuenciales (salir y volver a su posición inicial) y tareas condicionales (recoger un producto u otro en función de la selección del usuario).

ESCALERA MECÁNICA

Combina procesos secuencial lineal y combinacional. Si partimos del reposo, la escalera funciona de manera continua, en modo bajo consumo (se estima que es más económica así que realizando arranques-paradas). En el momento en que alguien llega a ella, un sensor óptico (por ejemplo) detecta la presencia y hace que el motor pase al modo de velocidad nominal. Si durante un tiempo ninguna persona llega a la escalera, esta vuelve a su estado de bajo consumo.
También se puede seleccionar el sentido de ascenso o descenso de la escalera, a petición del personal autorizado.



CLASIFICACIÓN DE PAQUETERÍA

Aunque no lo veamos, las cartas y paquetes que recibimos en nuestros domicilios han pasado a través de un proceso que combina segmentos secuenciales y combinacionales. Por un lado hay cintas que de manera continua llevan los paquetes hasta determinados centros de clasificación, realizando lecturas de direcciones escritas mediante caracteres o por códigos gráficos. En función de su destino, estos van siendo desviados hacia ramificaciones. De esta maneras, se realiza la correspondiente selección para su posterior envío.