BricoClock: Reloj gigante casero con Arduino

Publicado por en Tutoriales el 27/12/2010

Según se puede leer en la Wikipedia, el tiempo es la magnitud física con la que medimos la duración o separación de acontecimientos sujetos a cambio. Es la magnitud que permite ordenar los sucesos en secuencias, estableciendo un pasado, un presente y un futuro. El inevitable tiempo tiene, bajo mi opinión, cierta magia ya que se puede medir utilizando lo que denominamos reloj, pero no podemos percibirlo de ninguna manera. Cuando miramos un reloj, sabemos que el segundo que estamos observando en un determinado momento no volverá (en teoría) a suceder y el tiempo sigue por siempre jamás e inevitablemente su camino. Podría filosofear o seguir hablando de la belleza de tiempo durante un buen rato (cosa que le encantaba a Albert Einstein), pero como todo buen Geek, me gusta de vez en cuando meterme en algún proyecto que me exprima la cabeza, para mantenerla en forma, y que ocupe mi escaso tiempo libre. Entonces por que no hacer un reloj? No es descabellado y obviamente no soy el primero, ni mucho menos el último en aventurarme en la realización de un reloj casero. Por éste motivo, os invito a descubrir la aventura de mi último proyecto de un reloj casero que comenzó a finales del año 2009 y que me gustaría compartir con vosotros.

Un reloj casero, por qué?

Lo primero que te dice un colega en un bar es: "Un reloj? pero si los hay de todo tipo en los chinos por 10 Euros". Si eres de los que piensa lo mismo, es mejor que no sigas leyendo y directamente vallas a youtube, facebook o algún portal similar a perder el poco tiempo libre que tienes en tu vida o incluso ir a ver el partido de turno, lo cual me parece estupendo. Si por el contrario, sabes como yo la respuesta y quieres tomar la pastilla roja, sigue leyendo :)

Cuando me levanté aquel día, me andaba en la cabeza hacer algún proyecto interesante y la verdad no recuerdo el porque se me ocurrió hacer un reloj. Es posible que me viniera a la cabeza el ya famoso reloj de Spakfun que ha dado la vuelta al mundo y es bien conocido. De hecho, hacía pocos días que me volviera a leer el post original del cómo se hizo dicho reloj. La verdad es que me parece un proyecto excelente y muy bien realizado. Además, el tamaño imponente de ese reloj tiene para mi cierta belleza, por lo que me dije: "Por que no?". Quizás el tamaño (de varios metros) era un poco exagerado por lo que me decidí a hacer un reloj un poco más pequeño, pero lo suficientemente grande para que llame la atención. Dado que no lo iba a colocar en mi casa, sino en mi trabajo, tenía que tener cierta belleza (a parte de funcionar correctamente claro!). Además, es un lugar ideal para que la gente lo vea y a todos nos gusta mostrar el resultado de nuestros proyectos! :)

Bueno, entonces que necesitamos?

Hacer un reloj para mostrar la hora está bien. Si enseñamos además la fecha está mejor, pero aquí faltaba algo. Dada la naturaleza de mi trabajo, estoy constantemente conectado a Internet y me alimento de mucha información a diario. Esta es la excusa perfecta para incorporarle al reloj algún tipo de conectividad a la red de redes. Por ese motivo, decidí incorporar una pequeña matriz de LED para mostrar mensajes personalizados mientras se muestra la hora. Eso también permite mostrar gran variedad de mensajes como por supuesto la fecha actual sin utilizar los dígitos principales.

Lo primero que se necesita son unos display LED de 7 segmentos suficientemente grandes. Para eso y por la calidad de su acabado, me decidí por unos dígitos SA40-19SGWA fabricados por Kingbright que miden aproximadamente unos 12 centímetros de alto y que he conseguido en rs-amidata por poco más de 10 euros cada uno.

He comprado 6 unidades, por lo que podremos mostrar con seis digitos, las horas, los minutos y los segundos. Cada segmento necesita alrededor de 11,8V (20mA) para funcionar y son de ánodo común. Sólo he necesitado añadir 4 diodos LED de 10mm para completar el conjunto. Todos los displays y los LED son verdes, aunque también existen en rojo.

