circuits
  • Registrieren

Article Index

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!

Add comment

Security code
Refresh

Shopping Cart

0 Products - 0,00 EUR
Go to cart

Newest products

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