Libreria R4SwRTC

E' un po di tempo che sto giocando con le nuove UNO R4 e, tra gli alcuni problemini che le affliggono, ce ne è uno piuttosto grosso ... la pessima precisione del RTC nativo del RA4M1.

Purtroppo, l'aver optato per NON avere un quarzo esterno per l'RTC ed essersi affidati al "Low-speed on-chip oscillator (LOCO)", provoca un errore che arriva anche ad alcuni secondi l'ora! La calibrazione di tale oscillatore non è affatto cosa semplice e, comunque, dalle prove che ho fatto, la frequenza è piuttosto variabile nel tempo (probabilmente anche in funzione della temperatura ambiente).

Per cercare di ovviare a questo problema, senza passare all'uso di un RTC esterno, magari basato su un DS3231 così da avere un'ottima precisione, ho provato a realizzare un software RTC utilizzando uno dei GPT timer di cui dispone il RA4M1.

Purtroppo, anche il clock principale di Arduino UNO R4 NON è quarzato, per cui, comunque, la precisione ottenibile NON è mai quella di un vero RTC esterno, in ogni caso, con un po' di prove e con la regolazione di un parametro (che ciascuno deve calibrare in funzione della propria scheda), sono riuscito ad arrivare ad una precisione del ± 1 secondo su 24 ore :slight_smile:

Ripeto, causa mancanza di un qualsiasi quarzo, ma solo con lo sfruttamento di oscillatori lberi, più di tanto non è possibile fare, comunque pur essendo sicuramente meno precisio di un vero RTC esterno è sicuramente di gran lunga più preciso del RTC integrato utilizzante l'oscillatore "LOCO".

