Startseite
  • Registrieren

Beitragsseiten

Neben dem 1-wire-Bus unterstützt der Raspberry Pi auch das Bussystem "Inter-Integreted-Circuit". Normal wäre als Abkürzung IIC, die Entwickler fanden I²C-Bus wohl einfach cooler. I²C ist ein Bus der entwickelt wurde, um mehrere Schaltungen in einem Gerät oder zwischen verschiedenen Geräten steuern zu können. I²C benötigt immer einen Master, der den Takt angiebt. Das soll aber auch schon alles zur Technik sein. Probieren wir es einfach aus.

Eine häufige I²C-Anwendung ist z.B. die Echtzeituhr (engl.: Real Time Clock, RTC) in Computern. Da der Raspberry Pi keine eigene Uhr hat, wollen wir ihm im Beispiel mal gleich eine verpassen. Dazu müssen wir als erstes dafür sorgen, dass I²C für den Raspberry Pi verfügbar ist. Raspbian hat die Treiber für I²C bereits integriert. Da sie jedoch selten benötigt werden sind sie in der so genannten Blacklist deaktiviert. Vieles in Linux wird mit Konfigurationsdateien (*.conf) erledigt, die beim Systemstart abgefragt werden. Sie befinden sich grundsätzlich im Verzeichnis oder einem Unterverzeichnis /etc. So auch die Blacklist für den Raspberry Pi "raspi-blacklist.conf". Gehen wir also wieder in unsere "Entwicklungsumgebung" indem wir falls wir noch nicht da sind, mit startx in die grafische Oberfläche wechseln, den Dateimanager im Administratormodus und das Administratorterminal öffnen.


I²C aktivieren

Im Dateimanager suchen wir im Verzeichnis /etc/modprobe.d die raspi-blacklist.conf und öffnen diese mit einem Doppelklick. Wie wir sehen sind die *.conf-Dateien ganz normale Textdateien. Die raspi-blacklist.conf ist eine Negativliste, also alles was da drin steht wird nicht gemacht. Sie enthält nach dem Öffnen folgende Zeilen:

# blacklist spi and i2c by default (many users don't need them) blacklist spi-bcm2708
blacklist i2c-bcm2708

Die erste Zeile ist ein Kommentar und wird nicht beachtet, das wird durch das # vor der Zeile erreicht. Alle Zeilen vor denen das # steht werden also ignoriert. Gut so! Denn das können wir mit den beiden folgenden Einträgen auch machen dami sie beim Start ignoriert, werden, denn alles was in der Blacklist steh wird ja nicht geladen. Da die wir die beiden Treiber benötigen machen wir folgendes:

# blacklist spi-bcm2708
# blacklist i2c-bcm2708

Hier sehen wir auch gut, dass nicht der Name der Datei dafür sorgt, dass die in ihr stehenden Treiber nicht geladen werden, sondern der Befehl "blacklist". Wenn wir alle Befehle kennen und in hunderten Zeilen noch durchblicken würden, könnten wir tatsächlich die gesamte Konfiguration für das Betriebssystem und aller Programme in eine Datei schreiben. Woran erinnert uns dass? Genau an die Windows Registry, in Windows läuft das nämlich so. Das nur am Rande, wir speichern erst mal die Datei. Gibt es Probleme beim Speichern sind wir nicht im Administratormodus des Dateimanagers.

Nun müssen wir noch dafür sorgen, dass die Hardware (Device) für I²C bereitgestellt wird. Dazu müssen wir ein so genanntes Modul laden. Module die geladen werden sollen, werden in der Datei /etc/modules aufgeführt. Wo auch sonst! Also die Datei modules im verzeichnis /etc öffnen und um folgenden Eintrag ergänzen:

i2c-dev

Später wollen wir vielleicht nicht immer als Administrator (root) im System arbeiten, dass kann gefährlich sein. Wir weisen ohne viel zu überlegen erst mal dem Benutzer pi die Rechte zu mit I²C zu arbeiten. Genaues dazu können wir später in den Linux-Grundlagen lesen. Im Administratorterminal geben wir ein:

