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:

2. Den Service fake-hwclock deaktivieren

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

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.

Am Ende wird die Zeile

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:

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.

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.

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.

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

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

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.

Der Inhalt der Datei soll wie folgt aussehen:

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.

2 Kommentare

  1. Jens Schröder

    Da der DS3231 mit 3,3 Volt arbeitet können die Pullup-Widerstände drauf bleiben. Die sind nämlich Teil des I2C Buses. Beim DS1307 sieht das anders aus. Dieser wird mit 5 Volt betrieben und die Pullups müssen runter. Übrigens der DS3231 funktioniert auch mit der Software des DS1307, der ist älter und benötigt ein externen Quarz. Der DS3232 soll noch etwas genauer sein, bringt aber wahrscheinlich kaum Vorteile da größeres Gehäuse.
    Das NTP habe ich angelassen, 2x im Jahr muss eh die Uhr synchronisiert werden.
    Die FakeRTC entfernen bringt Lebenszeit für die SD Karte.

    Antworten
  2. Patrick

    Danke für den Artikel, aber leider scheint bei mir etwas falsch zu laufen.
    Ich habe es nun schon mit mehreren Anleitungen versucht, aber bei mir gibt es folgendes Verhalten.

    Nachdem ich die RTC mit meiner System-Uhrzeit versehe (mit sudo hwclock -w), passt es erstmal kurz. Aber nach kurzer zeit schau ich wieder rein mit sudo hwclock -r und sehe auf einmal wieder eine falsche Uhrzeit, Datum bleibt korrekt.

    Eine Idee woran das liegen könnte?

    Danke & Grüße
    Patrick

    Antworten

Einen Kommentar abschicken

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