Aus Raspberry Pi Geek 01/2015

Der I²C-Bus des Raspberry Pi (Teil 1) (Seite 2)

Zum Testen schließen wir nun einen PCF8574-Mikrocontroller an den Bus an und betrachten anschließend die wichtigsten Grundfunktionen des I2C-Busses. Das Datenblatt des PCF8574 finden Sie im Internet [2]; der Schaltplan unseres simplen Testaufbaus (Abbildung 1) mit vier LEDs und Tastern liegt als ic2_test.eps sowie i2c_test.sch (für Gschem aus dem gEDA-Projekt [3]) auf der Heft-DVD bei.

Abbildung 1: Der Testaufbau mit einem PCF8574-Mikrocontroller und vier LEDs mit jeweils einem eigenen Taster.

Abbildung 1: Der Testaufbau mit einem PCF8574-Mikrocontroller und vier LEDs mit jeweils einem eigenen Taster.

GPIO- und I2C-Treiber

Um den I2C-Bus verwenden zu können, müssen Sie den I2C-Treiber laden. Dafür greifen Sie auf die WiringPi-Library [4] zurück, die Sie eventuell schon von anderen Projekten kennen. Sie installieren die Bibliothek auf einem Raspbian-System aus dem Github des Projekts (Listing 1). Dazu laden Sie nach dem Aktualisieren des Systems und der Installation des Git-Clients mit git clone die WiringPi-Bibliothek herunter. Anschließend bauen Sie das Programm und installieren es im System. Die Ausgaben von gpio -v oder gpio readall (Abbildung 2) zeigen anschließend, ob die Installation auch erfolgreich war.

Abbildung 2: Nach Installation der WiringPi-Bibliothek lesen Sie mit »gpio readall« die GPIO-Schnittstelle aus.

Abbildung 2: Nach Installation der WiringPi-Bibliothek lesen Sie mit »gpio readall« die GPIO-Schnittstelle aus.

Listing 1

$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get install git-core
$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ ./build

Damit funktioniert nun der Zugriff auf die GPIO – allerdings versteht sich das System noch nicht mit dem I2C-Bus. Für diesen benötigen Sie die i2c-tools aus den Paketquellen (Listing 2, erste Zeile), zudem müssen Sie den Standard-Benutzer pi des Systems in die Benutzergruppe i2c aufnehmen (zweite Zeile). Um die Gruppenzugehörigkeit zu aktivieren, sollten Sie sich danach einmal ab- und wieder anmelden. Anschließend laden Sie den I2C-Treiber mit dem Gpio-Befehl (dritte Zeile).

Listing 2

$ sudo apt-get install i2c-tools
$ sudo adduser pi i2c
$ gpio load i2c

i2cdetect zeigt Ihnen nun, welche Geräte unter welcher Adresse am Bus hängen. In unserem Fall sprechen wir den Controller unseres Testaufbaus unter der Adresse 0x20 an (Listing 3). Über die oberen 4 Bit unseres IO-Bausteins erreichen wir die LEDs, das niederwertige Nibble ist hingegen mit den Tastern verbunden.

Listing 3

$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

In der Standardeinstellung stehen alle Pins des PCF8574 auf high; wundern Sie sich daher nicht, dass alle LEDs aufleuchten. Mit dem ersten Befehl aus Listing 4 schalten Sie sämtliche LEDs auf einen Schlag ab und dann nach und nach wieder an. Zum Auslesen der Tasten schalten Sie die entsprechenden Pins erst einmal auf high. Dafür gibt es gute Gründe, auf die wir jedoch erst in einem späteren Teil eingehen, der sich ausführlich um den PCF8574 dreht. Fürs Erste setzen Sie daher den Pin mit i2cset und lesen dann den Zustand des Tasters mit i2cget aus (Listing 5). Der Aufruf von watch bewirkt eine Wiederholung des Kommandos und die Ausgabe dessen auf der Konsole.

Listing 4

$ i2cset -y 1 0x20 0x00
$ i2cset -y 1 0x20 0x10
$ i2cset -y 1 0x20 0x20
$ i2cset -y 1 0x20 0x40
$ i2cset -y 1 0x20 0x80

Listing 5

$ i2cset -y 1 0x20 0x0f
$ watch 'i2cget -y 1 0x20'

Damit kennen Sie nun eine erste Möglichkeit, um auf den I2C-Bus zuzugreifen. Die Kommandozeilen-Befehle lassen sich aus jeder Programmiersprache heraus aufrufen, sodass auch komplexeren I2C-Anwendungen nichts im Weg steht. Das Entwicklerherz schlägt allerdings erst dann wirklich hoch, wenn sich eine API für die eigene Lieblingssprache verwenden lässt.

I2C-Bus-Software

Um den Umfang des Artikels nicht zu sprengen, gehen wir an dieser Stelle lediglich auf die C- und Java-APIs ein. C kommt aufgrund seiner Nähe zum System oft bei Mikrocontroller-Enthusiasten zum Einsatz. Java steht für das genaue Gegenteil: Der Java-Programmierer will gar nichts von der Hardware wissen, die seine Programme ausführt. Also starten wir erst einmal mit C.

Unter C ist der Zugriff auf ein I2C-Gerät dem Zugriff auf eine Datei nachempfunden. Mit der Funktion wiringPiI2CSetup(Adresse) besorgen Sie sich zunächst einen Handle. Die Adresse steht hierbei für den Wert, den Ihnen die Ausgabe von i2cdetect liefert. Die wichtigsten Funktionsaufrufe finden Sie in der Tabelle “Basis-Funktionen in C”.

Basis-Funktionen in C

Funktion

Zweck

int wiringPiI2CRead(int handle)

einfaches Lesen

int wiringPiI2CWrite(int handle, int data)

einfaches Schreiben

int wiringPiI2CReadReg8(int fd, int reg)

Lesen von 8-Bit-Werten aus einem Register

int wiringPiI2CWriteReg8(int fd, int reg, int data)

Schreiben von 8-Bit-Werten in ein Register

int wiringPiI2CReadReg16(int fd, int reg)

Lesen von 16-Bit-Werten aus einem Register

int wiringPiI2CWriteReg16(int fd, int reg, int data)

Schreiben von 16-Bit-Werten in ein Register

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben