English Version

Versão totalmente montada com LEDs vermelhos em um invólucro de papelão amadorístico mas visualmente decente
Versão totalmente montada com LEDs vermelhos
em um invólucro de papelão amadorístico mas
visualmente decente. Clique para ampliar.

A placa populada, pronta para montagem final.
A placa populada durante a montagem. Os LEDs
e botões serão soldados com suas frentes para
o outro lado. Clique para ampliar.

Esquema
O circuito. Clique para ampliar.


O Relógio Decimal-Codificado-em-Binário

Um relógio nerd usando um único microcontrolador AVR de 8 pinos em que os dígitos das horas, minutos e segundos de cada dígito são exibidos em binário através de LEDs, parecido com os famosos relógios da ThinkGeek, mas com alguns recursos exclusivos, tais como contagem em código de Gray.

What is this binary clock thing anyway?

Trata-se de um relógio digital que diz as horas usando dígitos binários ao invés de decimais. Os relógios binários viraram moda de uns tempos pra cá devido ao seu visual retrô de "luzes piscantes" que lembram os computadores "mainframe" dos anos 60 que, a despeito de alguns exageros de Hollywood, tinham mesmo muitas luzes piscantes.

Muitos adultos encaram como uma maneira desnecessariamente rebuscada de mostrar as horas, típica do pendantismo estereótipo dos CDFs. Na verdade, eles são até mais fáceis de ler do que os relógios de ponteiro: nestes, você precisa saber a tabuada de 5, ao passo que em um relógio binário basta saber somar (e no modo BCD, a adição dá no máximo 9).

Claro, relógios digitais com mostradores decimais são mais fáceis de ler -- mas isso é devido a um viés cultural: a maior parte das pessoas são ensinadas bem cedo no colégio a pensar em decimal. Conheço alguns garotos que aprenderam a ler relógios binários antes mesmo de aprender o sistema decimal; um deles, anos depois, comentou que achava os relógios analógicos desnecessariamente complicados e ficara frustrado de ter sido obrigado a aprender a lê-los na escola.

Esta página explica como ler relógios binários e como construir um cheio de recursos mas de custo acessível.

Mas... por que?

Por pura diversão nerd. Também porque fica bonito na minha sala de estar. Ajuda a entreter meus convidados. Alguns deles de fato abanam a cabeça, chocados com minha nerdice descarada.

É também bastante útil para explicar a notação binária aos meus alunos.

Recursos/Características

  • Conta o tempo de duas formas:
    • Seis dígitos de até 4 bits, um em cada coluna, para leitura fácil; ou
    • Três grupos de até 7 bits para horas, minutos e segundos, para uma leitura ligeiramente mais desafiadora;
  • Mostra a contagem em notação decimal codificado em binário ou em código de Gray binário refletido para uma leitura bem desafiadora;
  • O modo de exibição pode ser mudado sem necessidade nem de reiniciar nem de reajustar
  • Alimentado por uma fonte de alimentação 'tijolo' comum de 9VDC
    • Conector para uma bateria de 9V opcional: mantém o relógio funcionando mesmo em caso de falta de luz
  • Oscilador de cristal de quartzo provê boa precisão e estabilidade
  • Baixo custo, menos de R$ 50,00 em materiais. Talvez bem menos se você não usar LEDs de alta intensidade caros
  • Placa de circuito impresso de face simples, fácil de fazer com processos amadores

Operação

Esta seção explica como operar o relógio, assumindo que você já tem um montado e funcionando. Muito do exposto aqui também se aplica a relógios binários de outros "fabricantes".

Se você quer saber em detalhes como ele funciona e talvez construir o seu, leia a seção "Hardware" mais adiante.

Lendo o Mostrador

Cada um dos quatro modos de operação do mostrador estão descritos em suas próprias páginas:

Se você pressionar o botão MODO (o botão mais da direita) enquanto o relógio estiver contando, ele passará para o modo de exibição seguinte. Ao chegar no último, voltará para o primeiro.

