Desde o inicio que o voltímetro das horas me chateava um pouco...

A sua não linearidade (barato... :) ) aliada ao meu método tosco de fazer a escala, fez com que o pwm para as horas não fosse calculado com um simples y=mx+b.
Farto disso resolvi fazer uma abordagem mais inteligente.
Acertei os valores de pwm para as 12 horas, de forma a coincidir exactamente o ponteiro com o risco da escala.

Guardei esses valores no vector "horas[posição vector]".
A única certeza após isto é que cada "salto" teria de ser dividido em 60 minutos.
O cálculo para obter o pwm certo para aquela hora e minuto, é dado por:
H - horas lidas no RTC;
M - minutos lidos no RTC;
unsigned int horas[13] = {0,70,160,245,330,415,495,590,680,780,870,970,1024};
pwm = horas[horas_1] - horas[horas_1 -1];
pwm = (pwm * minutos_1)/60;
pwm += horas[horas_1 -1];
Desta forma dou por resolvido o problema com o voltimetro das horas. Já está a funcionar à algumas horas e até ao momento está perfeito.

Já está completa mais uma etapa do relógio.
Começa a ganhar forma finalmente.
Usei o DraftSight para fazer o desenho da caixa. O material usado foi MDF de 3mm de espessura.
As dimensões são cerca de 120x65x55 (mm).

Este é o aspecto final com os voltimetros já montados no painel.

Durou pouco tempo, infelizmente...
Vamos esperar por Agosto de 2015!

Ler artigo em:


Chegado a este ponto, o relógio está praticamente concluído.
No video podem ver já o acerto das horas e a colocação em funcionamento dos voltímetros através dos 2 módulos de PWM do MCU.
No video também é visível a resposta a cada segundo passado do circuito para o computador com as horas lidas a partir do RTC (Real Time Clock).
Os ponteiros não tremem absolutamente nada, por isso o filtro de 1ª ordem a 5Hz (seguido de um buffer de corrente) corta mais do que bem a frequência de PWM que ronda os 15KHz.

Próxima etapa: colocar tudo dentro de uma caixa :D

PS: O video não tem som.

Uma breve actualização deste projecto.
A vermelho podem ver a PCB com o PIC16F1509, o conjunto de 2 ampops LM358 e o regulador de tensão 7805. Pode-se ainda ver o módulo com o RTC e o suporte para a pilha.
Todos os outros componentes passivos estão soldados por baixo (todos em SMD).

Na foto em baixo já se podem ver os voltímetros, com o novo fundo com escala, ligados à board de controlo.
Os voltimetros foram também alterados para terem iluminação na parte inferior, com 2 leds em cada um.

O tempo não é muito , mas aos poucos vai ficando feito :)

O módulo RTC que comprei já tem o suporte para uma pilha, o que é óptimo! Caso falhe a alimentação do circuito, tudo vai abaixo excepto a temporização do DS1302.
No entanto tem de haver uma simples possibilidade de se poder actualizar as horas sem que o programa fique bloqueado cada vez que a energia falhe.
Para resolver essa questão, implementei o seguinte: o programa inicia e via serial (com um baudrate de 19200) envia uma mensagem a questionar se é pretendida alguma configuração. São activadas então 2 interrupções, uma pelo Timer0 e outra pela chegada de uma caracter à USART.
Numa situação comum de falha de energia e regresso, o Timer0 irá contar 10s e o programa avançará sem que se passe pelo processo de configuração.

Detalhe das 3 possibilidades de iniciação:
* Por overflow do Timer0: na verdade o overflow deste timer irá ocorrer 610 vezes (correspondente a cerca de 10s) antes de uma flag ser colocada a 1 dentro do ISR. Conclui-se com isso que houve uma falha de energia e que ninguém quer actualizar horas.
* Receber um caracter diferente de "S" ou de "s": neste caso é assumido que a pessoa tem o terminal ligado mas simplesmente não pretende fazer qualquer configuração no relógio. A flag é colocada com o valor 2 e no main() segue um rumo semelhante ao 1º caso.

