Horloge RTC DS1307

Le Raspberry Pi ne possède pas d'horloge RTC avec une pile ce qui provoque la désynchronisation de l'heure lorsqu'il est débranché ou arreté. Hors, sur des ordinateurs standards, ce matériel est embarqué sur la carte mère.

Pour contourner ce problème, lorsqu'il dispose d'une connexion réseau, un client ntp est lancé automatique pour ajuster l'heure. Une autre alternative est d'ajouter un module DS1307 : c'est une horloge matérielle avec une pile de sauvegarde qui se branche sur le port I2C.

Horloge RTC DS1307

Ce module est déjà pris en charge depuis bien longtemps par le noyau Linux, il suffit juste de charger les bons modules au démarrage et de lancer quelques commandes de synchronisation.

Pour commencer, éditer le fichier /etc/modules afin d'ajouter 3 modules à charger au boot :

/etc/modules
i2c-dev
i2c-bcm2708
rtc-ds1307

Puis, enrichir le fichier /boot/config.txt pour enrichir le “Device Tree Overlay” :

/boot/config.txt
[...]
dtoverlay=i2c-rtc,ds1307

Remarque

S'il y a déjà un ou plusieurs ligne(s) présente(s), il faut ajouter la nouvelle sans modifier les autres.

Redémarrer le Raspberry Pi et vérifier la bonne détection de la puce DS1307 via l'outil i2cdetect (installer le paquet i2c-tools si nécessaire) :

sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         

Ici, la présence des lettres 68 à la ligne 60, colonne 8 indique la bonne détection de la puce à l'adresse 0068.

Consulter les logs du noyau pour vérifier le bon chargement du module par le noyau :

sudo dmesg -T | grep 1307
[Sat Nov 17 17:43:30 2018] rtc-ds1307 1-0068: SET TIME!
[Sat Nov 17 17:43:30 2018] rtc-ds1307 1-0068: registered as rtc0

Lors du premier branchement, la puce n'est pas encore à l'heure et indique une date au 1er janvier 2000. Il faut d'abord mettre le Raspberry Pi à l'heure en le branchant sur le réseau par exemple puis l'écrire sur le DS1307.

Vérifier la date et mettre à l'heure si nécessaire via la commande date. Puis, écrire la date courante dans le module DS1307 à l'aide de hwclock :

sudo hwclock -w

Vérifier la bonne prise en compte :

sudo hwclock -r
2018-11-17 17:45:26.148564+0100

Désormais, l'horloge RTC est reglée et gère toute seule l'avancement du temps.

Pour que le Raspberry Pi lise l'heure sur ce module externe au démarrage, il faut appeler la commande hwclock en ajoutant la ligne suivante en fin de fichier /etc/rc.local avant le exit 0

/etc/rc.local
hwclock -s || true

Source :