Ajout d’un module RTC DS3231 au Raspberry Pi

Ce petit article traitera d’un sujet simple en théorie, mais qui s’est avéré “pas si simple” en pratique … raison pour laquelle, je rédige ces notes ; pour vous aider, comme pour garder trace pour moi 😉

Et spéciale dédicace à FabienT qui m’a poussé (sans le savoir) à écrire cet article qui était depuis un moment dans ma liste des “à faire”. Merci FabienT 😉

Dans ce tutoriel, je vais ajouter un module RTC ou module “horloge en temps réel” (RTC signifie Real Time Clock en alnglais) à mon Raspberry Pi.
Dans mon cas, c’est le module DS3231.
J’ai testé sur Raspberry Pi 3, Raspberry Pi 3B+ et Raspberry Pi 4.

Genèse : j’ai été confronté à ce besoin du fait que je souhaite utiliser mon Raspberry Pi 3 transformé en Borne à Selfies ou Photobooth ou cabine de type photomaton sans réseau mais que les photos restent nommées par date et heure avec données exif utilisables.

Afin de se placer dans des conditions favorables, comme toujours, un coup de mise à jour du système d’exploitation (je suis sous Raspbian 10) avec :
sudo apt update && sudo apt upgrade

Ensuite, il convient d’activer l’option I2C (désactivée par défaut) avec :
sudo raspi-config … ou simplement en allant dans les paramètres en graphique 🙂

Note : Si vous le faites avec raspi-config, c’est :
5 Interfacing Options –> P5 I2C –> Oui –> OK –> Finish

A ce stade, il faut redémarrer (genre, avec un sudo reboot pour frimer 🙂 )

Maintenant que le Raspberry Pi a redémarré, il faut exécuter 1 commande afin d’installer 2 paquets (packages) complémentaires. Tapez simplement :
sudo apt install python-smbus i2c-tools

Puis, pour vérifier si le module RTC est détecté (donc bien reconnu). Tapez :
sudo i2cdetect -y 1

Normalement, vous pouvez voir ceci s’afficher :

     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: -- -- -- -- -- -- -- --

Oui ? OK, on passe alors à la configuration (chargement du RTC au démarrage). Pour ouvrir le fichier de configuration, il faut saisir :
sudo nano /boot/config.txt

Tout en bas du fichier, on ajoute dtoverlay=i2c-rtc,ds3231

Note pour les débutants : pour enregistrer les modifications et fermer le fichier config.txt, il faut appuyer sur “Ctrl” + “X”, puis sur “o” puis sur “Entrée”.

Maintenant, vous devez redémarrer (sudo reboot en version rapide) …

… Puis vérifier que les pilotes sont opérationnels avec :
sudo i2cdetect -y 1

Normalement, vous pouvez voir ceci s’afficher :

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

Bien. Maintenant, il faut supprimer le réglage horloge qui n’est plus utile puisque nous avons ajouté un composant matériel “horloge” :
sudo apt -y remove fake-hwclock
sudo update-rc.d -f fake-hwclock remove

Sans oublier de réactiver ensuite ce composant matériel (Raspbian le désactive).
Pour cela, il faut ouvrir un script et le modifier.

Pour l’ouvrir, il faut taper :
sudo nano /lib/udev/hwclock-set

Et modifier :
if [ -e /run/systemd/system ] ; then
exit 0
fi

En :
#if [ -e /run/systemd/system ] ; then
#exit 0
#fi

Comme à chaque fois que vous utilisez nano, pour valider les changements, faites “Ctrl” + “x” puis “o” puis “Entrée”.

Et c’est tout ?
Pas tout à fait.

Vous devez maintenant réaliser une mise à l’heure et une synchronisation de l’heure contenue dans le Raspberry Pi vers le module RTC (habituellement, l’heure est injectée par le réseau).

Vérifiez l’heure du module en faisant :
sudo hwclock -D -r

Attention. Comme vous allez synchroniser l’heure en envoyant l’heure du Raspberry Pi vers le module RTC, vous devez vérifier que le Raspberry Pi est à la bonne date/heure :-).
Comment faire ???
Simplement en faisant :
date

Si ce qui s’affiche vous convient (bonne date et bonne heure), vous pouvez l’injecter dans le module RTC en faisant :
sudo hwclock -w

Une dernière vérification avant LE test final. Faites :
sudo hwclock -r

Maintenant, place au test final … pouvant faire un peu stresser les plus angoissé(e)s d’entre vous 😉

Vous allez éteindre le Raspberry Pi, le débrancher du courant, le débrancher du réseau … et … vous allez mettre un minuteur à sonner dans 10 minutes.

Allez ; zou !!! Filez le faire ; je vous attends. (Psssit : sudo poweroff pour éteindre en ssh)

OK, nous y sommes ?
Vous êtes de retour (avec quelques sueurs froides ???) après 10 minutes …

Allons-y.
Vérifiez que tout est bien débranché.
C’est OK ? Sûr ? Pas de câble réseau ? Vous aviez bien désactivé le Wifi ?

Alors ? C’est bon ?

J’espère que cela fonctionnera aussi bien chez vous que chez moi …

En effet, comme tous les autres articles, ce tutoriel a été testé avant écriture (en général, mes articles sont issus de tentatives/échecs/recherches/concaténations de solutions), mais aussi après pour ultime test (en fait, plusieurs ultimes tests pour dire vrai).

A noter : ayant constaté que si je connectais le Raspberry Pi au réseau, l’heure affichée (et la date) au redémarrage était faussée, j’ai poussé mes tests.
La commande date et la commande hwclock -r ne donnent pas le même résultat.
Le Raspberry Pi affiche date et heure données par date et non celles du module RTC.