Receber o caracter "S" ou "s": neste caso entende-se que a pessoa deseja configurar o relógio, é colocada a flag com o valor 1 e no main() (ver figura em baixo) é chamada a função que dá inicio à configuração.
Na figura seguinte é visível um pedaço da função de configuração, neste caso apenas correspondente às horas.
Em resumo, são enviadas duas mensagens, uma dá conta da "Etapa de configuração" e a outra dá as instruções de introdução de horas.
Qualquer valor (de 2 números) que não esteja no intervalo 0<horas<13, é descartado e o ciclo repete novamente.
De um modo geral as partes principais da inicialização estão explicadas em cima.
Nas figuras seguintes irão surgir alguns exemplos do que já foi falado, em ambiente de simulação.

* 10s sem actividade na usart

* Introdução de caracter diferente de "S" ou "s"

* Introdução de caracter "S" ou "s"


"Não percam os próximos episódios, ..."

Se a ideia é mostrar horas e minutos, a escala de 5V dos voltímetros, não serve. Tive de adaptar de modo a ficar minimamente perceptível
Eu sei que muitos vão pensar que esta foi uma maneira estranha de fazer as coisas... bem mas foi assim que me lembre de fazer eheheh.
Em 1º lugar, desmontei o painel do voltimetro e tirei uma foto ao mesmo, tentando manter a perpendicular.

O passo seguinte foi, recortar o que realmente importava e num programa de edição de imagem (usei o gimp) fazer algumas limpezas e replicar alguns traços da escala antiga (0-5V).

O 3º e último passo, foi imprimir tudo à escala, num pedaço de papel autocolante e colar no painel, em cima da escala antiga.

No final, penso que nem ficou assim tão mal como pensava, sobretudo devido ao seu reduzido tamanho...
Infelizmente, vou ter que desfazer a escala e fazer tudo novamente para as horas e fazer pela primeira vez a escala dos minutos também. A escala da foto está errada, pois para coincidir com a escala do RTC (DS1302 pagina 9) deverei iniciar em 1h e terminar em 1h novamente, passado pelas 12h. No fundo, olhando para a escala em cima, onde está '0' deverá ficar '1' e onde está '12' ficará '1' ou então fica vazio.

Mais actualizações aproximam-se.
"Não percam os próximos episódios, ..."

Desta é de vez!
Depois do falhanço por completo com os servos, chegou o novo método! Tal como tinha dito, esta engenhoca não ia ficar por aqui e chegaram no outro dia 2 voltímetros analógicos, comprados no ebay.
Os dois ficaram-me em cerca de 6€.
Neste ponto já podem imaginar qual será a estratégia!
Com algum jeito, vou retirar o painel com a escala de 5V e vou substituir por uma escala de 0h a 12h e no outro por 0min a 60min.
Vou usar um PIC16F1509 (que entre muitas outras coisas, tem 4 módulos de PWM com resolução de 10bits, 2 dos quais não posso prescindir para este projecto) para estabelecer a comunicação com o RTC, tal como já tinha explicado AQUI, fazer a comunicação com o utilizador para acertar as horas (no futuro fazer mais coisas) e com 2 dos seus 4 módulos de PWM gerar uma tensão DC com passagem por 2 filtros passa-baixo de 1ª ordem. No final de tudo isso usarei um LM358 como buffer de corrente da saída dos filtros para os voltímetros.
Sobre esta ultima técnica de transformar PWM em tensão DC (variável de acordo com o duty cycle), podem consultar esta excelente Application Note da Microchip, que explica tudo de forma simples e clara.

Este foi um update rápido e geral para demonstrar que esta engenhoca não está parada...
Nos próximos dias irão aparecer mais actualizações sobre os avanços e o estado da mesma.

"Não percam os próximos episódios, ..."