Felix Maocho

Para quien le interese lo que a nosotros nos interesa

Arduino – Repaso general de todo lo que aprendimos hasta la fecha

Por Félix Maocho
3/3/2013

 Objetivo de este post:

Repasar todo lo que hemos aprendido sobre Arduino tanto en lo referido al uso y montaje del Hardware como a la escritura de programas. Para ello vamos a construir un prototipo de un objeto real que sea perfectamente operativo en el mundo real. Pretendo con ello enseñar a los no expertos a aprender la forma de enfrentarse a los problemas de análisis y programación. Como añadido demostraremos el funcionamiento de una tarjeta autónoma, es decir absolutamente desvinculada del PC en su funcionamiento real. Por tanto en condiciones de ser implantada en un aparato.

_________________

Conviene  de vez en cuando hacer un punto y aparte en el aprendizaje y ver si somos capaces de resolver sin dificultad un problema de cierta complejidad. El ejercicio que les propongo consiste en construir el controlador de un semáforo bajo demanda, exactamente igual en su funcionamiento al semáforo más próximo a mi casa, que es de esos en los que el peatón, para poder cruzar la calle, tiene que solicitar el cambio de semáforo oprimiendo un botón.

Cuando nos enfrentamos a un problema de cierta complejidad deberemos ir cubriendo unas serie de etapas sucesivas. Cada etapa exige que hayamos dado por finalizada provisionalmente la etapa anterior. Y digo provisionalmente, porque inevitablemente al ir a efectuar una etapa de rango superior, descubriremos con frecuencia que hay lagunas que nos obligan a retroceder a etapas anteriores para definir en ellas los pasos que en anteriormente nos habían pasado desapercibidas. Este continuo tejer y destejer es inevitable, pero siguiendo el método que expongo se reduce tremendamente el tiempo dedicado a cambiar y reconstruir lo ya finalizado porque los problemas afloran antes, razón por la cual los cambios son menores.

Por tanto, siempre debemos estar dispuestos a retroceder en nuestro trabajo hasta donde haga falta, pero en cambio, no debemos avanzar en tanto no tengamos la certeza, que con lo que conocemos del problema en ese instante, hemos finalizado a nuestro juicio con éxito las etapas anteriores y no se nos han quedado flecos sueltos.

Las fases por las que hemos de ir avanzando son:

    1. Descripción del proceso – Texto en el que se detalla como debe funcionar lo que queremos crear
    2. Análisis funcional – Secciona el objeto a crear en funciones independientes capaces de funcionar por si mismo a partir de ciertos parámetros que tiene como imput a la vez que genera otros parámetros de salida como resultado de su actuación
    3. Análisis Orgánico ´- Vertebra las funciones de modo que cada quede especificado sin ambigüedad el orden en que se ejecutan, se describa donde hallará cada una los parámetros que necesita para funcionar y donde deposita los parámetros de resultasdo que genera.
    4. Programación – Escribe los mandatos que hacen funcionar cada módulo de acuerdo con lo esperado

Nota (Para que quede claro el proceso de avance que he ido realizando hasta a consecución del resultado final, iré tachando lo modificado e incluyendo los párrafos de actualización, que en posteriores momentos del estudio hemos realizado sobre lo ya escrito, numerando el cambio de acuerdo con el orden de la release efectuada)

Descripción del proceso.

Pretendemos prototipar el funcionamiento de un poste de semáforo bajo demanda, es decir que habitualmente esta preparado para dar paso a los automóviles y solo cuando alguien pulsa un botón cambia a para dar paso a los peatones.

 Descripción del aparato

El poste del semáforo consta de (tres) cuatro grupos de luces:

•   Semáforo para automóviles, formado por tres bombillas de colores, De arriba abajo, verde, ámbar y rojo
•   Semáforo de peatones, formado por dos bombillas de colores. De arriba abajo, verde y roja, que iluminan dos iconos de un peatón pasando y una esperando respectivamente.
•   Conjunto de solicitud de paso formado por dos LEDS blancos, que iluminan cada una un rotulo diferente, en el rótulo superior dice “Pulse botón” y en el inferior dice “Peatón espere” Un botón situado entre ambos rotulo invita a los peatones que le opriman para solicitar el cambio de semáforo.
 ** 1º Cambio ******
•   Semáforo de la esquina formado por dos LEDS una Verde y otro Rojo, simula en versión reducida un semáforo lejano, con el que ha de sincronizar su acción este semáforo bajo demanda cuando entra en funcionamiento
******************

Para nuestro experimento simplificaremos el aparato sustituyendo los diferentes conjuntos que forman el semáforo  de la siguiente forma

Semáforo para automóviles