Acertando a Hora

Há três botões. Da esquerda para a direita: HR, MIN e MODO.

Pressionando HR ou MIN entra no modo de ajuste, parando o relógio e zerando o contador de segundos. Pressionar HR incrementa as horas; MIN incrementa os minutos. Eles voltam a zero ao atingirem seus valores máximos.

Em modo de ajuste, pressionar MODO reinicia o relógio: o contador de segundos vai voltar a contar. A contagem reinicia quando você solta a tecla MODO. Isso facilitar sincronizar manualmente com outro relógio com precisão limitada apenas pela sua velocidade de reação, tipicamente de poucos décimos de segundo.

Hardware

Projeto

Como sempre, tentei manter a abordagem 'o mais simples e com o menor número de componetes possível'. Além disso, queria ver se o projeto caberia em um microcontrolador de apenas 8 pinos. Descontando os pinos de alimentação VCC e terra obrigatórios, resta-nos seis pinos usáveis como E/S.

A primeira observação importante é que podemos controlar todos os 20 LEDs com apenas cinco pinos. A animação abaixo mostra como: vislumbre cada pino de controle como um vértice de um K5 (o grafo completo em cinco vértices, desenhado abaixo como um pentágono com todas as suas diagonais) onde em cada uma das dez arestas temos dois LEDs conectados em antiparalelo. Fornecendo corrente (i.e., enviando um "1" lógico) em um pino especifico e consumindo essa corrente (um "0" lógico) ao mesmo tempo em que se deixa todos os outros pinos disconectados (como "entradas"), podemos acender um LED de cada vez.

Se passarmos por todos os LEDs mais rápido que 50 vezes por segundo (acima do limiar humano de percepção de intermitência), obtém-se a ilusão de que eles estão continuamente ligados. Isso tudo pode parecer complicado à primeira vista, mas se presta a uma implementação em software bastante simples.

O outro truque é como fazer o teclado reusar os mesmos cinco pinos. De fato, só precisamos de três. Um lado dos botões está conectado ao VCC; o outro tem o divisor de voltagem clássico usando resistores para evitar que os LEDs apaguem ao pressionar as teclas, ao mesmo tempo provendo uma diferença de voltagem suficiente para ser detectado pela MCU. Com LEDs de alta intensidade, dá pra vê-los levemente iluminados quando se pressiona um dos botões.

O sexto pino é usado como entrada do sinal de clock do oscilador externo. Em teoria poderíamos usar o oscilador interno do AVR, mas mesmo após propriamente calibrado e sob as melhores das condições, sua precisão, de apenas uns 2%, é muito baixa para nossa aplicação -- nada mais irritante que um relógio que precisa ser acertado com freqüência. Com a estabilidade típica de 200 partes por milhão que os osciladores de quartzo tipicamente têm, obtemos um relógio que só precisará ser ajustado apenas umas poucas vezes por ano.

Não dá pra usar um cristal diretamente porque isso requeriria dois pinos do AVR, quando só temos um restante. Chafurdando minha pilha de sucata, achei uma placa de rede Ethernet 10BaseT que tinha um oscilador Aker AX0-200A de 20MHz. É muito mais rápido do que precisamos, só que era o único que eu tinha. Isso me forçou a usar um ATtiny45 porque era o único AVR de 8 pinos que eu tinha na ocasião que oficialmente suporta uma freqüência alta como essa. Mas também é exagero, porque o firmware usa menos de 1KB e, exceto pelo stack, não requer nenhuma RAM. Algumas semanas depois eu comprei um ATtiny13 muito "menor" e, como suspeitava, funciona perfeitamente.

A fonte de alimentação é o circuito clássico do regulador de voltagem 7805. Há também pinos para conectar, através de um diodo, uma bateria de 9V à entrada do regulador para atuar como reserva em caso de queda de energia -- isso alivia o problema de ter de reajustar o relógio com freqüência que acontece em áreas com fornecimento intermitente de energia. Aqui onde moro a disponibiliade de energia é >99,95%, mas uma ou duas vezes por mês acontece uns "clicks" que 3 a 5 segundos que são suficientes para fazer com que computadores que não estejam protegidos por no-breaks sejam reiniciados. Eu recomendo baterias alcalinas de 9V; não recomendo baterias recarregáveis por causa da sua elevada taxa de auto-descarga: como só serão consumidas nos raros momentos em que faltar energia, é provável que elas já tenham se auto-descarregado quando isso acontecer.

As versões que tenho feito mais recentemente usam um ATtiny13 com um oscilador de 4MHz SG-531P. Elas consomem menos de 10mA de correte, mesmo com "todos os LEDs ligados" (lembre-se, isso não acontece de fato; a cada instante há apenas um LED ligado). Uma bateria alcalina de 9V típica costuma ter um a capacidade de pouco mais de 600mAh, de sorte que podemos esperar que o relógio funcione por cerca de 60 horas com uma dessas. Isso é mais de 10 vezes o tempo médio anual sem energia elétrica aqui em Recife. Em outras palavras, a não ser por um apagão nacional, é improvável que eu venha a ter de trocar a bateria mais do que uma vez a cada dois anos.

Dicas de montagem

Se você usar a placa face simples inclusa no projeto, tenha em mente o seguinte:

  • A maior parte dos componentes deve ser montada do lado do cobre; só os LEDs e os botões devem ser ficar no lado liso.
  • Os pinos do LED4 ficam bem perto da lata do oscilador. Não deixe eles se tocarem.
  • Preste atenção na orientação/polaridade dos LEDs.

Firmware

Instalação

Daqui em diante vou supor que você já baixou o pacote de distribuição e o desempactou em algum diretório. O pacote vem com imagens pré-compiladas.

AVISO: Uma vez que vamos usar o pino /RESET como E/S, o processo de programação vai desabilitá-lo. Isso significa que se você não tiver um programador de alta voltagem (tal como o STK-500 da Atmel), você só conseguirá usar a programção "em circuito" via SPI uma única vez.

Coloque a MCU na sua placa de programação favorita. Se você usa o avrdude e o usbasp como eu, verifique que os caminhos e configurações no Makefile estão OK para o seu sistema e digite:

make upload_isp

Para configurar os fusíveis, digite:

make fuses

Lembre-se: desse ponto em diante você não mais poderá usar ISP via SPI. Se você quiser atualizar o firmware novamente usando programação de alta voltagem, remova a MCU, coloque-a em um programador de alta voltagem e digite:

make upload_hvsp

Depois, coloque a MCU de volta na placa do RelógioBCD.

Compilando

É preciso que você tenha um avr-gcc recente (eu usei a versão 3.4.4) com a avr-libc 1.4.0 ou superior. Se você estiver usando Windows, imagino que versões recentes do WinAVR devem funcionar.

Mude os caminhos no Makefile para que façam sentido no seu sistema. Feito isso, digite make clean para remover as versões precompiladas e qualquer outra sujeira e por fim digite make. O resultado deve sair nos arquivos main.hex, eeprom.hex.

Outras Simulações em Software

  • Dê uma olhada nessa planilha do Excel. Ela simula vários relógios, inclusive uma versão desse (mas sem os segundos).

Adaptando para outros processadores

Recentemente reescrevi o software segundo as seguintes restrições:

  • Evitar quaisquer instruções que não existam no núcelo avr1 (adiw, sbiw, lds, std e afins);
  • Usar apenas a interrução de estouro do Contador0 ao invés dos registradores de comparação;

Eu esperava conseguir fazê-lo funcionar no ATtiny12 com um oscilador de 4MHz, mas relendo com mais atenção o datasheet do dispositivo, notei uma limitação que não havia visto antes: a porta PB5 só pode atuar como saída em modo "open-drain" (ou seja, existe um PINB5 e um DDRB5, mas não um PORTB5, de sorte que ele só pode ser ou entrada de alta impedância ou puxando para o terra). Isso significa que não dá para controlar todos os 20 LEDs; ficamos limitados a 16.