adduser pi i2c

Damit haben wir den Raspberry Pi so weit I²C zu können. Wir sollten den Raspberry Pi nun runterfahren. Erstens müssen wir ihn sowieso neu starten und zweitens können wir die Uhr gleich anschließen. Wenn nichts mehr blinkt trennen wir die Stromversorgung.


I²C Uhr anschließen

Wir nutzen als Echtzeituhr den weit verbreiteten und sehr einfach zu beschaltenden Chip DS1307 mit einem 32.768kHz Quarz und integriertem I²C.

Chip DS 1307

Beschaltung DS1307

Beides passt gut auf eine Experimentierplatine. Der Chip kann zum Speichern der Uhrzeit bei Stromausfall mit einer Pufferbatterie versehen werden. Für unseren Testaufbau lassen wir die weg. Damit die Uhr funktioniert muss der Uhrenanschluss auf Masse (0 V) gelegt werden. Das machen wir mit einer Drahtbrücke. Die Schaltung sollte dann so aussehen:

 Aufbau RTC


I²C testen

Wenn wir alles mit dem Raspberry Pi verbunden haben, schließen wir das Netzteil wieder an und der Raspberry Pi fährt hoch. Wir öffnen wieder unsere Entwicklungsumgebung. Unser Betriebssystem hat eine kleine Werkzeugsammlung, mit der wir I²C scannen können. Wir geben dazu in das Administratorterminal mal folgendes ein:

man i2cdetect

"man" ruft bei Raspbian die "Bedienungsanleitung" zum Befehl, in unserem Fall i2cdetect auf.

Manual i2cdetect

Sehen wir in der Konsole nicht das Dargestellte, sind die i2c-tools nicht installiert. Wir können sie nachinstallieren mit

apt-get install i2c-tools

Die Bedienungsanleitung verlassen wir, wenn wir einfach "q" drücken. Aufgemacht haben wir die Anleitung damit interessierte sich die durchlesen können. Wir brauchen nur die Parameter i2cbus und -y. Es gibt nämlich 2 I²C-Busse mit der Nummer 0 und 1. Das ist wichtig, weil sich das leider in den Versionen des Raspberry PI unterscheidet. Die neueren Modelle haben auf der Hauptsteckleiste den Bus 1 anliegen. Das -y ist der Parameter, der dafür sorgt, dass unser Chip gleich antwortet. Also geben wir ein:

i2cdetect -y 1

Das Ergebnis sollte so aussehen:

Ergebnis I²C Scan

Sehen wir keine Zahl (hier die 68) ist es entweder der falsche Bus und wir versuchen es mit i2cdetect -y 0. Passiert da auch nichts ist unsere Schaltung falsch aufgebaut. Also alles noch mal in Ruhe prüfen!

Die 68 sagt uns, dass die Uhr mit der hexadezimalen Adresse 68 (Schreibweise: 0x68) angesprochen werden will.


Mit I²C kommunizieren

Um uns mit der Uhr zu unterhaltem, müssen wir den Treiber für das konkrete Gerät laden. Raspbian hat einige Treiber bereits integriert, so auch den für unsere Uhr. Wir brauchen also nichts zu installieren sondern können den Treiber gleich laden mit:

modprobe rtc-ds1307

Jetzt legen wir noch eine virtuelle Datei für die Uhr an. Wichtig ist, dass wir hier die richtege Nummer des Busses nehmen also i2c-1:

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

Das wars auch schon und wir können die Zeit auslesen. Unser System weiß mittlerweile, dass eine Uhr (hwclock) angeschlossen ist. Folgender Befehl sollte uns die Uhrzeit ausgeben:

hwclock -r

Beim ersten Abruf wird uns der 1. Januar 2000 angezeigt. Hatten wir den Chip schon mal benutzt wird die Zeit der letzten Nutzung angezeigt.

Uhrzeit abrufen