Tres bombillas de colores Verde, Rojo y Naranja, controladas por relés unidos a  Arduino. Utilizaremos para ello los relés 2, para el Verde, 3 para el Naranja y 4 para el Rojo, Por una razon de sencillez  destinaremos al contol de estos relés  los correspondientes PIN2 , PIN3 y PIN4 abiertos de Output, aunque como es obvio podíamos dedicar a la rtarea cualquier combinación de reles y Pins de control. Como se explica en el post

 El semáforo de peatones

Dos LEDs controlado por los otros dos PIN consecutivos PIN5 para el contol del LED Verde y PIN6 para el control del LED Rojo Además se necesitarán sendas resistencias de 220Ω como se indico en el post

 Conjunto de solicitud de paso

Formado por dos LEDs blancos y el botón de solicitud, colocando en la “protoboard” dos LEDs blancos con los carteles explicativos y en medio el botón de solicitud. Los LED estarán contolados con los PIN7 (“Espere verde”) y PIN8 (“Peaton pulse”) y además como en el caso anterior, se necesitarán sendas resistencias de 220Ω.

Por su parte el Botón se cotrolará por el PIN9 abierto de Imput y se necesitara para montar un circuito Pull Down una resistencia de 1000Ω como se indicó en el post

 ** 1º Cambio ******

 Semáforo de la esquina

formado por dos LEDS uno Verde y otro rojo, colocandos en la “protoboard”, Además como en el caso anterior, se necesitan sendas resistencias de 220Ω. Para el control de estos LEDS destinaremos los PIN 11 para el LED Verde y PIN12 para el LED Rojo

******************

Funcionamiento del semáforo

Habitualmente el semáforo está abierto para los coches y cerrado para los peatones mientras que en “Conjunto de solicitud de paso”, parpadea la luz superior “Pulse Peatón ” que solicita al peatón iniciar el proceso de cambio del semáforo. Las luces se encuentran en la siguiente situación.

Semáforo de la Esquina

  • Impertubablamante cambia de luz varde a roja cada deternerminado tiempo
  • Pasados x c segundos desde el cambio de verde a roja , lanza una señal de sincronismo

Semáforo de automóviles

  • Verde encendida
  • Naranja apagada
  • Roja apagada

 Semáforo de peatones

  • Verde apagada
  • Rojo encendida

Conjunto de Solicitud de paso

  • Luz blanca de cartel “Peatón pulse” parpadeante más o menos con cadencia de 1 segundo
  • Botón en situación de expectante para que lo pulsen
  • Luz blanca de “Espere verde” apagada

Si no se pulsa el botón el sistema se mantiene en este estado por tiempo indefinido

Si se pulsa. Se inicia un “Proceso de cambio de semáforos”

Proceso de cambio de semáforos”

Al pulsar el botón ocurren los siguientes cambios:

Inmediatamente

  • La luz blanca de “Pulse botón” pasa de Intermitente a apagada.
  • El Botón queda en “fuera de servicio”, hasta qe se reestablezca el transito a los vehículos el volverlo a pulsar no produce ningún efecto aparente
  • La luz blanca de “Peatón espere” pasa de apagada a enciendida fija
  • El Conjunto Semáforo de automóviles y Semáforo de Peatones permanece Inmutable El resto de las luces permanecen inalterables

Al cabo de un rato le llega la señal, de sincronismo desde el semáforo que está en la esquina,y comienza eñ “Proceso de apertura del semáforo para peatones

“Proceso de apertura del semáforo para peatones

  • En el semáforo de los coches  la luz naranja de los coches se enciende
  • El resto de las luces se  mantiene inalterables

Unos instantes después pongamos 15”

En el semáforo de los coches

  • Se apaga la luz verde
  • Se apaga la luz naranja
  • Se enciende la luz roja simultáneamente

Semáforo de peatones

  • La luz Verde pasa apagada a encendida
  • Simultáneamente la luz roja pasa de encendida a apagada

Solicitud de paso

  • Luz blanca de espere peatón pasa de encendida a apagada

“Proceso de finalizacion del semáforo para peatones

La luz de peatones verde parpadea unas diez veces

  •  Semáforo de peatones, luz
  • Verde parpadeante
  • Resto de luces  sin cambios

Finalizados los parpadeos todo vuelve a la posición Inicial.Finalizado todo el proceso todo vuelve al estado inicial

** 1º cambio ******

Al llegar a este punto observo que hay que modificar la descripción del aparato para añadir un pequeño simulador del semáforo de la esquina, con el que este semáforo sincroniza. Para ello situare dos leed uno rojo y otro verde que alternativamente se encienden uno y otro en periodos de medio minuto.

*****************

Observaciones:

Los tiempos reales de funcionamiento se reducirán, con el fin de rebajar los tiempos de puesta a punto, pero estos tiempos estarán parametrizados con el fin, que con solo cambiar los valores de esos parámetros, el sistema funcione con tiempos reales. Bastaría pues cambiar los parámetros de tiempos y sustituir los Led que se mantienen por relés que funcionatan controlados por los mismos PINs que los LEDs, para obtener el elemento controlador de un semáforo real.

La ventaja de haber descrito minuciosamente el funcionamiento es que hemos dividido un problema complejo que teníamos inicialmente en una serie de problemas mucho más sencillos, cuyo buen funcionamiento por separado permitira uq el objeto funciones cuando los diferenes módulos se ajjnconicen entre si.

Hamos dicidudo nuestro “PROCESO DE SEMÁFORO BAJO DEMANDA” en lo siguientes procesos independientes

  • “Proceso del semáforo de la esquina”
  • “Proceso de espera de “Pulse Peaton
  • “Proceso de cambio de semáforos”
  • “Proceso de apertura del semáforo para peatones”
  • “Proceso de finalizacion del semáforo para peatones”i

Procesos susficientemente sencillos para ir pudiendo enfrentarlos por separado.

“Proceso del semáforo de la esquina”

Como podemos obsevar se produce aquí un claro efecto multitarea, independendientemente de lo que ocurra en el proceso de cambio de semáforo, el semáforo de la esquina cambiara regularemente de color y emitirá una señal de sincronismo para este semáfor  segundos después de cambiar de verde a rojo.

Así pues de acuerdo con lo que hemos aprendido sobre tñecnicas multitarea dedicaremos loa pasos PARES del ciclo a avamzar en el proceso del cambio de semáforo de la esquina y en los procesos IMPARES cuidaremos de ir a haciendo avanzar todo lo demás.

Sketch Seáforo 

