Go Down

Topic: Reloj Arduino sin RTC (Read 10502 times) previous topic - next topic

Manuel_Hidalgo

Si te sirve de ayuda, yo uso la siguiente rutina de base, y me funciona sin apenas variación a lo hora por NTP durante días. No obstante tiene el parámetro deriva que permitiría un ajuste más preciso, pero no he llegado a usarlo
Code: [Select]

struct tipoReloj
{ byte dia=1,mes=1,diaSem=0,hora=0,minuto=0,segundo=0;
 boolean verano=false;
 int anio=2000;
 int doy;            // dia del año 1..365/366
 int deriva=0;
 unsigned long microsReferencia=0UL;
} reloj;

/////////////////////////////////////////////////////////////
///////////////// Gestión del reloj /////////////////////////

void updateReloj()
{ long int microsUnSegundo=1000000L+reloj.deriva;
 if (micros()-reloj.microsReferencia>microsUnSegundo)
 { reloj.microsReferencia+=microsUnSegundo;
   if (++reloj.segundo >=60)
   { reloj.segundo=0;
     if (++reloj.minuto >=60)
     { reloj.minuto=0;
       if (++reloj.hora >=24)
       { reloj.hora=0;
         reloj.diaSem=(++reloj.diaSem)%7;
       }
     }
   }
 }
}

void setReloj(char *car)
{

...
 reloj.microsReferencia=micros();
...

}


Neros

Si te sirve de ayuda, yo uso la siguiente rutina de base, y me funciona sin apenas variación a lo hora por NTP durante días. No obstante tiene el parámetro deriva que permitiría un ajuste más preciso, pero no he llegado a usarlo
Code: [Select]

struct tipoReloj
{ byte dia=1,mes=1,diaSem=0,hora=0,minuto=0,segundo=0;
 boolean verano=false;
 int anio=2000;
 int doy;            // dia del año 1..365/366
 int deriva=0;
 unsigned long microsReferencia=0UL;
} reloj;

/////////////////////////////////////////////////////////////
///////////////// Gestión del reloj /////////////////////////

void updateReloj()
{ long int microsUnSegundo=1000000L+reloj.deriva;
 if (micros()-reloj.microsReferencia>microsUnSegundo)
 { reloj.microsReferencia+=microsUnSegundo;
   if (++reloj.segundo >=60)
   { reloj.segundo=0;
     if (++reloj.minuto >=60)
     { reloj.minuto=0;
       if (++reloj.hora >=24)
       { reloj.hora=0;
         reloj.diaSem=(++reloj.diaSem)%7;
       }
     }
   }
 }
}

void setReloj(char *car)
{

...
 reloj.microsReferencia=micros();
...

}


Hola! Muchas gracias por tu aportación. Tengo que estudiarme tu propuesta para entenderla, ya que soy muy novato en esto de Arduino, y, en general, programación. Además estoy con mil cosas a al vez (Master, trabajo, calses particulares...) y no puedo dedicarle a este hobby tanto tiempo como me gustaría :/. Cuando consiga entenderla e implementarla te comento :)

Neros

Bueno, finalmente he conseguido no notar diferencia entre la hora marcada por el casio y la marcada por le arduino en 24 horas... con lo que me siento suficientemente satisfecho. Lo seguire dejando correr a ver a partir de cauntos dias se empieza a notar (si es que se nota) la diferencia.

El ajuste que he hecho es el siguiente:
Code: [Select]
if ((micros() - contador) >= 1001401) { //hago que cada segundo sea un milisegundo más largo a ver si compenso el error
    contador += 1001401;
    segundos++;
    estado_punto^=1; //cambiar cada segundo el punto de ON a OFF
  }



Como veis esto supone que los segundos del arduino son aproximadamente un 0.14% más cortos de lo que deberian... no se hasta que punto es normal esto pero bueno... ahi queda, ya os dire en el largo plazo como se sigue portando.

Por ahora a seguir aumentando las funciones... lo siguiente la alarma :)

noter

Bien traído a colación el uso de micros, en lugar de millis. ¿Has llegado a tanta precisión? Lo digo por el microsegundo "suelto" (1401). Si es así y no hay muchas variaciones con la temperatura, podrías conseguir un reloj bastante preciso, aunque a buen seguro que habría que calibrarlo para cada arduino en que se instale.

Alfaville

Si cada segundo es 1.4 mseg mas largo en una hora tendremos 3600*1.4/1000 = 5.04 segundos de error
¿ Tan impreciso es el clock de nuestro Arduino ?
¿ Donde está realmente el problema ?

surbyte

En el Casio. Partamos de un reloj con un crystal de 32Khz que eL supone preciso.

Un casio digital tiene 5 segundos al mes según este link 
Acá una lista mejor link

Quote
Boctok Командирские 921288: +14 segundos/día (-20/+60 segundos/día).
Casio AL-180: -6 segundos/mes (+/- 30 segundos/mes).
Casio DB-E30D: +25 segundos/mes (+/- 30 segundos/mes).
Casio F-91W: +9 segundos/mes (+/- 30 segundos/mes).
Casio F-91W (falso): -328 segundos/mes (+/- 30 segundos/mes).
Casio GW-6900: +8 segundos/mes (+/- 15 segundos/mes).
Casio GW-M5610: +6 segundos/mes (+/- 15 segundos/mes).
Casio HDD-S100: +9 segundos/mes (+/- 30 segundos/mes).
Casio MTG-930: +7 segundos/mes (+/- 15 segundos/mes).
Casio MTG-M900: +7 segundos/mes (+/- 15 segundos/mes).
Casio W-210: +16 segundos/mes (+/- 20 segundos/mes).
Casio W-S210HD: +12 segundos/mes (+/- 30 segundos/mes).
Casio W-59: +8 segundos/mes (+/- 30 segundos/mes).
Casio W-756D: +17 segundos/mes (+/- 30 segundos/mes).

Neros

Os respondo por orden:

noter:
Primero use millis, y vi que si ponia 1001 ms adelantaba y si ponia 1002 atrasaba, por lo que vi la necesidad de usar micros.
Luego medi el adelanto en 24 horas y calculé el factor de corrección necesario si suponía el error constante. Mi resultado fue que deberia usar 100400.65 us.... sé que teniendo en cuenta que he medido yo el adelanto "a ojo" y mi medida queda discretizada de segundo en segundo... esos decimales son esos como podrían ser cualquier otros... si hubiera medido el adelanto en microsegundos con precision si tendría mas sentido usar esos decimales. Aún así, sigue existiendo la posibilidad de que si vaya bien ese microsegundo extra y total... por probar...
Efectivamente si cambio de arduino o si saco el reloj a la calle probablemente el ajuste no sirva de nada...

Alfaville:
A mi también me sorprende la verdad.

Surbyte:
Está claro que el casio no es un reloj atómico, pero para calibrar un aparato de medida solo hay que utilizar otro aparato de medida que comparado con el primero se pueda considerar "ideal" o "perfecto". Quería poder tener un reloj utilizable... Un reloj de una precisión de 5 segundos o incluso 30 al mes se puede considerar ideal frente a un reloj que adelanta o atrasa 2 segundos POR HORA como sucedia al principio. El casio nunca ha mostrado un desvio que yo pueda apreciar frente al reloj del movil o del ordenador, si consigo que este reloj tenga el mismo comportamiento que el resto de relojes que uso en mi día a día me doy por satisfecho, no pretendo conseguir un instrumento de laboratorio ni un cronometro con precisión de microsegundos...
Esta claro que no puedo saber si el desvio es de 2,0000000 segundos o de 2,000001 comparando con un casio, pero desde luego puedo afirmar con total seguridad sin lugar a error alguno que es de entre 1.5 y 2.5 segundos a la hora. Y eso sigue siendo un error sorprendente, que es en lo que creo que deberíamos centrarnos.


surbyte

Bueno entonces tu tema esta SOLUCIONADO, asi que agrégale esta etiqueta al título porque lo resolviste no?

Neros

¿Entonces hemos de aceptar que el arduino no da más de si y achacárselo todo a la imprecisión del cristal? ¿Lo mejor que se puede hacer es recurrir a un módulo RTC externo o corregir de forma chapuzera la duración de los segundos?

noter

#24
Jan 25, 2017, 05:16 pm Last Edit: Jan 25, 2017, 05:21 pm by noter
Si buscas por el foro, verás que no cualquier RTC te asegura una precisión muy buena. Había algún modelo que daba unos errores similares. En resumen, para una buena precisión necesitas un BUEN RTC, o en su defecto un buen cristal (bien temporizando al propio arduino, o enviando impulsos a un counter de arduino).
Sería interesante probar algún esquema con un cristal de reloj que envíe los impulsos a una entrada de counter del arduino, y prescalar y contar los impulsos, para ver qué precisión se lograría. No creo que suponga mucho ahorro respecto a un RTC, pero como experiencia puede estar bien.
Y si quieres asegurar alta precisión, deberás tirar de sincronización casi obligatoriamente.

Alfaville

Al final habrá que plantearse hacer pruebas con esto RTC con Arduino, pero da pereza, la verdad.

Neros

Puff, no me siento con la capacidad, la habilidad ni el entendimiento necesarios para realizar los experimentos que proponeis...  Seguiré dándole vueltas pero probablmente no pasa mucho tiempo hasta que pase a la parte de configurar la alarma (ajustarla y activarla con pulsadores y elegir como sonará y como emitir ese sonido y esas cosas que me tengo que pensar como haré y de seguro me darán dudas que preguntaré ;))

Gracias a todos por vuestras aportaciones!

Neros

#27
Jan 27, 2017, 11:00 pm Last Edit: Jan 27, 2017, 11:50 pm by Neros
Una pregunta, el pin A6 o A7 tiene algo de especial en arduino nano? Los estoy intentando usar como entrada digital y siempre me lee cero...

Edito y concreto aún más mi pregunta, teneis algún diagrama de conexion del atmel mega 328p que lleva el nano? para saber que pata esta conectada a que pin?

Vuelvo a editar, he encontrado esto:



Parece indicar que no puedo usar esos dos pines como entradas digitales :( es asi?

Alfaville

Hola Neros.

Efectivamente solo son entradas analogicas (conversor ADC).

A6 es el pin 20, y A7 es el 21 en notacion Arduino.

Neros


Go Up