Seite wählen

Ein RTC-Modul DS3231 am Raspberry Pi betreiben

1. Motivation

Real Time Clock

Uhrzeit am Raspberry Pi

Wenn es um die genaue Uhrzeit geht, ist ein Raspberry Pi auf Hilfe angewiesen. Wenn der Minicomputer mit Internet verbunden ist, wird die Uhrzeit mit einem NTP-Server synchronisiert. Ist eine Internetverbindung nicht möglich, bekommt man mit der Uhrzeit ein Problem. Dies ist besonders dann problematisch, wenn man auf einen Zeitstempel angewiesen ist. Für solche Aufgaben gibt Echtzeituhren (real time clock) als Module. In diesem Beitrag soll es um das RTC-Modul vom Typ DS3231 von Maxim (Datenblatt) gehen.

Nach vielen erfolglosen Versuchen und Studium vieler Anleitungen wurde ich unter http://www.forum-raspberrypi.de/ fündig. Insbesondere sind die Kommentare dabei ganz hilfreich. Allerdings musste ich für meine Lösung eine Kombination der Lösungen anwenden.

2. Kurzfassung

1. In der Datei /boot/config.txt am Ende folgende Zeile hinzufügen:

dtoverlay=i2c-rtc,ds3231

2. Den Service fake-hwclock deaktivieren

$ sudo systemctl stop fake-hwclock.service
$ sudo systemctl disable fake-hwclock.service

3. Neue Regel erstellen: /etc/udev/rules.d/rtc-start.rules

ACTION=="add", SUBSYSTEM=="rtc", ATTRS{hctosys}=="0", RUN+="/sbin/hwclock -s --utc"
 

3. Ausführliche Beschreibung

3.1. Einige Vorarbeiten

Abb. 1: Rot markierte Bauteile auf dem Modul sollten entfernt werden.

Das RTC-Modul DS3231 gibt es in unterschiedlichen Ausführungen. Das Kernstück sind der IC DS3231 und eine Batterie. Wer das gleiche Modul verwendet, wie in der Abbildung 1, sollte sich Zeit für einige Änderungen nehmen.

3.2. Hintergrund der Änderungen

Der Hintergrund für die erste Änderung ist recht einfach. Ursprünglich wurde die Schaltung mit einer wiederaufladbaren Batterie (Akku) ausgelegt. Es wurde auch vorgesehen den Akku einfach über einen Vorwiderstand zu laden. Eine recht einfache, wenn auch nicht sehr schöne Möglichkeit, wird aber funktioniert haben (vermute ich). Irgendwann ist man wohl auf die Idee gekommen, den Akku gegen eine nicht wiederaufladbare Batterie auszutauschen (vielleicht aus Kostengründen). Vermutlich wurden aber schon einige Millionen Platinen dafür gefertigt, die Batterie eingesetzt, aber die Ladeschaltung nicht entfernt. Jetzt wird eine nicht wiederaufladbare Batterie dauerhaft geladen. Das geht sicherlich eine Weile gut, aber irgendwann platzt sie! Dann hat man eine große Sauerei.

Abb. 2: Ausschnitte aus dem Schaltplat für das Modul. Links dargestellt die Pull-Up Widerstände auf der Platine und rechts die Ladeschaltung für die aufladbare Batterie.

Eine zweite Änderung betrifft die Pull-up Widerstände, die sich auf er Platine befinden. Diese sind nicht unbedingt notwendig. Sie werden vermutlich nicht wirklich stören, es schadet aber auch nicht sie zu entfernen. Ein Reduzierter Schaltplan für Raspberry Pi 3 ist unter https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/RPI-3B-V1_2-SCHEMATIC-REDUCED.pdf zu finden. Da kann man sich überzeugen, dass die Pull-Up Widerstände auf dem Raspberr Pi 3 für I²C tatsächlich vorhanden sind.

3.3. Das Modul beim Bootvorgang aktivieren

In Raspbian Stretch ist die Aktivierung des RTC-Moduls weitestgehend automatisiert. Es reicht einfach in der /boot/config.txt eine Zeile hinzuzufügen.

$ sudo nano /boot/config.txt

Am Ende wird die Zeile

dtoverlay=i2c-rtc,ds3231

hinzugefügt. Wichtig hierbei ist, dass vor DS3231 kein Leerzeichen eingetippt wird, sonst wird das Modul nicht richtig geladen. Nach einem Neustart werden die Treiber für das RTC-Modul geladen. Das kann man mit folgendem Befehl testen:

$ 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: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

An der Stelle 60/8 stehen zwei U. Das bedeutet, dass der Treiber für DS3231 geladen wurde und dieser jetzt einsatzbereit ist.

3.4. fake-hwclock deaktivieren

Wie bereits erwähnt, verfügt Raspberry Pi über keine interne Uhr. Dies hat zur Folge, dass beim Start des Raspberry Pi irgendeine Uhrzeit angenommen werden muss. Entweder ist es die, bei der für den Raspberry Pi die Zeitrechnung beginn, also 1.1.1970 (je nach Chip) oder das System merkt sich wenigstens die Uhrzeit, die es beim Letzten Herunterfahren hatte. Dafür ist fake-hwclock da. Es sorgt auch dafür, dass bei vorhandener Internetverbindung die Uhrzeit automatisch aktualisiert wird. Da wir jetzt eine echte hwclock haben, darf der service fake-hwclock nicht mehr laufen, sonst gibt es Probleme.
Dazu deaktivieren wir den Service fake-hwclock.

$ sudo systemctl stop fake-hwclock.service

Der Service ist jetzt zwar ausgeschaltet, muss aber für den nächsten Start vollständig deaktiviert werden (beim nächsten Systemstart). Diesen service zu deinstallieren, würde ich nicht empfehlen. Wenn man ihn wieder benötigt, weil man die das DS3231 Modul wieder abgeklemmt hat, kann man den service wieder aktivieren und es läuft mit fake-hwclock.

$ sudo systemctl disable fake-hwclock.service

Prinzipiell funktioniert die Echtzeituhr bereits. Solange der Raspberry Pi im Netz ist, wird die Softwareuhr über das NTP-Protokoll aktualisiert. Um es zu testen, kann die Hardwareclock bewusst verstellt werden.

$ sudo hwclock --set --date="18 Nov 2016 12:00"

Auslesen der Uhrzeit aus der Echtzeituhr und der Softwareuhr ergeben dann unterschiedliche Daten:

$ sudo hwclock -r; date
Fr 18 Nov 2016 09:00:05 CET  -0.706809 seconds
Fr 18. Nov 20:56:28 CET 2016

Nach einer Weile kann man die Uhrzeit noch einmal prüfen:

$ sudo hwclock -r; date
Fr 18 Nov 2016 21:14:57 CET  -0.583170 seconds
Fr 18. Nov 21:14:57 CET 2016

Die Echtzeituhr wurde mit der Internetzeit synchronisiert. Jetzt soll die Echtzeituhr ohne Internet getestet werden.

3.5. Letzte Anpassung

Um das ganze auch mal richtig zu testen, wird das Netzwerkkabel entfernt und WLAN deaktiviert (Wenn man sich über WLAN angemeldet hat). Nach einem Neustart stellt man fest, dass etwas nicht stimmt. Wir schreiten das Jahr 1970! Wieso ist auf einmal eine falsche Zeit eingetragen? Der service fake-hwclock, der sich die Zeit merkte wann das System heruntergefahren wurde, ist jetzt deaktiviert. Eine Synchronisation mit Internet ist aufgrund getrennter Verbindung nicht möglich. Und was ist mit RTC? Wie es aussieht, wurde die Uhrzeit nicht übernommen. An dieser Stelle müssen wir nochmal aktiv werden. Wir müssen dem Raspberry Pi irgendwie beibringen, dass er beim Start die Uhrzeit aus dem RTC-Modul auslesen soll.
Es muss noch eine Regel erstellt werden, die immer, wenn RTC aufgerufen wird (beim laden der Treiber), die Uhrzeit synchronisiert wird.

$ sudo nano /etc/udev/rules.d/60-rtc_synch.rules

Der Inhalt der Datei soll wie folgt aussehen:

ACTION=="add", SUBSYSTEM=="rtc", ATTRS{hctosys}=="0", RUN+="/sbin/hwclock -s --utc"

Datei speichern und beenden. Das wars. Für einen Test kann das System für einige Minuten heruntergefahren werden. Wenn das System danach hochgefahren wird, sollte die richtige Uhrzeit angezeigt werden.

0 Kommentare

Einen Kommentar abschicken

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.