Nun können wir die Uhr stellen. Wir haben ja die Systemuhrzeit unseres Raspberry Pi. Die ist wenn sie aus dem Web kommt recht genau, ansonsten aber zumindest anders als die ebend abgerufene Zeit.  Wir rufen mal die Sytemzeit ab mit:

date

Die Zeit wird angezeigt und wir machen gleich weiter mit dem Stellen:

hwclock -w

Wenn wir jetzt die Zeit wieder abrufen sollte die aktuelle Systemzeit angezeigt werden:

hwclock -r

Uhrzeit stellen

Problem ist, das ab dem Punkt "Mit I²C kommunizieren" nach einem Neustart alles wieder eingegeben werden muss. Aber auch dafür gibt es eine Lösung.


I²C-Uhr dauerhaft einbinden

Dazu müssen wir Einträge in 2 Dateien vornehmen. Als erstes sorgen wir dafür, dass das Kernelmodul rtc-ds1307 beim Start geladen wird. Dazu öffnen wir als root (in der Konsole mit sudo, bei LXD mit dem Dateimanager im Rootmodus) die Datei etc/modules und tragen ans Ende der Auflistung ein:

rtc-ds1307

Dieser Eintrag macht nichts anderes als automatisch das Kernelmodul zu laden, was wir vorher mit modeprobe rtc-ds1307 manuell tun mussten.

Jetzt muss die Uhr noch aktiviert und die Uhrzeit an das System übergeben werden. Dazu öffnen wir die Datei etc/rc.local. Natürlich wieder als root, sonst können wir die Änderungen nicht speichern. Wir achten darauf, dass wir die folgenden Einträge vor der Zeile exit 0 machen und das sudo vor dem Kommando zum Übernehmen der Uhrzeit nicht vergessen.

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

Beim nächsten Neustart sollte nun die Uhrzeit des Systems der aktuellen Zeit der Echtzeituhr entsprechen. Testen können wir das, indem wir den Raspberry Pi für ein paar Minuten ausschalten und dann ohne Internetanbindung starten (sonst wird die Zeit von dort geholt). Das Ganze macht natürlich nur Sinn, wenn wir die Uhr mit einer Batterie versehen haben. Hat er nun die aktuelle Zeit haben wir es geschafft!

Kommentare   

0 #39 Jörg Neumann 2015-01-29 17:08
Gehe ins Forum, dort auf Index, dann auf Sets und Schaltungen. Dort kannst Du ein neues Thema aufmachen.
Zitieren
0 #38 Peter 2015-01-29 16:07
jörg du hast doch weiter unten ins Forunm gebeten.. hab keine passenden Thread gefunden. Kannst du mir den weg weisen? oder soll ich dort einen neuen thread aufmachen?

danke dir!
Zitieren
0 #37 Peter 2015-01-29 16:05
zitiere Jörg Neumann:
Hast Du die Zeile auch in der rc.local eingetragen?
Edit: Uuups, da war ich dann zu langsam 8)


wie so zu langsam??^^
meine letzter komentar bezog sih auf was anders und war auch faldsch...

mein Problem besteht noch immer!
Ja hab auch die /etc/rc.local entsprechen geändert....
auch als root :-/
Zitieren
0 #36 Jörg Neumann 2015-01-29 14:45
Hast Du die Zeile auch in der rc.local eingetragen?
Edit: Uuups, da war ich dann zu langsam 8)
Zitieren
0 #35 Peter 2015-01-29 14:42
na da havb ich wohl die aktuellen kommentare uebersehen. Entschuldigt! ^^
Zitieren
0 #34 Peter 2015-01-29 14:05
Hallo zusammen,
bekommt man hier noch reaktionen? ^^
Ich versuchs mal obwohl der Thread schon etwas ruht...

ich bin dankbar dieser Anleitung gefolgt! Leider ist nach einem Reboot das erneute ausführen von:
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
nötig, damit hwclock wieder funktioniert! :-(

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
kann ich auch nicht als normaler Bennutzer ausführen. Auch mit Sudo vorweg nicht. ich muss erst mit su in die root-shell wechseln damit er das scheinbar akzeptiert...

wieso wird die Uhr denn bei Systemstart nicht eingebunden??

Ich freue michh über eure geopferte Zeit!
gruß Peter
Zitieren
0 #33 Jörg Neumann 2014-05-10 14:06
zitiere DocAdams:
Die Uhr geht nach. Also in 60 Sekunden geht sie etwa 20 Sekunden weiter. Das ist viel. Muss man den Quarz in einer bestimmten Richtung anlöten?

Das ist nicht nur viel, dass ist eindeutig zuviel bzw. zu wenig. Die Einbaurichtung vom Quartz ist egal, daran kann es schon mal nicht liegen. Prüf doch mal bitte mit hwclock -r ob das Datum stimmt. Eine Batterie hast Du eingebaut, oder? Komm doch bitte ins Forum, da schreibt sich das einfach besser als hier in den Kommentaren.
Zitieren
0 #32 DocAdams 2014-05-10 12:48
Hallo und vielen Dank für dein Tutorial.
Es ist, wie alle deine Beschreibungen, sehr gut für Unsereins (Anfänger und Quereinsteiger) aufbereitet.
Ich habe gestern Nacht die Uhr zum Laufen gebracht, und alles klappte prima. Dann habe ich den RasPi wieder ausgeschaltet und bekam vorhin einen Schreck. Die Uhr geht nach. Also in 60 Sekunden geht sie etwa 20 Sekunden weiter. Das ist viel. Muss man den Quarz in einer bestimmten Richtung anlöten? Sonst hätte ich keine Idee, was es sein kann. Nur habe ich im Tut und auch am Quarz selber keine Hinweise auf eine bestimmte Reihenfolge gefunden.
Weil alles gestern lief (auf die richtige Zeit hatte ich nicht geachtet), habe ich schon alles verlötet. Deshalb die Frage.
Schönes Wochenende!
Zitieren
0 #31 Jörg 2013-12-31 13:36
zitiere FireFlyer:
wenn ich die Uhr verbaut und installiert habe, wird die Uhr dann auch regelmäßig per NTP gestellt, oder muss ich da selbst für sorgen?

Die Zeit wird durch den Eintrag echo ds1307 ... in der etc/rc.local erst an das System übergeben. Die Uhr wird nicht gestellt. Man könnte mit einem Crojob und ntpdate die Systemzeit einstellen und dann mit hwclock -w die Uhrzeit der RTC danach stellen. Am besten machst du einen Thread im Forum auf, da ist mehr Platz für Code etc.
Zitieren
0 #30 FireFlyer 2013-12-31 13:20
Hallo,
wenn ich die Uhr verbaut und installiert habe, wird die Uhr dann auch regelmäßig per NTP gestellt, oder muss ich da selbst für sorgen? Wenn ja, wie würde man das automatisch ein mal am Tag und nach dem Einschalten machen. Ich möchte eine Heizungssteueru ng per fhem bauen, und die soll so zuverlässig wie möglich sein. fhem mag es aber nicht, wenn die Uhrzeit nicht stimmt, dann kommt es aus dem Trab. Das passiert gern beim start, wenn die Uhr nach dem Start von fhem per ntp gestellt wird.
Zitieren

Warenkorb

0 Produkte - 0,00 EUR
Zum Warenkorb

Deutsches Raspberry Pi Forum

Neue Produkte

miniUSB Verbindungskabel 15cm (Artikelnummer: MINIUSB15CM)
0,65 EUR
Raspberry Pi 3 Modell B+ (Artikelnummer: RASPI3BPLUS)
36,50 EUR
Acrylgehäuse NanoPi NEO AIR (Artikelnummer: GEHNANOPINEOAIR)
5,50 EUR
3D Druck Gehäuse NanoPi NEO (Artikelnummer: GEHNANOPINEO)
4,50 EUR
NanoHat Proto (Artikelnummer: NANOHATPROTO)
7,45 EUR