Por otro lado, para la matriz de LED, he utilizado las estupendas matrices de Sure Electrónics que como veremos más adelante, me han ahorrado mucho (mucho!) trabajo y facilitado enormemente el proyecto.

Estas matrices utilizan un interesante chip HT1632 fabricado por Holtek que gestiona un array de diodos LED de hasta 16x32. Esta matrices tienen un total de 256 diodos LED cada una y he utilizado cuatro de ellas para gestionarlas en cascada.

El controlador principal

Ahora que tenemos casi todo lo necesario para comenzar, obviamente necesitamos de algo "inteligente" para getionar todo el conjunto. Como no podía ser de otra manera, he utilizado dos placas Arduino. Un Arduino Mega para el control de los dígitos y diodos LED verdes y un Arduino Duemilanove para controlar la matriz de LED.

Cuando realicé el reloj, he utilizado el modelo Duemilanove y MEGA, aunque en la actualidad, han sido reemplazados por el Arduino UNO y Arduino MEGA 2560 respectivamente. El códido debería funciona sin problema en esta nuevas versiones. Para facilitar el montaje he utilizado también unas protoshield tanto para el Arduino Mega, como para el Arduino Duemilanove

Con ésto podremos montar los distintos componentes de forma fácil. Por último pero no por eso el menos importante, el componente base pasa éste proyecto:

Esta pequeña placa dispone de un chip reloj RTC DS1307 que nos permite saber la hora y fecha actual. También tiene una pequeña pila para que aunque falle la alimentación, no pierda la hora/fecha durante unos cuantos años. Es muy sencillo de manejar ya que utiliza el conocido bus I2C. Veremos más detalles sobre esta pequeña maravilla cuando lleguemos al software.

Ya que estamos y ya que disponemos de una matriz para mostrar mensajes, no me pude resistir en añadir un pequeño sensor SHT15 que permite saber la temperatura y humedad relativa :)

Llegado a éste punto, tenemos practicamente todo lo necesario para montar el reloj, salvo un último detalle importante. Como he dicho antes, los display LED de 7 segmentos de Kingbright necesitan de poco más de 11 voltios para poder funcionar correctamente, cosa que por supuesto nuestro arduino no puede proporcionar. Entonces cómo hacemos? Pues con la ayuda de un maravilloso chip SAA1064 que básicamente controla hasta 4 display LED de 7 segmentos que funcionen hasta 15V y además tiene una entrada I2C compatible con 5V, por lo que es perfecto para utilizar en este proyecto.

He utilizado 2 de ellos para controlar los 6 dígitos y para hacerlos funcionar, he utilizado el esquema básico del fabricante. Los transistores no son críticos, cualquier NPN vale perfectamente, lo importante son los condensadores de desacoplo C01 y C02, ya que sin ellos el chip puede hacer cosas raras. Hay que procurar tenerlos lo más cerca posible de los integrados.

Control Inalámbrico

El reloj dispone de una matriz que permite mostrar distintos mensajes, los cuales vienen de un Feed en formato RSS. Para enviar toda la información al reloj, he optado por unos módulos Xbee que proporcionan conectividad inalámbrica de manera muy fácil. He utilizado dos módulos Xbee 2.5 con antena integrada como estos:

 


Para conectar el módulo al reloj, he utilizado una placa XBee Explorer regulada que incorpora todo lo necesario para utilizar el XBee con Arduino y a 5V (los XBee funcionan normalmente a 3,3V). Luego para gestionar el reloj, un script en Processing en un PC envía el feed al reloj con la ayuda de una placa XBee Explorer USB.

Para resumir todo el material que se necesita y para ayudar a quien lo quiera reproducir, aquí os dejo una pequeña lista de la compra:

Esto es un poco a groso modo lo que necesitamos para montar la electrónica del reloj aunque como se puede apreciar, estoy obviando todo el tema de cableado, placas perforadas y componentes pasivos que podamos necesitar. Como he dicho antes, podemos utilizar un Arduino UNO y Arduino MEGA2560 que es básicamente lo mismo. Para la EEPROM he utilizado una de 1Mbit pero puede utilizarse una más pequeña, la única diferencia será la cantidad de Feeds que podremos almacenar. Para la alimentación del conjunto he utilizado un pequeño transformador toroidal de 2x6V (5A) que alimenta el Arduino Mega, el controlador de los dígitos (SAA1064) y el Xbee. En una pequeña placa he montado dos reguladores que proporcionan las tensiones necesarias a la lógica y a los dígitos. Por un lado un LM338 que proporciona 12V y un LM7805 que alimenta el Arduino Mega y todos sus componentes. Ambos tienen un pequeño disipador de aluminio para evitar calenturas. Dos diodos LED indican la presencia de las dos tensiones. El día que hice la alimentación estaba pletórico y he hecho una pequeña PCB que aloja todo el conjunto. Todo lo demás está montado sobre placa perforada y a base de cables, soldar y mucha paciencia :)

El Arduino Duemilanove que controla las matrices tiene una alimentación independiente de 12V (1A) ya que la alimentación principal (sobre todo el LM7805) se calienta un poco y no quise arriesgar :) Cada matiz, con todos los diodos LED encendidos consumo arededor de 200mA (unos 800mA en total aproximadamente), por lo que con 1A estoy cubierto.

Organización de los componentes del Reloj

El reloj está estructurado de tal forma que existen tres grandes bloques: La alimentación principal, el reloj y la matriz. Cada bloque es independiente. Por un lado tengo el Arduino Mega, con el sensor de temperatura, la RTC y el XBee, y por otro lado un Arduino Duemilanove conectado a las matrices de Sure y con una pequeña memoria EEPROM de 1Mbit para almacenar los feeds. Lo único que une el controlador de la matriz con el reloj son dos pequeño cables, que conectan el UART del Arduino Duemilanove con el UART2 del arduino mega. Por ese preciso motivo he selecionado un Arduino Mega para el reloj ya que dispone de 4 puertos série. El primero no se usa más que para programarlo  y debug. El segundo puerto para el Xbee y asi poder comunicarse con la "base". El tercero se utiliza para conectar el Arduino Duemilanove y así poder comunicarse con la matriz de LED.


He hecho algunas pruebas en una protoboard para asegurarme de que todo el conjunto funcionara correctamente. Se puede apreciar en la imagen que inicialmente pensaba en utilizar directamente matrices de LED de 8x8 en cascada gestionadas por registros de desplazamiento, pero el microcontrolador estaría demasiado ocupado y descarté la idea. Por eso he optado por la matrices de LED Sure. También he intentado utilizar un MAX7119 pero tras descubrir el SAA1064 lo descarté directamente.

El software

Una vez conectados todos los componentes, he tenido que ir por partes ya que hay bastantes cosas donde se necesita meter mano para que todo el conjunto funcione. Obiamente, por lo primero que he comenzado es conectar en la Mega Protoshield la RTC y el sensor SHT15 y verificado mediante el puerto série que todo esta funcioinando correctamente. El puerte série ayuda muchisimo en el debug del programa y simplemente con unos Serial.print, en muy poco tiempo tenía un conjunto de funciones que permitían recuperar la hora, la fecha, temperatura y humedad. Podeis ver todos los detalles en el código fuente que podeis descargar al final del artículo.

Inicialmente he pensado en incluir una Wifi Shield para conectar el reloj directamente a Internet, pero el problema de la latencia de conexión me ha hechado para atrás, ya que quería por todos los medios mostrar el tiempo de formar estable, contínua y sin cortes. Cuando se actualizan los 6 dígitos, tan sólo disponemos de apenas 1 segundo para hacer el resto de procesos y lo más probable es que la descarga de un feed tome demasiado más tiempo quedando el reloj bloqueado mientras tanto.

La conexión inalámbrica permite hacer auténticas virgerías. He utilizado la estupenda librería Messenger para poder disponer de un pequeño protocolo de comandos sencillos y así poder gestionar ciertos aspectos del reloj. Realmente es una conexión série, y de hecho si nos conectamos mediante minicom (Linux) o Hyperteminal (Windows), podemos ajustar la hora y fecha entre otros. Obiamente se puede ampliar y modificar a gusto para cambiar más cosas. El pequeño protocolo funciona enviando comandos de la siguiente forma:

[ACCION] [PARAMETRO] [VALOR]

Donde ACCION puede set SET o GET (establecer o recuperar), PARAMETRO es el tipo de parámetro que queremos cambiar o recuperar y a continuación el valor correpondiente. Por ejemplo, si queremos recuperar la temperatura actual, enviaremos: GET TEMP (seguido de un retono de carro \n, esto es muy importante para que funcione la librería Messenger). El reloj responderá con la temperatura seguido también de un retorno de carro. En el caso de que no se reconozca un comando, responderá KO indicando que algo está mal. No he implementado control de errores, por lo que si podemos mal algún parámetro, no funcionará bien. De hecho, cuando anviamos un comando que no existe, se queda esperando respuesta por siempre jamás...

Como referencia, dejo a continuación la lista actual de parámetros disponibles:

SET TIME
Establece la hora y fecha actual de forma permanente. Ejemplo: SET TIME 12 7 3 2 4 10 - Pone la hora a las 12:07:03 y fecha 2 de abril de 2010 (02/04/2010)

GET TIME
Recupera la hora actual en format HH/MM/YYYY - Ejemplo: 12:07:03

GET DATE
Recupera la fecha actual en formato DD/MM/AAAA - Ejemplo: 02/04/2010

GET TEMP
Recupera la temperatura actual - Ejemplo: 21

GET HUMI
Recupera la humedad relativa actual - Ejemplo 67

GET VERSION

Devuelve la version del firmare. Ejemplo: 1.0

Hay otros parámetros utilizados para actualizar la matriz. Viendo el código fuente, en la función MsgParse() podemos verlo en detalle. Todo esto nos permite gestionar a distancia el reloj pero obiamente es poco práctico. Aqui es donde entra el programa base del reloj hecho en Processing que se encarga de aplicar éste pequeño protocolo y tener siempre el reloj al día.

Os dejo la descarga directa al software por si quereis reproducirlo o simplemente hechar un vistazo:

Tambien encontrareis algunas funciones interesantes para el manejor del sensor SHT15 y la RTC DS1307 que siempre es útil tener a mano.

Programa en Processing

Dado que el reloj espera ordenes mediante su enlace inalámbrico con XBee, he tenido que realizar un pequeño programa que se encargue automáticamente de hacerlo todo: Mantener la hora y fecha actualizada y descargar y actualizar el feed. Me han pasado por la cabeza muchas ideas, entre otras de crear un programa en C que funcione como servicio del sistema y que se encargue de todo, pero el tiempo de desarrollo posiblemente sea muy largo y también sería muy dependiente del sistema operativo utilizado ya que no quería verme obligado a utilizar Windows para esta aplicación ni tampoco me apetecía hacer un "port" para otros sistemas. La solución que me pareció más rápida y elegante fué utilizar el entorno Processing.

Éste maravilloso entorno permite programar rápidamente y de forma fácil practicamente todo lo que queramos en lenguaje ANSI C. Utiliza una base en JAVA y de hecho es lo que se ha utilizado como base para el IDE de Arduino. Además permite generar un ejecutable válido para Windows, Linux y MacOS a partir del mismo código fuente y sin modificaciones. Es bajo mi opinión el mejor candidato para esta tarea.

Es muy sencillo y como he dicho, aplica el pequeño protocolo descrito anteriormente para actualizar el reloj. También dispone de un pequeño botón por si queremos actualizar el feed manualmente. Todo lo demás lo realiza de forma automática en base a la configuración establecida en el fichero de configuración config.xml presente en el directorio data de la aplicación. Por supuesto, el código fuente también está disponible para verlo o mejorarlo a vuestro antojo. Está plagado de bugs y recientemente estoy intentando mejorarlo asi que estais avisados... ;)

Una bonita caja de granito

Creo que es importante que cualquier proyecto termine en una bonita caja y como se ha comprobado en mi otro proyecto "ArduGame", hacer cajas no se me da para nada bien. Entonces cómo podemos hacer? No había muchas opciones aunque como base, he utilizado tablero DM de 1cm de grosor que me ha servido para tener todo el conjunto ensamblado. El planteamiento de la caja fué el siguiente:


El tamaño total es de 70x30 centímetros, por lo que es bastante grande creo yo! :) Aqui no hay medidas, pero creo que os haceis una idea.
He pensado en recubrirlo de metacrilato negro pero tampoco me convencía, por lo que he optado, con la ayuda de unos amiguetes que se dedican a eso, por cubrirlo de un material noble como es la piedra de granito. Se lo he planteado a mi amigo Oscar de Marmoles Pereiro y ha accedido a realizar la colocación de las piedras cortadas a medida. Nos fuimos para el taller con unas cervezas (Estrella Galicia por supuesto) y éste es el resultado:

En el frente he puesto un cristal de 4mm de espesor hecho a medida para proteger los gígitos y además permite limpiarlo con facilidad. La piedra de granito es de 2,5cm de espesor y nos ha costado bastante ajustarlo al reloj ya que mi caja, como era de esperar, no estaba del todo a escuadro... (si, las cajas no es lo mío...). Se ha sellado el conjunto con pegamento especial para piedra y una pequeña tira de silicona negra en el borde del cristal para que quede lo mejor rematado posible. Os dejo unas cuantas fotos del proceso que podeis pinchar para verlas en alta resolución en Flickr.

Como se puede comprobar, el reloj está formado por unas láminas de granito que presionan el cristal. Se ha aplicado pegamento especial para pierda y pulido los cantos para darle un acabado lo más fino posible. Tuvimos bastantes problemas para colocar las piedras sin romper el cristal. De hecho en el primer intento el cristal simplemente se partió y tuve que encargar otro. Despues de eso, fuimos realmente con pies de plomo :) Y hablando de plomo, tengo que decir el el reloj pesa muchisimo, unos 10 kilos aproximadamente y he utilizado unos tirafondos de 4mm para colgarlo de forma segura sin riesgo de una caida y que le parta la crisma a alguien.

Conclusión

Ha sido un proyecto interesante, lleno de errores por mi parte sobre todo en la selección de componentes y planteamiento inicial. Me he divertido mucho haciéndolo y lleva ya algunos meses colgado en mi trabajo. La verdad es que llama la atención por lo que creo que la meta fué conseguida :)

He colgado en flickr bastantes imágenes que muestras las distintas etapas del proyecto, incluso algunas donde inicialmente pensaba realizar los dígitos a mano utilizando unas planchas de PVC, idea que rápidamente descarté al ver el asombroso trabajo que me daba y lo mal que quedaba.

Os dejo por aqui algunas imágenes de cómo ha quedado el reloj por dentro. También podeis hacer click sobre ellas para verlas más grandes.

Fué un proyecto que me llevó bastante tiempo realizar y que básicamente hice en mis ratos libres. Me gustaría dedicarlo a mi padre que lamentablemente ya no está aqui y que siempre me ha enseñado mucho. Me gustaría haber podido enseñarselo y compartirlo con él pero muy a mi pesar no puede ser. Algún dia nos volveremos a ver.

Espero que os guste éste proyecto y por supuesto no dudeis en dejar vuestro comentario!

Si te ha gustado, compártelo con tus amigos!

Ver comentarios antiguos...

Uso de Cookies

Utilizamos cookies propias y de terceros para optimizar tu visita. No utilizamos cookies para recoger información de carácter personal.

Puedes permitir su uso o rechazarlo y cambiar su configuración cuando lo desees.

Cerrar

Más información en nuestra Política de Cookies.