Un primer intento de programa será como el que sigue. Lo más probable es que tenga muchos errores pues basta que tengas una falta de ortografía (incluso escribir una mayúscula en vez de minúscula, (o vivecersa), o que se te haya escapado un “;” o culaquier otro detalle dará un error de copilación .

Así pues le pongo solo como ejemplo de algo que a estas alturas deben seguir perfectamente. En sucesivos post iré afinando y explicando la técnica de corrección de errores pues es imposible escribir algo de cierta complejidad sin confundirse por lo que es necesario saber como se pone a punto.

Le dejo el texto convenientemente comentado. Si hay algo que no entienden busquen en capítulos anteriores donde se explica lo que aquí hacemos, yo les garantizo que no hay nada nuevo.

/*
Semáforo
Al oprimir el pulsador
El semáforo espera a sincronizar con un decalaje con semáforo lejano
y cambia el estado del semáforo del paso de vehículos al de personas.
Al cabo de un tiempo avisa del fin del semáforo para pesonas y
vuelve a la situación inicial

El Circuito:
Semáforo para automóviles
Tres bombillas de colores unidas a relés, a Arduino.
controladas por PIN2 (verde) , PIN3 (naranja)y PIN4 (rojo)
Semáforo de peatones
PIN5 para el LED Verde y PIN6 para el LED Rojo
Conjunto de solicitud de paso
PIN7 (“Espere verde”) y PIN8 (“Peaton pulse”) y PIN9 en OUTPUT para el boton
Semáforo de la esquina
PIN 11 para el LED Verde y PIN12 para el LED Rojo

Félix Maocho

Es de dominio público
https://felixmaocho.wordpress.com/?s=arduino
*/

// Area de definición de constantes y variables
const int relver = 2; // el PIN2 contorla el rele bombilla verde
const int relnar = 3; // el PIN8 controla el rele bombilla naranja
const int relroj = 4; // el PIN4 controla el rele bombilla rojo
const int ledver = 5; // el PIN5 controla LED verde peatones
const int ledroj = 6; // el PIN6 controla LED rojo peatones
const int espere = 7; // el PIN7 controla el cartel “espere Verde”
const int pulse = 8; // el PIN8 controla el cartel “pulse peaton”
const int button = 9; // el PIN9 controla el pulsador
const int semver = 11; // el PIN11 controla LED verde semaforo lejano
const int semroj = 12; // el PIN12 controla LEd rojo semaforo lejano

int par = 0; // “par” = 0 ciclo del sem lejano, “par” =1 ciclo de sem bajo demanda
int conta = 0; // “conta” = acumulador de ciclos pares
int tiempo = 30.000; // “tiempo” = numero de ciclos para cambio de color
int decalaje = 31.000; // “decalaje” = sincronismo entre semaforos
int sincronismo = 0; // “sincronismo” adquiere el valor 1 con “conta” = “decalaje”

int buttonState = 0; // variable para leer el estado del pulsador
int pulsado = 0; // variable que se pone a 1 cuando pulsan el botón
int contanaranja = 0; // contador del tiempo en naranja
int tiemponaranja = 20000; // tiempo en naranja
int finsemaforo = 30000 // tiempo del semáforo en verde
int intermitencia = 1 // contador de intermitencias
int constante = 2000 ; // tiempo que duran las intermitencias
int finciclo = 6 ; // numer de intermitencias para acabar

// Declaración del Hardware PINs utilizados y situación inicial de la luces
void setup() {
pinMode(relver, OUTPUT);
pinMode(relnar, OUTPUT);
pinMode(relroj, OUTPUT);
pinMode(ledver, OUTPUT);
pinMode(ledroj, OUTPUT);
pinMode(espere, OUTPUT);
pinMode(pulse, OUTPUT);
pinMode(button, INPUT);
pinMode(semver, OUTPUT);
pinMode(semroj, OUTPUT);

//Situacion inicial de las luces
digitalWrite(relver, HIGH);
digitalWrite(relnar, LOW);
digitalWrite(relroj, LOW);
digitalWrite(ledver, LOW);
digitalWrite(ledroj, HIGH);
digitalWrite(relver, HIGH);
digitalWrite(espere, LOW);
digitalWrite(pulse, HIGH);
digitalWrite(semver, HIGH);
digitalWrite(semroj, LOW);

void loop(){
// Ciclo par
if (par == o) { // vuelta para avanza semaforo lejano
par = 1; // la próxima vuelta será impar
conta = conta +1;
if (conta == tiempo) { // cambio de verde a rojo
digitalWrite(semver, LOW);
digitalWrite(semroj, HIGH);
}
if (conta == decalaje) { // se pone en marcha sincronismo
sincronismo = 1; // puede iniciarse el cambio de semaforo
}
else { // no hay sincronismo
sincronismo = o; // no puede iniciarse el cambio de semáforo
}
if (conta == (2*tiempo)) { // cambio de rojo a verde y volver a empezar
conta = 0;
}
}
// Ciclo impar
else { // vuelta para avanza semaforo de demanda
par = 0; // la próxima vuelta será par
If (pulsado == 0){
//Averiguar si han pulsado el botón
buttonState = digitalRead(button); // leer y guardar en “buttonState”
if (buttonState == LOW) { // si no se ha pulsado”
pulsado = 1: // ponemos pulsado a 1
digitalWrite(espere, HIGH); // luz espere encendida
digitalWrite(pulse, LOW); // luz pulse apagada
}
}
else {
1f (sincronismo == 1) { // no hay sincronismo fin = 0
digitalWrite(relnar, LOW); //se enciende la luz Naraja
contanaranja = contanatranja +1;
}
If (contanaranja == tiemponaranja) {
digitalWrite(relver, LOW); //se apaga luz verde
digitalWrite(relnar, LOW); //se apaga luz Naraja
digitalWrite(relroj, HJGH); //se enciende luz Roja
digitalWrite(ledver, HIGH); //se enciende LED verde
digitalWrite(ledroj, LOW); //se apaga LED rojo
digitalWrite(espere, LOW); // luz espere epagada

}
if ( contanaranja = finsemaforo) { // intermitencias verdes
digitalWrite(ledver, HIGH); //se apaga LED verde
Intermitencia = intermitencia +1
finsemáforo = finsemáforo + (constante *intermitencia)
}
If (intermitencia = finciclo) { // dejar todo como estaba al principìo
// variables que han cambiado de valoe
int conta = 0; // “conta” = acumulador de ciclos pares
int sincronismo = 0; // “sincronismo” valor 1
int buttonState = 0; // variable para leer el estado del pulsador
int pulsado = 0; // variable a 1 cuando pulsan el botón
int contanaranja = 0; // contador del tiempo en naranja
int intermitencia = 1 // contador de intermitencias
// Luces en posición inicial (salvo luces semáforo lejano
digitalWrite(relver, HIGH);
digitalWrite(relnar, LOW);
digitalWrite(relroj, LOW);
digitalWrite(ledver, LOW);
digitalWrite(ledroj, HIGH);
digitalWrite(relver, HIGH);
digitalWrite(espere, LOW);
digitalWrite(pulse, HIGH);
}
]
]
if (pulsado == 0) {
pulsado = 1; // poner pulsado a 1
}
}
else { // si han dejad de pulsar pero habian pulsado
if (pulsado == 1) {
evento = evento +1; // cambiar de evento
pulsado = 0; // poner pulsado a 0 para la proxima vez
}
}

Como digo en sucesivos post iré explicando como depurar un e sketch que a poco complejo que sea se vuelve inmanejable salvo que conocozcamos algunos trucos.

élix Maocho

Todos los post de arduino apareceran en Robótica bajo el subepigrafe Arduino

Anuncios

7 abril 2013 - Posted by | Robotica | ,

Aún no hay comentarios.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: