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 😉
Bonjour,
Pour un tuto bien fait, c’est un tuto bien fait !!!
Merci infiniment car je n’y connais pas grand chose et cela a fonctionné: OUF
J’utilise le Raspberry comme aide à la navigation en mer, l’heure et donc une chose très importante.
Bien cordialement
Didier
Merci Didier 🙂
Attention, il faut vérifier de temps en temps que le Rpi garde bien l’heure.
Mes modules RTC m’ont appris que le « pas cher » est doté d’une pile ayant une durée de vie limitée.
J’en ai un qui a rendu l’âme (et mon Rpi n’était plus du tout à la bonne date).
@+
Salut Alban. Je pense que je dois faire une mauvais manipulation. Je pensais que le module 3210 etait générique.. Comment je peux savoir le nom de mon module ?
Re,
Dans mon cas, c’est le module DS3231.
Donc, dans le fichier, j’ajoute dtoverlay=i2c-rtc,ds3231
Mais si ta référence est autre … 😉
Tu as commandé quel module RTC ?
(tu as un lien vers ton achat ?)
Bonjour Alban,
je suis de retour sur la construction de mon photomaton. encore merci pour le partage.
je teste pour améliorer le photomaton avec le module RTC mais j’ai pas les mêmes données.
je n’arrive pas a avoir le numéro 68 et la transformation en UU pourtant j’ai suivi à la lettre ton tuto.
es ce que tu aurais une solution
Merci d’avance
bon weekend
alexandre
Salut Alexandre,
Je n’ai pas retesté ce tuto dernièrement, mais il fonctionnait encore il y a environ 1 mois.
Quel est le modèle de ton module RTC ?
++
Merci beaucoup pour ce super tuto très efficace
Rétroliens : Borne Photos autonome, automatique et avec galerie Web intégrée (Raspberry Pi) – TREVILLY.COM
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
Facile pour le script d’arrêt –> j’en ai un sur mon photomaton/borne à selfy.
Bon, c’est une idée d’en faire un mini article ; y a plus qu’à 😉
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 : alors, les boutons viennent (et leurs câbles) d’un lot de bouton d’arcade QUIMAT acheté à l’époque chez Amazon.
@+