J’ai solutionné le souci en forçant la commande sudo hwclock -s au démarrage en l’injectant via le fichier /etc/rc.local et, depuis, je n’ai plus jamais de souci.
Il suffit de faire sudo nano /etc/rc.local et de noter sudo hwclock -s juste après la ligne # By default this script does nothing puis de confirmer les modifications.

Et là, pour cette publication, je viens de réaliser un test sur un Rpi3b+ que j’ai démarré avec la vieille clef USB du projet de lecteur et exécuteur de QR Codes afin de juste suivre bêtement cet article.
Vous savez quoi ?
C’est OK –> Article parfaitement fonctionnel 😉

A propos de Alban

Papa de 4 enfants étant lui même resté un enfant. Diététicien-Nutritionniste tombé par obligation dans l'informatique à 22 ans pour le boulot et s'étant "un peu" pris au jeu ... Pas un génie de l'informatique (loin de là), mais intéressé et carrément orienté Linux et entraide.

8 commentaires à propos de “Ajout d’un module RTC DS3231 au Raspberry Pi”

  1. Rétroliens : Borne Photos autonome, automatique et avec galerie Web intégrée (Raspberry Pi) – TREVILLY.COM

  2. Hello , merci pour ton tuto et ton site qui est au top !!

    Pour ma part j’utilise ce tuto ecrit par sky99 qui fonctionne sur pi 3 B+ avec Buster

    Pour vérifier le fonctionnement de l’ensemble, il faudra installer les programmes python-smbus et i2c-tools :

    sudo apt-get install python-smbus
    sudo apt-get install i2c-tools

    Une fois cela effectué, vous pourrez vérifier que tout fonctionne en tapant la commande suivante :
    sudo i2cdetect -y 1

    et on retrouve ton schéma

    Si cela fonctionne, vous pourrez alors ajouter ces modules dans /etc/modules en exécutant la commande suivante :

    sudo nano /etc/modules

    Vous pourrez alors ajouter à la fin du fichier les deux lignes suivantes :
    i2c-dev
    i2c-bcm2708

    Au prochain redémarrage, les modules seront automatiquement chargés,
    et il ne sera pas nécessaire de faire un modprobe.

    Si tout ce que nous avons fait avant a bien fonctionné,
    nous pouvons alors exécuter la commande suivante :

    echo ds3231 0x68 | sudo tee /sys/class/i2c-adapter/i2c-1/new_device

    Cette commande doit “notifier” au système la présence du composant.
    Dès lors il est possible de consulter l’heure et la date contenue dans le module en faisant un :

    sudo hwclock

    Nous avons donc pu définir la date et l’heure du DS3231.
    Voyons maintenant comment configurer le Raspberry pi
    pour qu’il utilise ce module à chaque démarrage pour définir l’heure.

    En effet, si nous redémarrons maintenant, il faudra refaire “echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device” avant de pouvoir utiliser le module (sinon le sudo hwclock ne fonctionne pas).

    Pour circonvenir à ce problème, nous allons modifier le fichier /etc/rc.local via
    la commande suivante :

    sudo nano /etc/rc.local

    Nous ajouterons à ce fichier les deux lignes suivantes avant la ligne contenant “exit 0” :

    echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
    hwclock -s

    On pourra alors désactiver le service fake-hwclock
    qui tente de reproduire le fonctionnement d’une horloge temps réel
    quand on en dispose pas, via la commande suivante :

    sudo update-rc.d fake-hwclock disable

    j’ai branché le rasp dans ma voiture en dashcam et les fichiers avaient bien la date et l’heure 🙂

    longue vie a ton site !!
    kokoroso

    • Salut kokoroso,

      Le tuto de sky99 fait partie de ceux que j’avais essayé/utilisé.
      Comme j’avais essuyé un échec et tenté plusieurs tutos en même temps (très mauvaise démarche scientifique) et sans prendre réellement de notes (très très mauvaise démarche scientifique) … je ne peux dire ce qui avait débloqué la situation, ni si son tuto de 2015 avait foiré 🙂
      Merci pour ta remarque et tes encouragements,

      • Je suis un noobs mais vu que cela a fonctionné je me suis permis de partager l’essentiel.

        Je note avec soin celui la qui utilise un autre chemin peut être plus conventionnel !

        Penses tu faire un tuto pour un bouton d’arrêt qui lance un script .py pour couper le rasp proprement quand celui ci tourne hors réseau ?

        Merci bonne semaine

          • Autant pour moi , en effet je viens de voir ton post ….. une derniere question peux tu partager la reference de ta connectique que tu utilises pour te brancher sur tes GPIO j’utilise des cosses à sertir de 1mm et c’est pas tres pratique .

            Sur ta photo GPIO sur le projet photomaton je vois des connecteurs tres tres interessants ^^

            merci pour tes réponses rapides

            kokoroso

            • Salut,

              Oups, désolé, j’ai été pas mal pris.

              J’ai plusieurs sortes de connecteurs.
              J’utilise des boutons achetés pour mes bornes d’arcade et leurs câbles.
              Mais j’utilise aussi (et surtout) des boutons de récup avec leurs connecteurs … venant de vieux PC désossés 😀
              Si la photo est celle-ci :Connecteurs de boutons sur port GPIO du Raspberry alors, les boutons viennent (et leurs câbles) d’un lot de bouton d’arcade QUIMAT acheté à l’époque chez Amazon.
              @+

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*