O ATtiny11 é ainda pior: o PB5 dele só pode ser usado como entrada; não pode ser usado como saída em absoluto (ou seja, só há um PINB5; não há nem DDRB5 nem PORTB5).

Já o ATTiny15 não funcionaria por uma razão totalmente diferente: ele não aceita clock externo.

Deveria ser possível usar esses chips, contudo, se usarmos as portas PORTB4..0 para os LEDs e o PINB5 para obter a base de tempo a partir dos 50/60Hz da tomada elétrica, tal como fazem muitos relógios. Esta página (em inglês) discute como as companhias elétricas na Holanda e ao redor da Europa condicionam as formas de onda da energia elétrica para que sejam bastante estáveis a longo prazo, precisamente para que relógios baseados nelas não atrasem nem adiantem demais. Eu não sei o quão bem feito isso é aqui no Brasil, nem mesmo se é feito; mas eu suspeito que sim, porque é necessário para que as companhias elétricas possam vender energia umas para as outras. Planejo pesquisar mais sobre isso e quem sabe construir outra versão desse relógio baseado nessa técnica e nesses processadores "menores".

Licença e Downloads

Este projeto é disponibilizado sob a licença 'Atribuição-Uso / Não-Comercial / Compatilhamento pela mesma licença' versão 2.5 do Creative Commons:

Comparação com Dispositivos Semelhantes

  • Um relógio semelhante criado pelo Hans Summers usando vários contadores e portas lógicas da série 74. Suporta apenas DCB de 6 dígitos, sem código de Gray nem bateria de reserva.
  • Outro relógio segundo as mesmas linhas, criado por Bill Bowden. Ele tem 19 LEDs, ao invés de 20, de sorte que conta no formato 12 horas.
  • Ainda outro criado por John Hall usando a disposição de 3 grupos, usando LEDs de cores diferentes. Também sem código de Gray nem bateria de reserva.
  • A loja Electronic USA vende um kit de relógio binário por US$ 49,95. Tem bateria de backup, mas só suporta o modo de DCB de 6 dígitos sem código de Gray.
  • Já havia mencionado acima os vendidos pela ThinkGeek. A descrição diz que ele suporta tanto o modo de 6 dígitos DCB quanto o de 3 grupos, mas parece precisar ser reiniciado para trocar de modo. Não há suporte a código de Gray e nada se fala sobre bateria de reserva.

Eu acho que meu projeto tem os seguintes prós:

  • Usa um único circuito integrado de baixo custo;
  • Usa menos componentes, mais fácil de montar;
  • Mais flexível, por ser programável; como resultado, suporta vários modos de operação.

Contras:

  • Requer um programador de AVRs para subir o firmware.

Idéias para trabalhos futuros

  • Usar LEDs de cores diferentes para cada valor de bit. Não sei se isso tornaria a coisa mais ou menos confusa... ou se o resultado ficaria esteticamente agradável.
  • Usar uma MCU com mais pinos (um AT90S1200 ou ATtiny2313, quem sabe) dispensaria o oscilador e nos permitiria usar um cristal diretamente; poderíamos adicionar um sonorizador para transformá-lo em um despertador.
  • Como o Knuth muito bem colocou, há muitas variações de códigos de Gray e várias outras maneiras de contar em binário; implementar algumas delas pode ser interessante.

Comentários, Sugestões, etc.

Se você construir um dispositivo desses, eu gostaria de saber. Da mesma forma, se você tiver sugestões, críticas ou comentários, não hesite em me mandar um email:

Kiko > SistemasEmbutidos > RelogioDCB
Creative Commons License   The content of this site is made available under the terms of a Creative Commons License, except where otherwise noted.
  O conteúdo deste site está disponibilizado nos termos de uma Licença Creative Commons, exceto onde dito em contrário.