Sei sulla pagina 1di 7

Articulo informe de proyecto

DISEO Y DESARROLLO DE UN RELOJ DIGITAL MEDIANTE UN


SISTEMA POV VERTICAL (PERSISTENCE OF VISION), CON LA
UTILIZACION DE INTERRUPCIONES EN ARDUINO.
Carlos Alberto Romero Torres
e-mail: kromerosena@hotmail.com

Andrs Gonzlez Flrez


e-mail: andres_florez9412@hotmail.com

Brayan Alexander Garrido


e-mail: alexander.garrido1995 @hotmail.com

Jhair Steven Lobo


e-mail: lobogu_575 @hotmail.com
KEY WORDS:
Arduino.

RESUMEN: Este proyecto se basa en un mecanismo


giratorio que consta bsicamente de un motor al cual va
fijada una placa electrnica que hace la funcin de
hlice como si de un ventilador se tratase. En el extremo
de esta placa va una hilera vertical con un nmero
variable de LEDs. A travs de la velocidad y de una
adecuada programacin del Arduino Uno que controla
los LEDs, se aprovecha de la persistencia de imagen en
la retina para generar la ilusin ptica de un reloj digital
que queda representada en una imagen, que podr ser
un dibujo o bien palabras. Dicho proyecto se explicar el
efecto visual llamado POV el cual es el fundamento de
este trabajo. Ms adelanto se desarrollar el diseo de
la placa impresa hasta su implementacin como aspa
del motor utilizado como base giratoria. A continuacin
se presentar una detalla aclaracin del montaje de la
estructura de soporte y de la fijacin de la placa ya
mencionada. Despus se expondr su programacin
detalladamente. Para concluir se aportan nuevas ideas y
lneas de investigacin, abriendo puertas a nuevos
proyectos para mejorar el presente trabajo y as seguir
desarrollando esta interesante ilusin ptica giratorio.
PALABRAS
CLAVE:
interrupcin, Arduino.

POV,

POV, microcontroller, interruption,

1 INTRODUCCIN
Se plantea como proyecto de aplicacin para
comprender la utilizacin de las interrupciones en
Arduino, mediantes la implementacin de un dispositivo
que utilice el principio de persistencia de imagen para
crear la ilusin ptica de un reloj digital. El presente
informe describe la solucin del proyecto de aplicacin
implementada con Arduino.

2 OBJETIVOS
2.1 OBJETIVO GENERAL

Presentar e implementar
Interrupcin en Arduino.

el

concepto

de

2.2 OBJETIVOS ESPECIFICOS

microcontrolador,

Conocer los tipos de interrupciones en Arduino.


Mostrar los Flags de disparo.
Analizar un ejemplo de programacin de una
interrupcin.

LECTURAS PREVIAS
3 CONCEPTOS.

ABSTRACT: This project is based on a rotating


mechanism which basically consists of a motor which is
attached to an electronic board that acts as a helix as if it
were a fan. At the end of this plate goes a vertical row
with a variable number of LEDs. Through the speed and
appropriate programming Arduino Uno which controls
the LEDs, takes advantage of persistent image on the
retina to produce the optical illusion that is displayed in
an image, which can be a drawing or words. This project
visual effect called POV which is the foundation of this
work will be explained. More progress will be held on the
printed board design to implementation as blade rotary
engine used as base. Below is a detailed explanation of
the mounting of the support structure and the fastening
of the aforementioned plate will be submitted. After its
programming will be discussed in detail. To conclude
new ideas and lines of research are presented, opening
doors to new projects to improve this work and thus
further develop this interesting optical illusion spinning.

3.1 PERSISTENCIA RETINIANA


[2] Este fenmeno visual descubierto por el cientfico
belga Joseph-Antoine Ferdinand Plateau es conocido
como POV (Persistence Of Vision) o persistencia
retiniana. Este hecho demuestra cmo una imagen
permanece en la retina humana una dcima de segundo
antes de desaparecer completamente, lo que permite
que veamos la realidad como una secuencia de
imgenes que el cerebro "enlaza" como una sola imagen
visual mvil y continua. En el cine en blanco y negro, se
pasaban 18 imgenes por segundo porque se deca que
era el mnimo para poder crear el efecto de movimiento,
las pelculas actuales se proyectan a 24 imgenes por
segundo, e incluso a 25 para adaptarse mejor a la
frecuencia utilizada en televisin. La persistencia

Articulo informe de proyecto

Retiniana es una caracterstica de nuestro ojo que


provoca que las imgenes que se observan no se borren
instantneamente. Este hecho, hace que las imgenes
que se visualizan, queden guardadas por un instante en
El cerebro.

5 LAS
INTERRUPCIONES
HARDWARE.

Estas interrupciones hardware, se disearon por la


necesidad de reaccionar a suficiente velocidad en
tiempos inimaginablemente cortos a los que la
electrnica trabaja habitualmente y a los que ni siquiera
el software era capaz de reaccionar.
La idea que se debe tener en mente es que vamos a
definir una funcin que se ejecutar de forma asncrona,
sin planificacin, cuando se ocurra un cierto suceso
electrnico.
Para definir una interrupcin necesitamos tres cosas:

4 MARCO TEORICO
4.1 ARDUINO Y LAS INTERRUPCIONES
[4] A un nivel bsico, una interrupcin es una seal que
interrumpe
la
actividad
normal
de
nuestro
microprocesador y salta a atenderla. Hay tres eventos
que pueden disparar una interrupcin:

POR

Un evento hardware, previamente definido.


Un evento programado, o Timer
Una llamada por software

Un pin de Arduino que recibir la seal de


disparo
Una condicin de disparo
Una funcin que se ejecutar, cuando se
dispare la interrupcin (Llamada call back
function).
Lo primero es un pin de Arduino donde conectaremos el
timbre de llamada. Dependiendo del modelo Arduino
que tengamos, tendremos varias posibilidades:

Cuando un evento dispara una interrupcin, la ejecucin


normal del micro se suspende (ordenadamente para
poder volver) y salta a ejecutar una funcin especial que
llamamos Interrupt Service Handler o ISH (Servicio de
gestin de interrupcin).
Cuando el ISH finaliza, el procesador vuelve
tranquilamente al punto donde lo dej y sigue con lo que
estaba como si no hubiese pasado nada. El concepto de
interrupcin nace de la necesidad imperiosa de
reaccionar de forma inmediata en respuesta a un
acontecimiento electrnico fulgurante, que no admite
demora. Bien sea por la urgencia del suceso o porque
algo se podra perder de forma irrecuperable sino
reaccionamos con suficiente presteza.

Tabla 1. Pines de interrupcin externa.


Esto quiere decir que el Arduino UNO puede definir
dos interrupciones hardware llamadas 0 y 1, conectadas
a los pines 2 y 3 (Para que no sea fcil).

Pero Qu hay tan urgente que no pueda esperar? Es


que nuestros Arduino no son lo suficientemente rpidos
para ver cada poco si hay una seal de alarma? Por
qu complicarnos la vida con una cosa tan
extravagante? Depende. Nuestro Arduino puede estar
liado y solo leer la seal de un pin de tanto en tanto. Y
si la seal que aparece se desvanece antes de que
hayamos ido a ver, ni siquiera lo sabremos, porque
aunque son rpidos una seal electrnica lo es varios
millones de veces ms. Este es otro motivo por el que
usar delays tiene mucho peligro. En la jerga tcnica, a
pasar de vez en cuando a ver cmo est el asunto, se le
llama Polling.

En cuanto a la condicin de disparo puede ser:

De los tres
sucesos que pueden disparar una
interrupcin Nos encontramos con que Arduino no
soporta las interrupciones por software y punto.

LOW, La interrupcin se dispara cuando el pin


es LOW.
CHANGE, Se dispara cuando pase de HIGH a
LOW o viceversa.
RISING, Dispara en el flanco de subida
(Cuando pasa de LOW a HIGH).
FALLING, Dispara en el flanco de bajada
(Cuando pasa de HIGH a LOW).
Y una solo para el DUE: HIGH se dispara
cuando el pin esta HIGH.

Para usar interrupciones tenemos la funcin:

Y entonces porque hemos hablado de ellas? Pues,


porque otros entornos de programacin las aceptan y no
ser raro que en el futuro Arduino tambin.

AttachInterrupt (interrupcin, funcin, condicin);


Dicha funcin especfica que funcin se invoca cuando
se produce una interrupcin externa, si ya exista una
funcin adjuntada al pin se substituye por la nueva.

Articulo informe de proyecto

Los parmetros de esta funcin son:

Por ultimo nos conviene saber que existen algunas otras


instrucciones relativas a las interrupciones:

interrupcin: el nmero de la interrupcin (Es


un int y puede ser 0 o 1 esto para asignar el pin
a usar).
funcin: Es la funcin que se invocara cuando
la interrupcin suceda, esta funcin NO debe
tener parmetro NI tampoco devolver nada.
Comnmente se le conoce como rutina de
interrupcin de servicio.
condicin: Esto define el criterio de la
interrupcin es decir cuando se considerara
como interrupcin.

En nuestro caso especfico se defini el comando de la


siguiente manera:

noInterrupts(), Desactiva la ejecucin


interrupciones hasta nueva orden.

Interrupts(),
Reinicia
las
definidas con attachInterrupt().

detachInterrupt( num Interrupt), Anula la


interrupcin indicada.

6 INTERRUPCIONES
O TIMERS.

de

interrupciones

PROGRAMADAS

attachInterrupt(0, vuelta, RISING);


[5] Hasta ahora, hemos medido el tiempo en
milisegundos y usado el delay para temporizar las
cosas, as usbamos un delay de unos 250 ms para que
el blinking LED se encendiese y se apagase,
tranquilamente.El problema del delay () es que congela
Arduino el tiempo especificado. Mientras no sea mucho,
bueno, podemos aceptarlo, pero imagnate que
queremos hacer el blinking LED para un semforo,
donde los tiempos de espera van de digamos 30
segundos a 1 minuto.

y la funcin que invoca cuando realiza la interrupcin es:


Void vuelta(){
t1=t2;
t2=micros();
tv=t2-t1;
tm=tv/128;
sprintf(buffer, "%02d" ":" "%02d" ":" "%02d" ,h , m ,s);
Serial.println(buffer);
imprimir(buffer,tm);
}

Podemos pedirle que haga un delay de 60 segundos *


1.000 = 60.000 millis, pero claro esto supone que no
podremos hacer ninguna otra cosa hasta que no pase
un minuto, ni ver si nos pulsan un botn, o refrescar una
pantalla con el tiempo que queda de semforo.

Para lograr implementar este concepto en nuestro


proyecto se utiliz un sensor de herradura, el cual
consiste en un sensor ptico compuesto por un emisor y
un receptor separados. Cuando existe una interrupcin
o barreara entre el emisor y el receptor, se produce la
interrupcin.
Este sensor se implement con el fin de solucionar el
problema de estabilidad de la imagen mostrada por el
pov, ya que se deba controlar la velocidad del motor
para lograr estabilizar la imagen. Para efectos de
programacin lo que se realizar es utilizar la seal
enviada por el sensor en una entrada del Arduino y
configurarla como interruptor externo, permitindonos
tener el mismo nmero de lneas mostradas cada vuelta
sin tener en cuenta la variacin de velocidad del motor.

As que no parece muy buena idea usar delays en


muchas situaciones. No es raro que queramos
programar tareas peridicas en nuestros Arduinos en
rangos que van desde unos microsegundos hasta varios
minutos, pero queremos hacerlo de un modo que entre
tanto podamos seguir trabajando.
Para eso tenemos las interrupciones programadas o
Timers, para que nos toquen el timbre cuando hay que
ejecutar una funcin programada, sin necesidad de estar
continuamente comprobando si es la hora.

En la siguiente figura se observa el esquema de


conexin del sensor de herradura.

Ya vimos anteriormente el concepto de interrupcin


hardware. Es el equivalente a un timbre que nos avisa
de que alguien est en la puerta y debemos atenderle.
Arduino dispone adems de una segunda clase de
interrupciones, los Timers, que hacen lo mismo que las
interrupciones hardware, pero en lugar de dispararse
cuando se cumple un cierto proceso hardware en uno de
los pines, se dispara cuando ha transcurrido un tiempo
preciso, previamente programado.

Figura 1. Diagrama esquemtico de conexin sensor


de herradura.

Es el equivalente del despertador, que cada maana


suena a la misma hora.

Articulo informe de proyecto

6.1 LOS CONTADORES INTERNOS DE LOS


TIMERS
Nuestros Arduinos UNOS y MEGAs tienen un cristal que
trabaja a 16 MHz, o 16.000.00 de veces por segundo.

Tericamente podramos fijar una interrupcin cada


1/16000000 segundos, lo que no sera muy til porque
cada instruccin de Arduino necesita varios pulsos de
reloj para ejecutarse (y algunos muchos pulsos).

Pero como la felicidad completa no existe tenemos que


hablar de los inconvenientes:

Por eso cada Timer dispone de un registro interno que


indica cada cuantos ticks del reloj debe dispararse.
Bsicamente el que nos interesa es un Timer cuyo
registro es un entero sin signo de 16 bits, lo que le
permite contar hasta 2^16 = 65.536

Si este contador se disparase cada tick del cristal, no


nos servira de mucho porque, el mximo tiempo que el
contador podra abarcar sera de:

Como es muy probable que necesitemos algo ms de


flexibilidad en los tiempos, los que disearon el corazn
e Arduino, el ATMEGA328, incluyeron unos divisores de
esta frecuencia bsica del cristal de cuarzo., de modo
que solo salta un tick al contador cada ciertos ticks del
patrn bsico.

En este captulo detallaremos las condiciones y los


elementos que han intervenido en el desarrollo del
diseo de este proyecto. Dicho proyecto consistir
bsicamente en una placa de circuito impreso, en cuyo
extremo se encontrarn los LEDs controlados por un
microcontrolador [1], que rotar sobre si misma
impulsada por un motor a modo de hlice y que dejar
como estela una imagen previamente programada. A tal
dispositivo lo mencionaremos a lo largo de la memoria
con el nombre de POV, cuyas siglas corresponden al
efecto ptico que provoca (Persistence of Vision).

Un clculo rpido nos dice que el anterior mximo de


disparo puede subir desde los 4 ms de antes a 1024
veces ms, o sea alrededor de 5 segundos.

Aunque pueda pareceros poco tiempo, ya es un


margen considerable para atender a las
cuestiones urgentes con precisin.
Naturalmente existen libreras que a partir de
esto van incrementando contadores externos
para multiplicar el plazo de disparo

7.1 ESPECIFICACIONES

As pues en la jerga de Arduino, no hablamos de


contadores de disparo, en su lugar les llamaremos
Compare Match Registers o CTRs y a los divisores les
llamaremos prescalers.

Las principales especificaciones del dispositivo son:

Entre las ventajas tenemos:

El primero y grave, es que si jugamos con los


Timers, muchas de las instrucciones que
dependen de ellos dejaran de funcionar.
Entre estos estn, los pines PWM y
analogWrite() y la librera Servo. Dependiendo
del modelo Arduino y del Timer que usemos la
cosa es grave.
Si nuestro Timer entra en conflicto con algo
puede ser muy complicado comprender el
problema.
Si tu Servicio ISR tarda ms en ejecutarse de lo
que tarda en saltar la nueva interrupcin (Y te
puede pasar por un error de clculo) antes de
acabar puede volver a entrar porque ha
disparado de nuevo el Timer. La situacin
alcanzara un nivel de peligro inmediato porque
tu Arduino se colgar y no sabrs porque.

7 DISEO DEL CIRCUITO

En Arduino UNO esos divisores pueden ser 1, 8, 64,


256 y 1024. De ese modo podemos frenar hasta mil
veces la velocidad de incremento del contador de
disparo.

Conceptualmente la programacin orientada a


eventos es la predominante en los moderno
sistemas operativos como Linux, Windows o
OSX y si aprendis a pensar as no os resultara
difcil entender el concepto bajo Visual Basic o
C#.
No importa que estemos en un delay, la
interrupcin salta impecable.
La medida del tiempo es muy precisa.

Cdigo limpio y elegante. No tenemos que


calcular en el loop si estaremos perdindonos
algo o no. Cuando el tiempo programado se
cumple la interrupcin salta y se ejecuta
limpiamente.

Arduino UNO
Sensor de herradura
Alimentacin del motor mediante una batera de
9V con tensin controlada.
Alimentacin de la placa del Arduino regulada a
5V partiendo de una batera de 9V.
Optimizacin del espacio de los componentes.
Equilibrado de la placa mediante la reparticin
de pesos.

Articulo informe de proyecto

7.2 DISEO DE LA ESTRUCTURA

8 DESARROLLO Y MONTAJE

Para el diseo se ha tenido en cuenta que para la


correcta visualizacin de la imagen y as tener recorrido
la estructura general tuviera como punto de partida una
forma rectangular, como tambin que no fuera de
grandes dimensiones para que de esta manera el motor
tuviera la fuerza suficiente como para poder moverla. En
la figura 2 se muestra la forma que tendr el soporte
principal sobre el cual se colocara en Arduino y la
batera de 9V.

En este apartado veremos el resultado final de las


placas impresas y el montaje de las partes restantes,
como la parte de potencia necesaria para impulsar la
placa.

8.1 PLACA DE LEDS


Luego de soldar los LEDs y las resistencias a la placa
universal es necesario ubicar dicha placa en el soporte
principal de nuestro POV; la forma para ubicarla ser de
manera vertical en la parte frontal del soporte, la cual se
fij con pegante instantneo el cual nos ofrece la
seguridad que al someter esta placa al movimiento
circular necesario para obtener la ilusin ptica, no se
ver afectada de ninguna forma.

8.2 ARDUINO Y BATERA DE 9 V.


En la figura 4 se observa la ubicacin escogida para
cada uno de estos elementos. Primero se coloc el
Arduino en la parte media del soporte, y la batera en la
parte posterior, esto con el fin de lograr balancear el
peso, para reducir problemas de estabilidad y vibracin
que se pueden presentar al momento del funcionamiento
del POV.

Figura 2. Circuito impreso para LEDs y resistencias.


En la figura 2 tambin se observa una muesca en la
parte delantera del soporte, el cual fue diseado para
ubicar la placa del circuito impreso de los 10 LEDs como
se muestra en la figura 2 que estarn distribuidos de
forma vertical para lograr el efecto visual deseado. Para
este circuito se utiliz una baquelita universal la cual se
adaptaba muy adecuadamente a la necesidad de
colocar los LEDs de forma vertical y separados
exactamente la misma distancia, as como para ubicar
cada una de las resistencias que servirn como
Proteccin para evitar algn tipo de dao en los LEDs.
Cada resistencia est conectada a un LED en un lado y
de tierra en el otro.

Figura 3. Montaje de Arduino y batera de 9V.

Articulo informe de proyecto

8.3 MONTAJE DE PARTE DE POTENCIA.


MOTOR

8.4 CONEXINES
Luego de realizar los respectivos montajes se procede a
efectuar el conexionado del Arduino con la placa de
LEDs, de la forma como se refleja en la figura 5. Dichas
conexiones se realizan con cables jumper macho-macho
de 10 cm, en total son necesarios 11 cables; 10 para
cada uno de los led y 1 para la tierra que es comn para
todos. Tambin se procede a conectar la batera al
Arduino mediante el respectivo conector de la batera, y
la fuerte regulada al motor DC.

Una vez terminada la placa que en un futuro tenemos


intencin de que rote, seguiremos el montaje del
proyecto realizando la parte de potencia, que ser la que
impulse dicha placa. Para fijar la placa principal al motor
utilizaremos un soporte de madera rectangular para
acoplar la punta del motor con la madera tal como se
puede observar en la figura 4. Tambin se realiz un
soporte en forma de una mesa sencilla , que consta de
una pieza de madera con 4 soportes de 4 cm
aproximadamente ubicados en las esquinas del
rectngulo, y en la parte central la madera se realiz un
orificio con la finalidad que el motor que asegurado en
este sitio.

Figura 5. Conexiones de los elementos.

9 PROGRAMACIN.
Luego de terminar con el montaje fsico de los
elementos se contina con una parte muy importante del
proyecto que es la programacin del microcontrolador, la
cual ser vital para el xito del proyecto ya que de esta
depende el efecto o ilusin visual que se obtendr
finalmente.
Uno de los principales problemas resueltos fue la
estabilizacin de la imagen mostrada en el propeller, lo
cual se realiz mediante un sensor de herradura.
A continuacin se muestra el cdigo de programacin en
Arduino mediante el cual se obtiene la ilusin ptica de
una lnea movindose de adentro hacia afuera. [3]
Figura 4. Montaje del motor.

La programacin completa en Arduino puede ser


consultada en el siguiente link.

Conseguir el motor adecuado a nuestra necesidad ha


sido tal vez uno de los inconvenientes que fue necesario
abordar, debido a que se requera un motor que contara
con buena velocidad y fuerza, y no se dispona de un
motor que cumpliera con esta relacin. Finalmente se
logr disponer con un motor que se acoplaba a nuestra
aplicacin tanto en velocidad y torque necesarios para
lograr continuar adelante con el proyecto.

https://mega.co.nz/#!04kCUbaJ!247VvdAxzZRfYYpIgeQ
agu7FymbG-QrNPWMWFTXLjug

Articulo informe de proyecto

11 REFERENCIAS
[1] Wikipedia. Microcontrolador [en lnea]. Wikipedia, La
enciclopedia libre, 2013 [fecha de consulta: 02 de
septiembre del 2014]. Disponible en
<http://es.wikipedia.org/w/index.php?title=Microcontrolad
or&oldid=70094543>.

A continuacin se muestra el resultado final del reloj


digital.

[2] Urriellu. POV (Persistence of Vision display)


[Blog Internet] Blog de desarrollo de Curuxa, 2010 [fecha
de consulta02 de septiembre del 2014]. Disponible en
<http://blog.curuxa.org/electronica/pov-persistenceofvision- display/>

[3] Matas Alcal J., Ramos Lara R., Microcontroladores


MCS-51 y MCS-251.Editorial Ediciones UPC, Barcelona,
2001.
[4] Arduino y las interrupciones, [fecha de consulta 25 de
febrero
del
2014].
Disponible
en
w.prometec.net/interrupciones//.

Figura 6. Reloj digital con propeller en Arduino.

10 CONCLUSIONES.

Se determin el motivo y el concepto de las


interrupciones.

Vimos que en Arduino UNO solo disponemos


de 2 interrupciones llamadas 0 y 1 en los pines
2 y 3 respectivamente.

analizamos los posibles disparos de una


interrupcin por flanco de subida, bajado o
LOW

Hemos visto que adems de las interrupciones


por hardware podemos ejecutar interrupciones
programadas mediante Timers.

En este Proyecto se ha planteado el objetivo de


controlar un mecanismo rotativo de LEDs para
generar un reloj digital mediante la
programacin con Arduino.

Dadas algunas dificultades que se presentaron


durante el montaje, es conveniente resaltar que
la parte de diseo es fundamental para el xito
del proyecto.

Tambin surgieron problemas a la hora de


lograr que el reloj estuviera coordinado con la
hora real y lograra un grado de precisin similar
al de un reloj convencional. Estos problemas se
solucionaron con investigacin sobre la
programacin.

[5] Arduino y los Timers, [fecha de consulta 25 de


febrero
del
2014].
Disponible
en
http://www.prometec.net/timers/.

Potrebbero piacerti anche