RTC per applicazioni offline

Data e ora del nostro Raspberry vengono sincronizzate all’avvio del sistema operativo tramite server NTP. In tutte le altre applicazioni dove non avete un accesso ad internet la data e l’ora sono impostate di default ma non corrisponderanno a valori corretti. In questi casi una soluzione è utilizzare un rtc che in caso di spegnimento della scheda tenga sempre aggiornato il dato di data e tempo.

Vediamo come fare.

La prima cosa è procurarci un modulo rtc pronto all’uso oppure realizzarne uno partendo dai singoli componenti. Nel mio caso visto il costo e la praticità di installazione ho scelto un rtc già assemblato. Il modello si basa sul chip DS3231 è ha un pratico connettore che permette l’installazione connettendolo direttamente sui pin header del raspberry;

RTC Raspberry PI

DS3231 ad Alta precisione modulo di Memoria Orologio RTC per Arduino Raspberry Pi

Nell’immagine seguente potete osservare come deve essere installato il modulo rtc ds3231. 

Configurazione del dispositivo

La comunicazione tra il DS3231 e il Raspberry avviene utilizzando il bus I2C. Procediamo alla sua attivazione eseguendo il comando:

sudo raspi-config

Viene avviata la schermata del Raspberry PI Software Configuration Tool.  Portiamoci sulla voce Interface Options e premiamo invio, nella schermata successiva selezioniamo la voce I2C. Confermiamo rispondendo affermativamente e attendiamo l’attivazione del bus I2C:

Interfaccia Raspi-Config
Seleziona voce I2C
Seleziona voce I2C
Conferma attivazione bus i2c
Conferma attivazione bus i2c
Conferma attivazione bus i2c
Conferma attivazione bus i2c
Termina procedura guidata attivazione bus I2C
Termina procedura guidata attivazione bus I2C

Dopo aver terminato l’attivazione del bus, riavviamo il sistema operativo con il comando seguente:

sudo reboot

Dopo il riavviamo apriamo una nuova finestra terminale e utilizzando programma i2cdetect possiamo verificare che il modulo rtc e il bus I2C stiano funzionando:

i2cdetect -y 1

dovremmo avere una schermata simile alla seguente:

programma i2cdetect

il programma i2cdetect non fa altro che scansionare il bus I2C alla ricerca di dispositivi collegati. Nel nostro caso ha trovato un dispositivo all’indirizzo 0x68 che corrisponde all’unico dispositivo collegato al raspberry, ovvero il modulo DS3231.

Per sicurezza possiamo verificare sul datasheet dell’rtc l’indirizzo del dispositivo.

A questo punto possiamo caricare sul kernel linux il modulo rtc ds3232 (compatibile con il DS3231) eseguendo il seguente commando:

sudo modprobe rtc-ds3232

premiamo invio per eseguire il commando:

modprobe ds3231

a questo punto dobbiamo creare un nuovo device con indirizzo 0x68 ed inserirlo nel bus I2C. Per eseguire questa serie di commandi dobbiamo loggarci come utente root digitando il comando seguente:

su

inseriamo la password per l’utente root.

Nel caso in cui non si disponga di una pssword per l’utente root è necessario crearla digitando il comando:

sudo passwd root

Digitiamo una nuova password per l’utente root e confermiamo ripetendola nuovamente.

Ora che abbiamo i privilegi del superuser digitiamo il seguente commando:

echo ds3232 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

premiamo invio. Digitiamo il comando exit per ritornare all’utente pi:

add new device to bus i2c

Impostare data e ora dell’RTC

Dopo le precedenti istruzioni il sistema carica automaticamente i dati correnti di data e ora sull’RTC. Se questi dati corrispondono ai valori corretti non dobbiamo far altro che leggere i dati con il seguente comando:

sudo hwclock -r

in alternativa possiamo settare i valori come desideriamo eseguendo questo comando:

sudo hwclock --set --date "Fri Jan 1 15:00:00 CET 2021"

Tutte queste impostazioni non rimangono memorizzate al successivo riavvio del sistema operativo e quindi necessario inserire queste istruzioni su un file che viene lanciato durante le fasi di boot come ad esempio il file rc.local, quindi procediamo ad eseguire le seguenti istruzioni:

Modifichiamo il files modules per caricare sul kernel il modulo rtc-ds3232

sudo nano /etc/modules

inseriamo alla fine del file la seguente stringa:

rtc-ds3232

file modules

salviamo il file con la combinazione di tasti crtl+o  e usciamo con ctrl+x

Ora apriamo il file rc.local:

sudo /etc/rc.local

portiamoci con puntatore prima dell’istruzione exit 0 e aggiungiamo le seguenti istruzioni:

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

inseriamo subito dopo anche l’istruzione seguente:

sudo hwclock -s

in modo da sincronizzare la data e l’ora del sistema operativo con quella del modulo RTC.

file rc.local

disconnettiamo il Raspberry dalla rete cablata o WiFi, riavviamo e verifichiamo con il comando date che le impostazioni del sistema siano coerenti con quelle impostate precedentemente nell’rtc.