Per chi è in posseso di una UNO R4 e vuole divertirsi ... QUESTO è il link su Github della libreria (aspetto un po di verifiche e di commenti prima di renderla ufficiale nel 'Gestore di librerie' dell'IDE).

E' molto semplice da utilizzare e ho allegato due esempi d'uso, uno per la MINIMA ed uno per la WIFI (... quest'ultimo molto più semplice da utilizzare per la calibrazione del parametro CNT_FREQ che si trova in testa al programma).

Se qualche volenteroso si prende la briga di provarla e di farmi sapere problemi/suggerimenti/opinioni, lo ringrazio anticipatamente. :hugs:

Guglielmo

P.S.: La libreria inclue automaticamente la <time.h> quindi, mentre la mia libreria si occupa solo di formati 'unixTime' e 'struct tm', nel .ino è possibile usare le funzioni della <time.h> per fare tutte le conversioni volute.

2 Likes

Infatti secondo me l'ha progettato uno spagnolo che oltre a pensare che i quarzi siano costosissimi (altrimenti non si spiega), stando al nome ha anche un certo senso dell'umorismo (o è il suo soprannnome)... :laughing:

Non ho ancora avuto la necessità di una R4 ma mi piacerebbe a breve giocarci, per cui chiedo: la libreria è sia per la Minima sia per la WiFi?

PS: per la WiFi però potrebbe non esserci problema visto che per aggiornare l'ora se c'è a disposizione una connessione di rete potrebbe bastare sfruttare un server NTP remoto, come faccio con le ESP...

Si, è indipendente dalla scheda che si usa, purché sia Arduino UNO R4.

... vero, ma il RTC nativo sbaglia così tanto (parliamo di svariati secondi ogni ora) che è necessario aggiornare in continuazione. Con laR4SwRTC puoi fare un'interrogazione all'NTP al giorno :wink:

Guglielmo

1 Like

Giusto per completezza ... log di 24 ore, su un Arduino UNO R4 WiFi, con controllo (via NTP) ogni 30 minuti (dati però da millis() e quindi soggetti all'imprecisione di quest'ultimo):

Program started, try to connect to Wifi ...
Connected to WiFi, local IP address is: 192.168.1.191
Initial time from NTP:1707908446

Time from NTP:1707910247 - Time from Timer:1707910247
Delta time after 0 hour(s) and 30 minutes(s) 0 sec.
Wed Feb 14 11:30:47 2024

Time from NTP:1707912049 - Time from Timer:1707912049
Delta time after 1 hour(s) and 0 minutes(s) 0 sec.
Wed Feb 14 12:00:49 2024

Time from NTP:1707913850 - Time from Timer:1707913850
Delta time after 1 hour(s) and 30 minutes(s) 0 sec.
Wed Feb 14 12:30:50 2024

Time from NTP:1707915652 - Time from Timer:1707915652
Delta time after 2 hour(s) and 0 minutes(s) 0 sec.
Wed Feb 14 13:00:52 2024

Time from NTP:1707917453 - Time from Timer:1707917453
Delta time after 2 hour(s) and 30 minutes(s) 0 sec.
Wed Feb 14 13:30:53 2024

Time from NTP:1707919255 - Time from Timer:1707919255
Delta time after 3 hour(s) and 0 minutes(s) 0 sec.
Wed Feb 14 14:00:55 2024

Time from NTP:1707921057 - Time from Timer:1707921056
Delta time after 3 hour(s) and 30 minutes(s) -1 sec.
Wed Feb 14 14:30:56 2024

Time from NTP:1707922858 - Time from Timer:1707922858
Delta time after 4 hour(s) and 0 minutes(s) 0 sec.
Wed Feb 14 15:00:58 2024

Time from NTP:1707924660 - Time from Timer:1707924659
Delta time after 4 hour(s) and 30 minutes(s) -1 sec.
Wed Feb 14 15:30:59 2024

Time from NTP:1707926461 - Time from Timer:1707926461
Delta time after 5 hour(s) and 0 minutes(s) 0 sec.
Wed Feb 14 16:01:01 2024

Time from NTP:1707928263 - Time from Timer:1707928262
Delta time after 5 hour(s) and 30 minutes(s) -1 sec.
Wed Feb 14 16:31:02 2024

Time from NTP:1707930064 - Time from Timer:1707930064
Delta time after 6 hour(s) and 0 minutes(s) 0 sec.
Wed Feb 14 17:01:04 2024

Time from NTP:1707931865 - Time from Timer:1707931865
Delta time after 6 hour(s) and 30 minutes(s) 0 sec.
Wed Feb 14 17:31:05 2024

Time from NTP:1707933667 - Time from Timer:1707933667
Delta time after 7 hour(s) and 0 minutes(s) 0 sec.
Wed Feb 14 18:01:07 2024

Time from NTP:1707935468 - Time from Timer:1707935468
Delta time after 7 hour(s) and 30 minutes(s) 0 sec.
Wed Feb 14 18:31:08 2024

Time from NTP:1707937270 - Time from Timer:1707937270
Delta time after 8 hour(s) and 0 minutes(s) 0 sec.
Wed Feb 14 19:01:10 2024

Time from NTP:1707939071 - Time from Timer:1707939071
Delta time after 8 hour(s) and 30 minutes(s) 0 sec.
Wed Feb 14 19:31:11 2024

Time from NTP:1707940873 - Time from Timer:1707940873
Delta time after 9 hour(s) and 0 minutes(s) 0 sec.
Wed Feb 14 20:01:13 2024

Time from NTP:1707942674 - Time from Timer:1707942674
Delta time after 9 hour(s) and 30 minutes(s) 0 sec.
Wed Feb 14 20:31:14 2024

Time from NTP:1707944476 - Time from Timer:1707944476
Delta time after 10 hour(s) and 0 minutes(s) 0 sec.
Wed Feb 14 21:01:16 2024

Time from NTP:1707946277 - Time from Timer:1707946277
Delta time after 10 hour(s) and 30 minutes(s) 0 sec.
Wed Feb 14 21:31:17 2024

Time from NTP:1707948079 - Time from Timer:1707948079
Delta time after 11 hour(s) and 0 minutes(s) 0 sec.
Wed Feb 14 22:01:19 2024

Time from NTP:1707949881 - Time from Timer:1707949880
Delta time after 11 hour(s) and 30 minutes(s) -1 sec.
Wed Feb 14 22:31:20 2024

Time from NTP:1707951682 - Time from Timer:1707951682
Delta time after 12 hour(s) and 0 minutes(s) 0 sec.
Wed Feb 14 23:01:22 2024

Time from NTP:1707953484 - Time from Timer:1707953483
Delta time after 12 hour(s) and 30 minutes(s) -1 sec.
Wed Feb 14 23:31:23 2024

Time from NTP:1707955285 - Time from Timer:1707955285
Delta time after 13 hour(s) and 0 minutes(s) 0 sec.
Thu Feb 15 00:01:25 2024

Time from NTP:1707957087 - Time from Timer:1707957086
Delta time after 13 hour(s) and 30 minutes(s) -1 sec.
Thu Feb 15 00:31:26 2024

Time from NTP:1707958888 - Time from Timer:1707958888
Delta time after 14 hour(s) and 0 minutes(s) 0 sec.
Thu Feb 15 01:01:28 2024

Time from NTP:1707960690 - Time from Timer:1707960689
Delta time after 14 hour(s) and 30 minutes(s) -1 sec.
Thu Feb 15 01:31:29 2024

Time from NTP:1707962491 - Time from Timer:1707962491
Delta time after 15 hour(s) and 0 minutes(s) 0 sec.
Thu Feb 15 02:01:31 2024

Time from NTP:1707964293 - Time from Timer:1707964292
Delta time after 15 hour(s) and 30 minutes(s) -1 sec.
Thu Feb 15 02:31:32 2024

Time from NTP:1707966094 - Time from Timer:1707966094
Delta time after 16 hour(s) and 0 minutes(s) 0 sec.
Thu Feb 15 03:01:34 2024

Time from NTP:1707967895 - Time from Timer:1707967895
Delta time after 16 hour(s) and 30 minutes(s) 0 sec.
Thu Feb 15 03:31:35 2024

Time from NTP:1707969697 - Time from Timer:1707969697
Delta time after 17 hour(s) and 0 minutes(s) 0 sec.
Thu Feb 15 04:01:37 2024

Time from NTP:1707971498 - Time from Timer:1707971498
Delta time after 17 hour(s) and 30 minutes(s) 0 sec.
Thu Feb 15 04:31:38 2024

Time from NTP:1707973299 - Time from Timer:1707973300
Delta time after 18 hour(s) and 0 minutes(s) 1 sec.
Thu Feb 15 05:01:40 2024

Time from NTP:1707975101 - Time from Timer:1707975101
Delta time after 18 hour(s) and 30 minutes(s) 0 sec.
Thu Feb 15 05:31:41 2024

Time from NTP:1707976902 - Time from Timer:1707976903
Delta time after 19 hour(s) and 0 minutes(s) 1 sec.
Thu Feb 15 06:01:43 2024

Time from NTP:1707978704 - Time from Timer:1707978704
Delta time after 19 hour(s) and 30 minutes(s) 0 sec.
Thu Feb 15 06:31:44 2024

Time from NTP:1707980505 - Time from Timer:1707980506
Delta time after 20 hour(s) and 0 minutes(s) 1 sec.
Thu Feb 15 07:01:46 2024

Time from NTP:1707982307 - Time from Timer:1707982308
Delta time after 20 hour(s) and 30 minutes(s) 1 sec.
Thu Feb 15 07:31:48 2024

Time from NTP:1707984108 - Time from Timer:1707984109
Delta time after 21 hour(s) and 0 minutes(s) 1 sec.
Thu Feb 15 08:01:49 2024

Time from NTP:1707985910 - Time from Timer:1707985910
Delta time after 21 hour(s) and 30 minutes(s) 0 sec.
Thu Feb 15 08:31:50 2024

Time from NTP:1707987711 - Time from Timer:1707987712
Delta time after 22 hour(s) and 0 minutes(s) 1 sec.
Thu Feb 15 09:01:52 2024

Time from NTP:1707989513 - Time from Timer:1707989514
Delta time after 22 hour(s) and 30 minutes(s) 1 sec.
Thu Feb 15 09:31:54 2024

Time from NTP:1707991314 - Time from Timer:1707991315
Delta time after 23 hour(s) and 0 minutes(s) 1 sec.
Thu Feb 15 10:01:55 2024

Time from NTP:1707993116 - Time from Timer:1707993117
Delta time after 23 hour(s) and 30 minutes(s) 1 sec.
Thu Feb 15 10:31:57 2024

Time from NTP:1707994917 - Time from Timer:1707994918
Delta time after 24 hour(s) and 0 minutes(s) 1 sec.
Thu Feb 15 11:01:58 2024

... le variazione in + ed in - credo siano dovute alla 'temperatura ambiente' ... la scheda stava vicino ad una finestra leggermente aperta e quindi risentiva del variare della tempertaura in funzione dell'ora.

Guglielmo

Ho aggiornato il software su Github ... ho aggiunto la possibilità (normalmente non attivata nel .h) di avere il timer clock sul pin D7 di Arduino UNO R4.

In questo modo, volendo, con l'ultilizzo di un oscilloscopio o di un buon frequenzimetro digitale, si può trovare il giusto valore da mettere nel metodo begin() per avere la migliore precisione.

Guglielmo

Messo su sulla mia R4WIFi. stasera verifico il timer.
Ho lasciato il valore dell'esempio. Già dopo mezz'ora è -1 sec

Time from NTP:1708082113 - Time from Timer:1708082112
Delta time after 0 hour(s) and 30 minutes(s) -1 sec.
Fri Feb 16 11:15:12 2024  (UTC)

Come ho detto, occorre sperimentalmente trovare il valore giusto (sulla mia WiFi 100.076 Hz) dopo di che è "accettabilmente" utilizzabile :wink:

All'inizio io sono partito con il valore di defaul di 100.00 Hz ed ho verificato di quanti secondi è stato lo spostamento dopo 24 ore esatte (su uno ha la WiFi è facile usando NTP, altrimenti a mano).
Detto S tale spostamento (positivo se il SwRTC avanza, negativo se il SwRTC ritarda) fare:

  • X = S / 86400 (spostamento per secondo +/-)
  • X = X + 1 (verrà > 1 se avanza o < 1 se ritarda)
  • Freq_timer / X = nuova frequenza da usare per il Timer (arrotondare alle tre cifre decimali).

Con un po' di tentativi si riesce ad arrivare ad uno scostamento massimo di circa 1 secondo sulle 24 ore. :wink:

Volendo, ho anche aggiunto (opzionale) l'uscita del clock sul pin D7, quindi, con l'opportuna strumentazione, si può usare anche quel segnale per la calibrazione (si devono ottenere 50 Hz esatti ... 20 ms HIGH e 20 ms LOW).

Guglielmo

Dopo mezz'ora con 100.076 già -1 sec.
Mi pare di capire, meglio farlo ripartire con 100.000, poi fare la verifica dopo 24h e applicare i calcoli del tuo post#7

Hai visto il mio log al post #4? ... sono valori che possono cambiare nel tempo ... se vuoi lascialo andare 4/5 ore e vedi ... se aumenta allora il valore non va bene, se oscilla allora è ok. Altrimenti, parti con 100, lasci girare 24 ore ed hai già un buon riscontro su cosa fare :wink:

Guglielmo

@nid69ita: nella cartella src della libreria ti segnalo un paio di cosette simpatiche che possono essere utili anche per altre applicazioni ...

  • il file "atomic.h" che è indipendente dalla libreria e che può essere usato ogni volta si vogliano dichiare "atomiche" delle righe di codice su ARM R3 e quindi anche sulla UNO R4 che monta un ARM R4.

  • nei sorgenti delle libreria il codice per l'accesso diretto ad un pin della MCU senza passare da digitalWrite(), ma accedento con i registri di I/O.

Buon divertimento :wink:

Guglielmo

1 Like

Dopo 6 ore

Program started, try to connect to Wifi ...
Connected to WiFi, local IP address is: 192.168.1.27
Initial time from NTP:1708082286 

Time from NTP:1708084088 - Time from Timer:1708084086
Delta time after 0 hour(s) and 30 minutes(s) -2 sec.
Fri Feb 16 11:48:06 2024  (UTC)

Time from NTP:1708085891 - Time from Timer:1708085886
Delta time after 1 hour(s) and 0 minutes(s) -5 sec.
Fri Feb 16 12:18:06 2024  (UTC)

Time from NTP:1708087693 - Time from Timer:1708087686
Delta time after 1 hour(s) and 30 minutes(s) -7 sec.
Fri Feb 16 12:48:06 2024  (UTC)

Time from NTP:1708089495 - Time from Timer:1708089486
Delta time after 2 hour(s) and 0 minutes(s) -9 sec.
Fri Feb 16 13:18:06 2024  (UTC)

Time from NTP:1708091297 - Time from Timer:1708091286
Delta time after 2 hour(s) and 30 minutes(s) -11 sec.
Fri Feb 16 13:48:06 2024  (UTC)

Time from NTP:1708093099 - Time from Timer:1708093086
Delta time after 3 hour(s) and 0 minutes(s) -13 sec.
Fri Feb 16 14:18:06 2024  (UTC)

Time from NTP:1708094901 - Time from Timer:1708094886
Delta time after 3 hour(s) and 30 minutes(s) -15 sec.
Fri Feb 16 14:48:06 2024  (UTC)

Time from NTP:1708096703 - Time from Timer:1708096686
Delta time after 4 hour(s) and 0 minutes(s) -17 sec.
Fri Feb 16 15:18:06 2024  (UTC)

Time from NTP:1708098505 - Time from Timer:1708098486
Delta time after 4 hour(s) and 30 minutes(s) -19 sec.
Fri Feb 16 15:48:06 2024  (UTC)

Time from NTP:1708100307 - Time from Timer:1708100286
Delta time after 5 hour(s) and 0 minutes(s) -21 sec.
Fri Feb 16 16:18:06 2024  (UTC)

Time from NTP:1708102109 - Time from Timer:1708102087
Delta time after 5 hour(s) and 30 minutes(s) -22 sec.
Fri Feb 16 16:48:07 2024  (UTC)

Time from NTP:1708103911 - Time from Timer:1708103887
Delta time after 6 hour(s) and 0 minutes(s) -24 sec.
Fri Feb 16 17:18:07 2024  (UTC)

Prova con 100.188 e fammi sapere ... :wink:

Guglielmo

Scusa dopo 6 ore ma ho usato 100.00 e non il tuo 100.076 :grimacing:

AARRRGGG ... allora prova con 100.110 e vedi quanto cambia l'errore :wink:

Guglielmo

P.S.: C.V.D. il timer a 100 Hz NON genera 100 Hz, ma leggermente di meno ... ringraziamo il fatto che hanno risparmiato sui quarzi :rage:

1 Like

Perchè l'occasione fa l'uomo... ragno :laughing: :rofl:

Con 100.110:

Program started, try to connect to Wifi ...
Connected to WiFi, local IP address is: 192.168.1.34
Initial time from NTP:1708105196

Time from NTP:1708106997 - Time from Timer:1708106998
Delta time after 0 hour(s) and 30 minutes(s) 1 sec.
Fri Feb 16 18:09:58 2024  (UTC)

Time from NTP:1708108799 - Time from Timer:1708108800
Delta time after 1 hour(s) and 0 minutes(s) 1 sec.
Fri Feb 16 18:40:00 2024  (UTC)

Time from NTP:1708110601 - Time from Timer:1708110602
Delta time after 1 hour(s) and 30 minutes(s) 1 sec.
Fri Feb 16 19:10:02 2024  (UTC)

Time from NTP:1708112403 - Time from Timer:1708112404
Delta time after 2 hour(s) and 0 minutes(s) 1 sec.
Fri Feb 16 19:40:04 2024  (UTC)

Time from NTP:1708114205 - Time from Timer:1708114206
Delta time after 2 hour(s) and 30 minutes(s) 1 sec.
Fri Feb 16 20:10:06 2024  (UTC)

1 Like

Pubblicata nel "Library Manager" ed installabile direttamente dall'IDE :wink:

Guglielmo

2 Likes

Se vuoi, ora puoi provare a giocare con i decimillesimi , un po' per volta ± 0.005 e vedere come varia ... ma, per fare una cosa fatta bene, devi fare un controllo su 24 ore ed aggiustare dopo le 24 ore. :wink:

Guglielmo

Ciao,
avrei una domanda..ma quale sorgente di clock hai usato per il GPT PCLKD?
Se non ho capito male dal manuale RA4M1 si può usare solo HOCO la stessa che si usa per millis().

Si, certo, usa il clock di base ...
... ma la libreria è indipendente dal timer di millis e dai suoi interrupt ed usa un suo timer che richiama una call-back così da poter avere "una specie" di vero RTC che ha il tempo sempre aggiornato (ripeto, volutamente indipendentemente da millis, non certo più preciso ... vista come è fatta la scheda :roll_eyes:).

Ho oltretutto ho scelto una frequenza di aggiornamento abbastanza bassa (rispetto all'interrupt di millis), così da non togliere troppo tempo alla MCU ed impostabile con precisione da programma così da adattarsi, abbastanza facilmente, allo specifico hardware che l'utente ha.

E' una scelta ... tu segui la strada che vuoi ... :slight_smile:

Guglielmo

Grazie,
ho notato che l'oscillatore HOCO è un pò dipende nell'ordine di qualche secondo dalla tensione di alimentazione. La dipendenza con tutta probabilità è dovuta a come alimento la Arduino ovvero dalla porta USB-C (VUSB),che varia da alimentatore ad alimentatore, da PC a PC e dalla corrente assorbita perchè c'è un diodo (D3 in MINIMA)schottky che al variare della corrente varia la sua tensione di caduta. Ovviamente se si alimenta la scheda dal DC JACK il problema può essere mitigato... ha notato anche lei quanto citato?
Grazie per il lavoro sarei interessato nel capire come ha implementato il GPT nella libreria. Ho cercato di guardare i sorgenti ma qualche indizio in più forse mi schiarisce le idee.
Saluti