Outils pour utilisateurs

Outils du site


raspberry_pi:ds3231_rtc_horloge

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
raspberry_pi:ds3231_rtc_horloge [06/10/2016 18:37]
sky99
raspberry_pi:ds3231_rtc_horloge [06/10/2016 21:07] (Version actuelle)
sky99
Ligne 1: Ligne 1:
-====== ajouter une horloge temps réel I2C ======+====== ​DS3231 : ajouter une horloge temps réel I2C au Raspberry pi======
  
 Le Raspberry pi ne dispose pas de module RTC (Real Time Clock, horloge en temps réel), et ne peut donc pas garder une trace précise du temps écoulé sans avoir recours à une synchronisation sur un serveur de temps (NTP). Cela n’est pas toujours possible, notamment pour des projets ou le Raspberry Pi n’est pas connecté au réseau. Pour remédier à cela, il est possible d’ajouter un module RTC tel que le DS3231, économique,​ compact et précis. Nous verrons dans ce tutoriel comment réaliser cela. Le Raspberry pi ne dispose pas de module RTC (Real Time Clock, horloge en temps réel), et ne peut donc pas garder une trace précise du temps écoulé sans avoir recours à une synchronisation sur un serveur de temps (NTP). Cela n’est pas toujours possible, notamment pour des projets ou le Raspberry Pi n’est pas connecté au réseau. Pour remédier à cela, il est possible d’ajouter un module RTC tel que le DS3231, économique,​ compact et précis. Nous verrons dans ce tutoriel comment réaliser cela.
Ligne 7: Ligne 7:
 ===== DS3231 RTC : le module ===== ===== DS3231 RTC : le module =====
  
-{{:http://​nagashur.com/​blog/​wp-content/​uploads/​2015/​08/​DS3231_cote_4774.jpg?​200 |}}Ce module est très compact, puisqu’il fait 13.6*13.6mm pour une hauteur de 11.4mm. Il dispose de 5 broches femelle, de façon à pouvoir être branché facilement, puisqu’il suffit de l’enfoncer sur les GPIO dans le bon sens. Nous verrons toutefois comment le connecter via des câbles, car cela évite de bloquer l’accès au bus I2C, au +3.3v et à un GPIO.+{{http://​nagashur.com/​blog/​wp-content/​uploads/​2015/​08/​DS3231_cote_4774.jpg?​200 |}}Ce module est très compact, puisqu’il fait 13.6*13.6mm pour une hauteur de 11.4mm. Il dispose de 5 broches femelle, de façon à pouvoir être branché facilement, puisqu’il suffit de l’enfoncer sur les GPIO dans le bon sens. Nous verrons toutefois comment le connecter via des câbles, car cela évite de bloquer l’accès au bus I2C, au +3.3v et à un GPIO.
  
 Le module dispose d’une petite pile bouton qui lui permet de garder une trace du temps écoulé même quand le Raspberry pi n’est pas alimenté. Le module dispose d’une petite pile bouton qui lui permet de garder une trace du temps écoulé même quand le Raspberry pi n’est pas alimenté.
Ligne 18: Ligne 18:
  
 La photo ci dessous permettent de voir le sens d’installation:​ La photo ci dessous permettent de voir le sens d’installation:​
-{{:​raspberry_pi:​raspberrypi_with_ds3231_6514.jpg?​300 |}}+{{ :​raspberry_pi:​raspberrypi_with_ds3231_6514.jpg?​500 | }}
  
 +==== Branchement avec des câbles ====
 +{{http://​nagashur.com/​blog/​wp-content/​uploads/​2015/​08/​DS3231_bottom_4766_pinout.jpg?​300 |}}
 +Si vous retournez votre module, vous verrez des indications près du connecteur femelle. La broche **+** sera connectée au GPIO1, à savoir le **+3.3V**. La broche **D** ira sur le **GPIO3**, à savoir la broche SDA du bus I2C. La broche **C** ira sur le **GPIO 5**, à savoir la broche **SCL** du bus **I2C**. La broche **NC** ne sera connectée à rien, et la broche **–** ira à la **masse** du Raspberry pi, par exemple le **GPIO 9**. N’oubliez pas que sur la double rangée de GPIO, on compte ligne par ligne :
 +
 +1 2
 +3 4
 +5 6
 +etc.
 +
 +Si vous avez besoin d’une référence,​ voici [[http://​pi.gadgetoid.com/​pinout|le schéma des GPIO]], si on tient le Raspberry pi comme décrit plus haut, et sur la photo du Raspberry pi 2.
 +
 +===== Configuration de l’I2C =====
 +Ce module fonctionne en I2C, il est donc nécessaire de l’activer et de le faire fonctionner. Pour cela, le plus simple est d’exécuter l’utilitaire **raspi-config** :
 +<code bash>​sudo raspi-config</​code>​
 +Ensuite, sélectionnez l’option **7 – Advanced configuration**,​ puis l’option **A7 I2C**, et choisissez **YES**, **OK**, **YES**, et encore **OK**. Vous pouvez alors faire **finish**, puis accepter de redémarrer.
 +
 +Pour vérifier le fonctionnement de l’ensemble,​ il faudra installer les programmes **python-smbus** et **i2c-tools** :
 +<code bash>
 +sudo apt-get install python-smbus
 +sudo apt-get install i2c-tools
 +</​code>​
 +Une fois cela effectué, vous pourrez vérifier que tout fonctionne en tapant la commande suivante :
 +<code bash>​sudo i2cdetect -y 1</​code>​
 +
 +Les premiers modèles de Raspberry pi (très anciens) devront recevoir la commande **sudo i2cdetect -y __0__** à la place.
 +
 +Si cela ne fonctionne pas, vous pouvez essayer de charger les modules **i2c-dev** et **i2c-bcm2708** à la main :
 +
 +<code bash>
 +sudo modprobe i2c-dev
 +sudo modprobe i2c-bcm2708
 +</​code>​
 +
 +Si cela fonctionne, vous pourrez alors ajouter ces modules dans /​etc/​modules en exécutant la commande suivante :<code bash>​sudo nano /​etc/​modules</​code>​
 +
 +Vous pourrez alors ajouter à la fin du fichier les deux lignes suivantes :
 +<​code>​
 +i2c-dev
 +i2c-bcm2708
 +</​code>​
 +
 +Au prochain redémarrage,​ les modules seront automatiquement chargés, et il ne sera pas nécessaire de faire un **modprobe**.
 +
 +Si cela ne fonctionne toujours pas, voici [[https://​www.raspberrypi.org/​forums/​viewtopic.php?​p=675658#​p675658|une piste à explorer, en anglais]], mais les instructions sont claires (un fichier à modifier).
 +
 +Si tout à bien fonctionné et que le câblage est bon, vous devriez voir ceci en faisant un sudo i2cdetect -y 1 :
 +{{ http://​nagashur.com/​blog/​wp-content/​uploads/​2015/​08/​i2cdetect.png |}}
 +
 +===== Utilisation du module =====
 +Notre module est détecté, et utilisable. Cependant, nous ne savons pas encore ce qu'il "​raconte"​. Nous chercherons donc à communiquer avec le module.
 +
 +Si tout ce que nous avons fait avant a bien fonctionné,​ nous pouvons alors exécuter la commande suivante :
 +
 +<code bash>​echo ds3231 0x68 | sudo tee /​sys/​class/​i2c-adapter/​i2c-1/​new_device</​code>​
 +
 +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 :
 +
 +<code bash>​sudo hwclock</​code>​
 +
 +Cela devrait dès lors afficher une date et une heure. Si vous n'avez jamais utilisé le module, celle ci sera probablement incorrecte. On pourra alors la régler.
 +==== Définir la date du système depuis internet et l'​enregistrer dans le DS3231 ====
 +Avant tout assurons nous que les données du système sont correctes, en vérifiant la "//​timezone//"​ (fuseau horaire) :
 +<code bash>​sudo dpkg-reconfigure tzdata</​code>​
 +
 +Choisissez bien le bon continent et la bonne zone. Vous pouvez vérifier la date et l'​heure du système via la commande **date**. Lorsque celle ci est définie correctement,​ vous pourrez alors écrire la valeur actuelle du système en utilisant la commande suivante :
 +<code bash>​sudo hwclock -w</​code>​
 +
 +==== Définir la date du système manuellement et l'​enregistrer dans le DS3231 ====
 +
 +
 +Si votre Raspberry pi n'a pas accès à internet pour se synchroniser à une horloge précise, vous pouvez toujours utiliser la commande suivante pour définir une date arbitraire (ici le 31 Aout 2015, à 13h15:00s) :
 +
 +<code bash>​sudo date -s "Aug 31 2015 13:​15:​00"</​code>​
 +
 +Vous pourrez alors utiliser sudo hwclock -w pour définir la date et l'​heure sur le module RTC à partir de cette heure définie pour le système. Notez bien que la commande précédente définit la date et l'​heure du système au moment de la commande, mais que dès lors la valeur évolue normalement. Il n'est donc pas obligatoire d'​effectuer les deux commandes à la suite de façon très rapide. En revanche si vous éteignez/​redémarrez le Raspberry pi, il est possible que la valeur qu'il aie en mémoire ne soit plus correcte.
 +
 +
 +==== Configuration du système pour utiliser automatiquement le module RTC DS3231 ====
 +
 +
 +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 :
 +
 +<code bash>​sudo nano /​etc/​rc.local</​code>​
 +
 +Nous ajouterons à ce fichier les deux lignes suivantes avant la ligne contenant "exit 0" :
 +
 +<code bash>
 +echo ds3231 0x68 > /​sys/​class/​i2c-adapter/​i2c-1/​new_device
 +hwclock -s
 +</​code>​
 +
 +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 :
 +
 +<code bash>​sudo update-rc.d fake-hwclock disable</​code>​
 +
 +On pourra également dans ce contexte désactiver le service ntp, qui synchronise l'​heure locale avec celle d'un serveur de temps :
 +
 +
 +<code bash>​sudo update-rc.d ntp disable</​code>​
 +
 +
 +Si par la suite on souhaite synchroniser la date et l'​heure du système avec celle de serveurs de temps, on pourra utiliser la commande suivante :
 +
 +<code bash>​sudo ntpd -qg</​code>​
 +
 +Il est alors toujours possible d'​écrire la valeur obtenue dans l'​horloge temps réel en utilisant la commande **sudo hwclock -w**.
 +
 +===== Conclusions =====
 +
 +
 +Ce module compact permet donc d'​ajouter une horloge temps réel au Raspberry pi à bas coût. Elle est relativement précise, avec [[http://​jeelabs.org/​2012/​01/​21/​precision-time-anyone/​|une déviation maximale d'​environ 1 seconde par semaine]], soit 1 minute par an. Il s'agit du pire des cas, car la déviation peut aller dans les deux sens, donc bien souvent des déviations successives s’annuleront. ​ Ce module est significativement plus précis que le DS1307 qui fut très populaire. Toutefois vu les prix de ces DS3231, autant s'en servir.
 +
 +Le module que j'ai utilisé provient de chine, et jusqu'​ici je n'ai eu aucun soucis avec. Dans le cas contraire, je signalerai toute défaillance sur ce blog.
 +
 +Ce module permet donc au Raspberry pi de garder une trace précise du temps, ce qui pourra servir dans un projet embarqué (comme [[http://​nagashur.com/​blog/​2015/​08/​17/​raspberry-pi-mobile-lipo-un-systeme-autonome-et-rechargeable-a-bonne-autonomie/​|ce Raspberry pi mobile, sur batterie par exemple]]) sans accès à internet. Par exemple, pour faire des photos en pleine nature, ou prendre des mesures. Dans tous les cas, on disposera d'une date et d'une heure précise pour dater les photos ou mesures.
 +
 +Si toutefois cela ne suffisait pas, il faudrait s'​orienter vers des systèmes plus complexes, tels que les [[https://​fr.wikipedia.org/​wiki/​Horloge_atomique|horloges atomiques]],​ par exemple [[http://​freqelec.com/​rb_osc_fe5680a.html|celles au rubidium]], mais ce sont des appareils plus gros et consommateurs d'​énergie,​ qui serviront pour des mesures ultra précises.
 +
 +===== Lectures complémentaires =====
 +
 +Voici quelques liens si vous souhaitez approfondir le sujet :
 +
 +    * Un [[http://​www.drewkeller.com/​blog/​adding-hardware-clock-raspberry-pi-ds3231|tutoriel en Anglais sur l’installation du DS3231]];
 +    * un [[http://​www.drewkeller.com/​blog/​adding-hardware-clock-raspberry-pi-ds3231|autre tutoriel an Anglais sur le même sujet]], (les commentaires parlent de certains problèmes potentiels);​
 +    * encore [[https://​nicegear.co.nz/​blog/​using-an-i2c-real-time-clock-rtc-with-a-raspberry-pi/​|un tutoriel en anglais, avec une grosse discussion dans les commentaires]],​ à voir en cas de problème;
 +    * la [[https://​packages.debian.org/​unstable/​main/​fake-hwclock|documentation du service fake-hwclock]];​
 +    * [[https://​learn.adafruit.com/​adafruits-raspberry-pi-lesson-4-gpio-setup/​configuring-i2c|configuration de l’I2C (tutoriel en Anglais, Adafruit)]];​
 +    * la [[http://​linux.die.net/​man/​8/​hwclock|manpage de la commande hwclock]].
  
  
  
raspberry_pi/ds3231_rtc_horloge.1475771872.txt.gz · Dernière modification: 06/10/2016 18:37 par sky99