Raspberry Pi multiple I2C bus
Der I2C Bus ist eigentlich dafür gedacht, via SDA und SCL mehrere Devices (zum Beispiel Sensoren) anzusteuern. Kommt es allerdings dazu, dass zum Beispiel ein Device verwendet wird, dessen Device Adresse sich nicht via Jumper ändern lässt und man keinen Multiplexer (Hardware) verwenden möchte, so kann man einen oder mehrere I2C Busse am Raspberry Pi aktivieren. Dafür werden einfach weitere GPIO Pins als SDA / SCL zusammen als Bus definiert. Das Ganze wird in der Datei /boot/config.txt
konfiguriert.
Der Standard Bus hat die Nummer 1. Will man einen Zweiten Bus hinzufügen muss dieser die Bus ID 4 bekommen, der Dritte dann die 3. Man darf niemals den Bus 0 und 2 verwenden!
Sollten noch weitere Busse benötigt werden können diese die Nummern 7, 6 und 5 bekommen! Immer mit dem höchsten beginnen!
Konfiguration 2ter Bus
Hier nun ein Beispiel wie man einen weiteren Bus hinzufügt. Aber zuerst, falls noch nicht geschehen, aktivieren wir den i2c Bus:
raspi-config nonint do_i2c 0
nun können wir einen ersten Test wagen um zu schauen ob wir einen Bus angezeigt bekommen:
i2cdetect -l
sollte dann diese Ausgabe ergeben:
i2c-1 i2c bcm2835 (i2c@7e804000) I2C adapter
Nun fügen wir mittels /boot/config.txt
einen 2ten I2C Bus (ID 4) hinzu, der die beiden GPIO Pins 17 (als SDA) und 27 (als SCL) mappt. Einfach unterhalb von dtparam=i2c_arm=on
die Zeile einfügen:
/boot/config.txt
dtoverlay=i2c-gpio,bus=4,i2c_gpio_sda=17,i2c_gpio_scl=27
dann den Raspberry Pi Neustarten:
reboot
Nach dem Neustart können wir testen ob der neue Bus (4) verfügbar ist:
i2cdetect -l
nun sollten wir zwei sehen:
i2c-1 i2c bcm2835 (i2c@7e804000) I2C adapter i2c-4 i2c 4.i2c I2C adapter
hat man nun an beiden Bussen Devices angeschlossen kann man deren Adresse auslesen:
#für Bus 1:
i2cdetect -y 1
#für Bus 4:
i2cdetect -y 4
nun sollte man bei beiden in etwa so etwas sehen (Device Adresse hier wäre die 23):
0 1 2 3 4 5 6 7 8 9 a b c d e f00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- 23 -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
Konfiguration weiterer Busse
Nun kann man das obige Beispiel einfach erweitern. Zum Beispiel:
/boot/config.txt
dtoverlay=i2c-gpio,bus=7,i2c_gpio_sda=10,i2c_gpio_scl=9 dtoverlay=i2c-gpio,bus=6,i2c_gpio_sda=19,i2c_gpio_scl=26 dtoverlay=i2c-gpio,bus=5,i2c_gpio_sda=16,i2c_gpio_scl=20 dtoverlay=i2c-gpio,bus=4,i2c_gpio_sda=17,i2c_gpio_scl=27 dtoverlay=i2c-gpio,bus=3,i2c_gpio_sda=23,i2c_gpio_scl=24
Folgendes wird hier gemappt:
BUS ID | SDA | SCL |
---|---|---|
7 | GPIO10 | GPIO9 |
6 | GPIO19 | GPIO26 |
5 | GPIO16 | GPIO20 |
4 | GPIO17 | GPIO27 |
3 | GPIO23 | GPIO24 |
nun können wir nach einem Neustart prüfen ob die Busse da sind:
i2cdetect -l
bringt dann folgendes Ergebnis:
i2c-3 i2c 3.i2c I2C adapter i2c-1 i2c bcm2835 (i2c@7e804000) I2C adapter i2c-6 i2c 6.i2c I2C adapter i2c-4 i2c 4.i2c I2C adapter i2c-7 i2c 7.i2c I2C adapter i2c-5 i2c 5.i2c I2C adapter
Auslesen Multipler Busse via Adafruit
Hat man vor die Sensoren via Adafruit Circuit Python Libraries auszulesen wird man schnell merken dass diese nur den Standard I2C Bus auslesen können. Mit diesem kleinen Workaround macht man auch die Adafruit Libraries für die anderen Busse verfügbar. Dafür muss man die Datei pin.py
um die neuen Busse ergänzen. Die Datei findet man bei globaler Installation hier:
/usr/local/lib/python3.7/dist-packages/adafruit_blinka/microcontroller/bcm283x/pin.py
Bei einer User Installation der Library (pip3 install --user
) hier:
~/.local/lib/python3.7/site-packages/adafruit_blinka/microcontroller/bcm283x/pin.py
Am Ende der Datei findet sich ein Abschnitt mit i2cPorts = (
. diesen muss man um die neuen Busse ergänzen (hier Bus 3 und 4):
i2cPorts = (
# Modified system I2C config per /boot/config.txt
(4, 27, 17),
(3, 24, 23),
(3, SCL, SDA),
(1, SCL, SDA),
(0, D1, D0), # both pi 1 and pi 2 i2c ports!
)
Danach kann man ganz normal die Library verwenden:
- Raspberry Pi BME280 Luftdruck Sensor
- Raspberry Pi BH1750 Helligkeitssensor
- Raspberry Pi BMP280 Luftdruck Sensor
- Raspberry Pi BMP180 Luftdruck Sensor