terça-feira, dezembro 30, 2014

Um Relógio Muito Louco - Remix e Final

Este é um daqueles projetos que eu encostei devido a pequenos problemas. Finalmente, mais de quatro anos depois, retomei e, após algumas mudanças radicais, concluí.

Estou melhorando no acabamento dos meus projetos!

Como relatei aqui, aqui e aqui, este projeto consiste em comandar com um microcontrolador um servomotor, para simular um medidor analógico que indica a hora atual.

O projeto original usava um microcontrolador PIC (16F688 / 16F676) e um "servo de parabólica". Após resolver os problemas (tão elementares que me recuso a detalhar), comecei a estudar melhor como seria o controle do servo. Neste ponto surgiram algumas limitações dos PICs escolhidos. Como estes modelos não tem PWM por hardware, os pulsos de  controle do servo tem que ser gerados pela interrupção de timer. Apesar de usar um cristal de 20MHz, o clock do timer é, no máximo, um quarto disto. Leve em conta o overhead de tratamento da interrupção e o resultado é que não dá para controlar o servo em passos pequenos.

Por outro lado, o livro AVR Programming (que eu li recentemente) tem um exemplo de controle de servo, usando o clock interno de 1MHz e o timer/PWM de 16 bits do ATmega168, onde o pulso é controlado pelo hardware em passos de 1 microsegundo (melhor que o controle interno do servo).

Por este motivo, decidi trocar o PIC por um ATtiny44 (outra vantagem do AVR é que mesmo os modelos mais simples possuem vários recursos dos modelos mais sofisticados). Aproveitando o "ar de mudança", troquei também o servo de parabólica por um servo mais compacto. Mantive a caixa e o design básico (inclusive aproveitando a caixa já toda furada), porém precisei mudar o mostrador (pois o servo se desloca menos que 180 graus) e resolvi mover o botão para a parte traseira. Acrescentando dois LEDs azuis para iluminar o mostrador, o circuito ficou assim:


A montagem, usando uma placa padrão não foi complicada:


A operação segue a ideia original:
  • Normalmente o servo indica a hora atual, com um LED indicando AM ou PM.
  • Pressionando os dois botões juntos, entra-se no modo de ajuste
    • A hora atual para de ser incrementada e é forçado zero para os minutos e segundos
    • A cada pressão do botão de hora, passa para a hora seguinte
    • A cada pressão do botão de minuto, passa para o minuto seguinte
    • Pressionado os dois botões juntos, volta ao modo normal
Ligando o servo a um Arduino determinei as larguras de pulso para os dois extremos e divido esta faixa em 400 passos. Cada passo do servo corresponde a 12*60*60*10/400 =  108 segundos (um pouco menos de dois minutos). As larguras de pulso foram determinadas ligando o servo em um Arduino e programando "na marra" o Timer1. Tive um pouco de problema com a falta de linearidade no servo, particularmente no trecho final.

O software pode ser baixado dos arquivos do blog (ver acima à direita), está em RelogioAVR.zip.

Sugestão para quem for montar algo parecido: aproveitar um dos pinos livres do ATtiny para fazer algum barulho a cada hora.

Nenhum comentário: