Startseite>I2C-Reichweite steigern mit dem P82B715
Aus Raspberry Pi Geek 02/2017

I2C-Reichweite steigern mit dem P82B715

© Alexey Zarodov, 123RF

Fernverkehr

Martin Mohr

Zwar wurde I2C eigentlich für die interne Gerätekommunikation konzipiert, doch mithilfe geeigneter Extender-Bausteine überbrückt der Bus Distanzen bis zu 100 Metern.

Was beim I2C-Bus im Kleinen gut klappt, eignet sich nicht für die Fernkommunikation. Die begrenzte Reichweite des Busses liegt unter anderem daran, dass die maximale Kapazität mit allen Komponenten nicht mehr als 400 Picofarad betragen darf. Je nach Qualität der verwendeten Leitungen entsprechen diese 400 pF nur einigen Metern – das Verhalten langer elektrischen Leitungen ähnelt bekanntlich jenem von Kondensatoren: Zwischen parallel verlaufenden Leitungen baut sich immer ein elektrisches Feld auf, das wie ein kleiner Kondensator wirkt.

Die sogenannte Eigenkapazität der Leitung fällt nicht besonders hoch aus, steigt aber mit der Länge des Kabels stetig an. Übertragen Sie nun Signale über eine solche Leitung, kommt es im ungünstigen Fall zum kompletten Auslöschen der Signale. Der Baustein P82B715 verringert die Kapazität, die eine Leitung auf dem Bus verursacht, um den Faktor 10. Verwenden Sie hochwertige Leitungen mit einer geringen Eigenkapazität, holen Sie sogar noch etwas mehr Reichweite heraus. Senken Sie dann zusätzlich die Geschwindigkeit der Datenübertragung etwas ab, bekommen Sie wieder einige Meter mehr Reichweite geschenkt.

P82B715

Beim P82B715 handelt es sich um einen sogenannten I2C-Bus-Extender, was bedeuten soll, dass er sich dazu eignet, die Reichweite des Busses zu erweitern. Er kommt in einem für Bastler einfach zu handhabenden DIL8-Gehäuse. Abbildung 1 zeigt die Pinbelegung des Bausteins. Die folgende kleine Eselsbrücke hilft Ihnen unter Umständen, die Anschlüsse nicht zu verwechseln: Sx und Sy schließen Sie an den vorhandenen seriellen Bus an; Lx und Ly sind für die Leitung vorgesehen.

Abbildung 1: Da der P82B715 in der Regel in einem kompakten Gehäuse daherkommt, fällt es leicht, den Baustein in eigene Projekte zu integrieren.

Abbildung 1: Da der P82B715 in der Regel in einem kompakten Gehäuse daherkommt, fällt es leicht, den Baustein in eigene Projekte zu integrieren.

Die zwei entsprechenden Buffer weisen denselben Aufbau auf – es ist daher gleichgültig, welchen von beiden Sie für Daten- (SDA) und Taktleitung (SCL) verwenden. Der P82B715 eignet sich für den Einsatz mit vielen seriellen Bussen und beschränkt sich keineswegs ausschließlich auf den I2C-Bus. Daher reicht seine Betriebsspannung von 3 bis 12 Volt, er unterstützt Busse mit bis zu 400 kHz Taktrate. Weitere Informationen finden sich auf den 23 Seiten des P82B715-Datenblatts [1].

Erste Versuche

Zunächst einmal benötigen Sie einen kleinen Testaufbau, mit dem Sie überprüfen, ob der I2C-Bus fehlerfrei arbeitet. In Teil 10 dieser Reihe [2] finden Sie eine entsprechende Vorlage – das Setup kommt in diesem Teil des Workshops wieder zum Einsatz.

Die Hardware, mit der Sie leicht prüfen, ob der I2C-Bus fehlerfrei arbeitet, besteht aus zwei PCA8574-Bausteinen (Abbildung 2). Wir haben die zwei Chips mit böser Absicht auf zwei Breadboards verteilt: So können wir später zum Testen des P82B715 rund 100 Meter Kabel zwischen die zwei Platinen schalten.

Abbildung 2: Ein erster Testaufbau beschränkt sich auf zwei Breadboards.

Abbildung 2: Ein erster Testaufbau beschränkt sich auf zwei Breadboards.

Abbildung 3 zeigt den dazugehörigen Schaltplan, den Sie auf der Heft-DVD im gEDA-Format finden. Die zwei PCA8574-Bausteine erhalten die I2C-Adressen 0x20 und 0x21. Ein Baustein arbeitet im Input-Betrieb, der andere übernimmt die Ausgabe. Auf dem Ausgabebaustein lassen wir über ein kleines Programm ein einfaches Lauflicht ausgeben.

Abbildung 3: Der Schaltplan zum Testaufbau aus Abbildung 2.

Abbildung 3: Der Schaltplan zum Testaufbau aus Abbildung 2.

Bevor es ans Programmieren geht, sehen wir noch kurz mit I2cdetect auf dem Bus nach, ob sich unsere zwei PCA8574 auch ordentlich melden (Listing 1). Ist das nicht der Fall, müssen Sie den Hardware-Aufbau noch einmal überprüfen. Wir gehen im Folgenden davon aus, dass die Grundschaltung fehlerfrei arbeitet.

Listing 1

 

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

Unser Testprogramm liest den Wert vom Input-Baustein und gibt ihn zur Kontrolle auch auf der Konsole aus (Listing 2). Um für etwas Abwechslung zu sorgen, verwenden wir in diesem Teil des Workshops weder Java noch C, sondern ein schlichtes Bash-Skript. Es startet mit einer Endlosschleife für unser Lauflicht. Danach folgen zwei Schleifen: Die erste For-Schleife zählt hoch, die zweite wieder herunter. Um das Testskript zu beenden, müssen Sie es durch einen Druck auf [Strg]+[C] abbrechen.

Listing 2

 

#!/bin/bash
while [ 1 ]; do
  for((i=1; i<256; i=i*2)); do
    k=$(expr 255 - $i);
    i2cset -y 1 0x20 $k;
    i2cget -y 1 0x21;
    sleep 0.5;
  done
  for((i=64; i>1; i=i/2)); do
    k=$(expr 255 - $i);
    i2cset -y 1 0x20 $k;
    i2cget -y 1 0x21;
    sleep 0.5 ;
  done
done

In der Variablen k stecken die invertierten Werte der Zähler, da wir die Ausgänge des PCA8574 invertiert betreiben. Der Grund dafür wurde schon ausgiebig in Teil 8 dieser Reihe besprochen. Die Befehle i2cset und i2cget übertragen die Werte von den entsprechenden Halbleitern. Mehr gibt es über das kleine Skript eigentlich nicht zu sagen – höchste Zeit für eine erste Versuchsreihe.

Lange Leitung …

Als Erstes überprüfen wir unseren Testaufbau über “normale” I2C-Distanzen, wo er fehlerfrei arbeiten sollte. Um das zu testen, starten wir unser Programm mit der in Abbildung 2 gezeigten Konfiguration. Als Ausgabe sehen Sie erwartungsgemäß den Wert, den Sie auf dem “Mäuseklavier” (dem DIP-Schalter) eingestellt haben (Listing 3). So weit klappt also alles problemlos.

Listing 3

 

$ bash test.bash
0x01
0x01
0x01
0x01
0x01
0x01^C

Bei unserem nächsten Versuch machen wir erst einmal alles falsch, was man so falsch machen kann: Wir hängen zwischen den Raspberry Pi und unseren Testaufbau 100 Meter Kabel (Abbildung 4). Hier steht zu erwarten, dass schlicht nichts mehr geht. Tatsächlich zeigt ein Test mit dem Tool I2cdetect, dass sich die PCA8574-Bausteine nicht einmal mehr am Bus melden (Listing 4). Wir können also getrost darauf verzichten, das Testprogramm zu starten: Es würde jetzt nur Fehlermeldungen auswerfen.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 5 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
€0,99 – Kaufen
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland