Professional Documents
Culture Documents
indeopendientes, pese a que con mucha probabilidad solo tiene un nucleo de CPU capaz
de hacer en un instante solo una de esas tres tareas.
Se dice por ello, que los PC son multitarea, sin embargo no es cierto, lo que hacen es
repartir el tiempo del controlador, o tiempo de CPU, de su nico procesador, en
pequeas porciones y dedicar cada una de ellas, a hacer avanzar concwcutivamente
cada una de las diferentes tareas que tiene encomendadas, un ratito atiendo a la
pantalla para mostrar el carcter que han pulsado, el siguiente momento escribi media
linea en la impresora , y el siguiente a lo dedido a emitir una nota musical y as
sucesivamente, de tal forma, que si el procesador es suficientemente rpido, sobre todo
mucho ms rpido que los dispositivos perifricos, teclado, impresora y altavoz, y el
tiempo de parada de cada tarea es lo suficientemente pequeas para que no se note
que se para y parece que hacen varias cosas a la vez, aunque la realidad es que en un
instante cualquiera, solo hacen una de ellas.
Si alguno utiliza el ordenador desde hace tiempo, recordar que antes, la velocidad de
escritura de la impresora variaba en funcin de lo que estabas haciendo, pues una
buena gestora de multitareas, en vez de repartir por igual el tiempo de CPU, lo hace
primando los trabajos cara al pblico en detrimento de los trabajos sin intervencin
humana. Si adems estos no son crticos para el sistema aun pierden mas prioridad y
imprimir, era de los trabajos que no tenan necesidad de intervencin humana, y no
eran crticos para el sistema, por lo que las impresoras antes, impriman un poco a
trompicones. A medida que los relojes de los procesadores fueron cada vez ms rpidos,
todos los trabajos ganaban en rapidez. por lo que los momento de parada disminuyen,
de modo que antes que lo notes, toca avanzar nuevamente al trabajo un poco. Toda
esta introduccin histrica viene a cuento porque el procesador de Arduino, debe tener
hoy ms o menos la capacidad que tena un viejo PC y su reloj, no es muy rpido, por lo
que no esta previsto que hagas dos cosas a la vez y cuando quieres que las hagas, has
de ser t quien te tienes que ingeniar para gestionar a pelo el multiproceso.
Pongamos un ejemplo sencillo, tenemos una linterna que funciona como muchas que
hay en el mercado, la primera vez que aprietas el botn se enciende la luz, al volver a
apretar el botn, pasa a ser intermitentemente, de modo que que por ejemplo esta un 3
segundos apagado y 3 encendida y solo apretando nuevamente el botn, apagamos
definitivamente la linterna.
Hardware
Bien, pasemos a programar nuestro experimento. Comenzamos por fabricar
el hardware en este caso una linterna que no es ms que unLED controlado por
un PIN como ya hemos visto en post anteriores,y un botn que recoge las pulsaciones
Software
Programaremos primero Ardunio sin tener en cuenta el necesario multiproceso, para
que podamos observar que el circuito puede fallar cuando la luz parpadea
porque no advierte que hemos pulsado botn.
El squetch ser como sigue :
Sketch Linterna_erronea
/*
Linterna_erroneo
Al oprimir el pulsado;
La 1 vez se enciende el LED
La 2 vez parpadea en intervalos de 10
La 3 vez de apaga
El Circuito:
LED controlado por el PIN 8 de abierto como salida
}
else {
// evento = 1 poner el LED intermitente
// en el bucle primera vez hacemos la primer intermitencia
if (evento == 1) {
digitalWrite(ledPin, LOW); //apagar LED
delay(2500); //esperar 10 segundos
digitalWrite(ledPin, HIGH); //encender LED
delay(2500); //esperar 10 segundos
evento = 2;
}
else
// evento = 2 apagar definitivamente y dejar todo como al principio
if (evento == 2) {
digitalWrite(ledPin, LOW);
evento = 0;
delay (500); // Pongo un delay para dar tiempo a retirar el dedo del botn
}
}
}
else{
// en el caso de que estemos en el evento 2 intermitencia y no se haya apretado el
botn
// habr que repetir la secuencia
if (evento == 2) {
digitalWrite(ledPin, LOW); //apagar LED
delay(2500); //esperar 10 segundos
digitalWrite(ledPin, HIGH); //encender LED
delay(2500); //esperar 10 segundos
}
}
}
pueden ser solo HIGH con voltaje alto y LOW con voltaje y la variable evento que
inicialmente toma el valor 0 que equivale a decir que esta apagada la bombilla
esperando que aprieten el botn.
A continuacin definimos como vamos a atizar el Hardware, en este caso el PIN
buttonPin, o sea el 7 se va a utilizar para controlar el botn y lo definimos como de
entrada para que pueda leer el voltaje del cable amarillo y el PIN ledPin o sea el 8, se
va a utilizar para apagar y encender el LED por lo que le declaramos de salida.
Comenzamos a programar el bucle que se recorrer una y otra vez.
Lo primero que hacemos es leer el voltaje del cable amarillo en el PIN 7 (buttonPin)
puede que el cable no tenga tensin (LOW) seal que no se puls el pulsador o que la
tenga (HIGH) y guardar el valor en buttonState.
Si se ha apretado el botn (buttonState iguala HIGH) y:
Estbamos en el evento 0 (inicio, todo apagado), nos toca encender la luz,
(digitalWrite HIGH). Como eso es casi inmediato aado un tiempo (delay) de 500
milisegundos (medio segundo) para que de tiempo a retirar el dedo del botn antes de
iniciar el siguiente ciclo. Cuando acabo este evento pongo el indicador evento a 1
para avisar que este evento ha acabado.
Sui ni han aoretado el botn
Si evento =1 Estbamos en el evento 1 (encendido el LED) nos toca poner el LED
intermitente, iniciamos apagando el LED , (digitalWrite LOW), esperamos 2500
milisegundos (delay) volvemos a encender (digitalWrite HIGH) y esperamos 2500
milisegundos (delay). En total 5 segundos de parpadeo. Tiempo en que LA MAQUINA NO
PUEDE CONSULTAR SI SE PULSA EL BOTON por lo que si lo hacemos en ese momento la
MAQUINA NO SE ENTERA. Cuando acaba este parpadeo pongo el indicador evento a 2
para avisar que este evento se ha iniciado.
Ejecutar los eventos
Si evento =2 Estbamos en el evento 2 (LED intermitente) nos toca apagar el
LED, (digitalWrite LOW). Como eso es casi inmediato aado un tiempo delay) de 500
milisegundos (medio segundo) para que de tiempo a retirar el dedo del botn y pongo
el indicador evento a 0 para avisar que comienza la espera de un nuevo ciclo de
eventos.
Aun queda ver que hacemos en el caso de que no se haya pulsado el botn. Entonces si
el evento que se esta realizando es el 0, (esperar a que se pulse), 1 (encendido el LED),
o el tres (apagado el LED no hay que hacer nada) pero si el evento que se est
ejecutando es el 2 (intermitencia del LED) tendremos que efectuar otro parpadeo que
ser igual al explicado anteriormente y que nuevamente durara 5 segundos. Tiempo en
que LA MAQUINA NO PUEDE CONSULTAR SI SE PULSA EL BOTON por lo que si lo
hacemos en ese momento laMAQUINA NO SE ENTERA.
En el video que pongo a continuacin veremos que responde perfectamente a encender
el LED, y a ponerlo intermitente, pero que cuando la luz esta intermitente es difcil
apagarla porque tienes que apretar exactamente gasta que se apaga la intermitencia y
sale en ese momento del ciclo pues si no llegas NO SE ENTERA QUE HAS APRETADO y si
TE PASA y dejas el dedo una vez encendido ms del medio segundo programado, la
maquina despus de volver a encender LED, entiende que nuevamente has pulsado dos
veces y pasa nuevamente a dejar la luz intermitente.
Se ve claramente que tenemos que trabajar simultneamente encendiendo y apagando
la luz y a la vez estudiando si apretamos el pulsador, o sea en multiproceso. Para ello
dedicaremos los ciclos impares a la tarea de ver si han apretado el botn y los pares a
la tarea de ir adelantando el evento que corresponda ejecutar. los el evento 0 (esperar a
que toquen el botn), el 1( encenderle LED ) y el 3 (apagar el LED y dejarlo todo como a
la entrada, son muy rpidos de ejecutar hasta el punto que en el programa pusimos un
tiempo de espera (delay) para dar tiempo a retirar el dedo. En este programa
perfeccionaremos el sistema y no haremos nada en tanto el dedo pulse el botn sea el
tiempo que sea , as que el de disparador de iniciar un nuevo evento ser primero
detectar que se ha pisado el botn y segundo que se ha soltado.
Mejora para el control de l lsado de el botn
As pues, pondremos un bucle corto que compruebe si el botn estaba sin pisar,
que se ha pisado y si esta pisado, que se ha soltado y hasta que eso no ocurra no
cambiaremos el evento que se esta realizando con ello nos libramos de las chapuzas
que hacamos para prolongar la duracin de los eventos rpidos y habr menos
interpretaciones errneas.
Por otra parte para aumentar la velocidad de ejecucin de los parpadeos cambiaremos
de encender a apagar el LED y viceversa cuando un contador que aumenta cada vez
que pasa por las rutinas llegue a una cantidad de mosopare un milisegundo hasta que
haya pasado el tiempo deseado que dure el parpadeo. Como en cada bucle solo va a
aumentar el contador el tiempo y hacer una parada de un milisegundo, la ejecucin del
bucle mientras ejecuta este evento, ser similar al de los otros eventos, es decir ser
muy rpido
}
else {
// evento = 2 LED intermitente
if (evento == 2) {
contador = contador + 1; // contador de tiempo de intermitencia
if (contador == 1) {
digitalWrite(ledPin, LOW); // apagamos el LED
}
if (contador < finfase) {
delay(1); // apagamos el LED
}
if (contador == finfase ) { // contador = x encendemos el LED
digitalWrite(ledPin, HIGH);
}
if (contador < finparpadeo) {
delay(1); // apagamos el LED
}
if (contador == finparpadeo ) { // fin del parpadeo
contador = 0 ;
}
}
else {
// evento = 3 apagar LED y dejar contadores inicializados
if (evento == 3) {
digitalWrite(ledPin, LOW);
evento = 0;
encendido = 0;
pulsado = 0;
}
}
}
}
}
Lo primero que tengo que resaltar es que no hemos tocado nuestro hardware lo que
funcionaba mal pasa a funcionar bien, simplemente porque hemos mejorado las
instrucciones que manejan el HARD, esa es una ventaja de los controlado digitalmente
que se puede mejorar su funcionamiento son tocar nada fsico. Algo que estamos
acostumbrados, nuestro ordenador funciona mejor y ms seguro a medida que
actualizamos el sistema operativo y las versiones de los programas sin que haya falta
tocar un tornillo sol instalando un nuevo programa. Igual pasa en esta linterna que
hemos fabricado
Para simular el multiproceso hemos dividido los bucles dedicando los bucles pares a una
tarea y los impares a otras, a veces no se hace a partes iguales sino por ejemplo un
bucle a una tarea y tres seguidos a otra, segn la importancia que demos a las tareas o
lo crtico de su funcionamiento. Por el ejemplo, el vdeo y la msica suelen estar
primadas ante la imagen fija y el texto, pues en estos procesos se nota menos la
lentitud que en los anteriores.
En el Arrea de definicin de constantes y variables hemos definido mas valores que
necesitaremos en el proceso vuelta para distinguir las vueltas pares de las impares,
encendido para encender el LED solo si esta apagado y contador para llevar las
vueltas que da en la rutina de intermitencia y apagar el LED durante x, encenderle y
tenerle encendido otras y vueltas y volver a comenzar y pulsado que nos valdr
para controlar los ciclos que transcurran sin que se levante el dedo del pulsador.
Si la vuelta es 1 se chequea botn y se de a vuelta el valor 2 para prepararla para el
siguiente ciclo. Se le el buttonPin y se guarda la lectura en buttonState.
Si antes no se haba pulsado , pulsado = 0, y ahora la lectura de HIGH se ha pulsado
el botn, ponemos pulsado a 1 y esperamos a que lo dejen de pulsar para cambiar de
evento, mientras tengan el dedo en el pulsador seguiremos con el mismo evento. Si se
ha pulsado y la nueva lectura de LOW quiere decir que han liberado el botn y
cambiamos de evento a ejecutar, ponemos pulsado cero para prepararlo para la
siguiente pulsacin.
Si vuelta no es uno avanzamos los eventos
Si estamos en el evento 1 (encender el LED) y esta apagado lo encendemos y ponemos
encendido a 1 para no volverlo a intentar mientras est encendido
Si estamos en el evento 2 ( LED intermitente), cuando contador vale 1 e apagamos el
LED, cundo valga finciclo volvemos encenderlo, y cuando valga 2fin parpadeo
hemos acabado el parpadeo y ponemos nuevamente el contador a cero. En los
intermedios entre apagado y encendido y encendido y vuelta a apagar, solo hacemos