sexta-feira, 29 de agosto de 2014

Aferição de um relógio antigo utilizando Arduino

Como postagem inicial deste despretencioso blog, apresento um projeto para regular e aferir um antigo relógio analógico de pêndulo. Da marca brasileira DIMEP, ele é do modelo "500 dias", mas sem o calendário de dia do mês e da semana que havia em alguns outros que também levaram este nome. Encontrei uma referência indicando que o nome é relativo ao tempo de duração da bateria. Existe também uma variação "TAGUS 500 dias", o qual leva estampado em seu mostrador um pitoresco mapa mundi com o polo sul ao centro, utilizado para facilitar a verificação de diferença entre fusos horários.


Relógio DIMEP Tagus 500 dias
Relógio DIMEP 500 dias com o qual executamos o projeto
 O relógio apresentava problemas e passou por uma manutenção. Após o procedimento, desejava verificar com que precisão estava funcionando, e também regular pois o período do braço pode ser alterado através de uma peça rosqueável (rating nut) que fica na ponta do pêndulo. Durante uma semana, percebi que ele adiantou aproximadamente 10 minutos, entretanto qualquer alteração, demandaria mais um grande intervalo para perceber o resultado.

Minha primeira dúvida neste projeto, era sobre a confiabilidade do arduino para medir um intervalo de tempo em milisegundos. Escrevi um pequeno sketch que apenas contabilizava o tempo de um delay(1000) e imprimia o resultado na tela. Este método pode ser questionado pois tanto para gerar o delay quanto para fazer a medição estou utilizando a mesma função millis(), ou seja, o resultado deveria ser sempre o mesmo, certo? Eu também pensei que sim... Este teste pode ser feito apenas com a placa do arduino, sem utilizar nenhum componente ligado a ela. Abaixo o código utilizado para medir o tempo.


 unsigned long inicio,fim,duracao;   
 void setup()  
 {  
  Serial.begin(9600);  
 }   
 void loop()  
 {  
  inicio=millis();  
  delay(1000);  
  fim=millis();  
  duracao=fim-inicio;  
  Serial.println(duracao);  
 }  

O resultado para 30 segundos foi:

6 amostras com 999 ms
8 amostras com 1001 ms
16 amostras com 1000 ms
Média de 1000,066 ms

A conclusão é que para uma leitura individual, pode haver erro de um ms para mais ou para menos, mas na média o erro está abaixo do décimo de milésimo (talvez bem mais abaixo se considerarmos uma amostragem maior). Algum especialista no assunto consegue explicar esta flutuação nas leituras do delay()? 

O projeto foi realizado utilizando:

- 1 Arduino Mega 2560 Rev 3.
- 1 resistor de um megaohm (1MΩ).
- 1 sensor piezoelétrico
Esquema de fiação do arduino:


Esquema de fiação no fritzing

Utilizei uma fita adesiva para posicionar o sensor no final do curso do pêndulo, de maneira que houvesse apenas um toque muito leve (veja na figura abaixo).



Ao analisar os dados gerados pelo sensor (ver figura abaixo), o eixo X representa uma amostra a cada 2 ms, e o eixo Y a pressão sobre o sensor, observei que a contabilização do tempo deveria ser apenas entre os primeiros toques no sensor, e os seguintes já deveriam ser considerados como intervalo do pêndulo. Ao pressionar o sensor entre os dedos, você facilmente faz ele chegar até 1024, ou seja, o valor 15 apresentado no gráfico, é um toque muito leve.





Código para medição do intervalo:


 const int kSensor = A1; //pino em que esta conectado o sensor  
 const int threshold = 500; //limite para desconsiderar os valores, apos o primeiro toque  
 int sensorReading = 0;  
 int count = 0;   
 unsigned long start, finished, elapsed, avg, total;  
 void setup()  
 {  
  Serial.begin(9600);  
  total=0;  
 }  
 void loop()  
 {  
  sensorReading = analogRead(kSensor);  
  start = millis();  
  elapsed=start-finished;   
  if ((sensorReading != 0) and (elapsed >threshold))  
  {  
     count = count + 1;  
     start = millis();  
     elapsed=start-finished;      
     total = total + elapsed;  
     avg = total / count;  
     finished = millis();  
     Serial.print("Ultimo: ");   
     Serial.print(elapsed);  
     Serial.print(" Media: ");      
     Serial.print(avg);  
     Serial.print(" Ticks: ");      
     Serial.print(count);  
     Serial.println();  
  }  
 }  
Resultado:



De média 996 que era anteriormente consegui mudar para 999 ms.

Reconheço que a melhor maneira seria utilizar algum sensor com o qual não houvesse  toque, para evitar interferência do sistema de medição. 

Como sugestão para um projeto futuro , fica a sugestão para utilizar um LDR e um feixe de luz, pois não haveria influência no pêndulo.
O projeto não é pioneiro, encontrei um já executado aqui.


Para não perder a oportunidade de um trocadilho na conclusão, relógio que atrasa não adianta pra nada!

Um comentário: