Viele Sensoren und Aktoren können über das I2C-Bussystem an einen Microcontroller oder einen Raspberry Pi angeschlossen werden. Beispiele sind:

  • der Beschleuingungs- und Gyrosensor SEN_MPU6050
  • der Farbsensor TCS34725
  • der Magnetfeld-Sensor HMC5883L

Die Datenübertragung läuft über zwei Leitungen, eine Datenleitung SDA und eine Taktleitung SCL.

Weitere Informationen sind z.B. hier zu finden:

Nutzung und Programmierung mit dem Raspberry Pi

I2C-Bausteine kann man am Raspi an folgende Pins anschließen:

  • Pin 3 SDA
  • Pin 5 SCL

Die erforderlichen Pullup-Widerstände sind bei diesen Pins intern bereits vorhanden. Mehrere Geräte können gleichzeitig an die beiden Pins angeschlossen werden, im nachfolgenden Schaltplan beispielsweise ein Gyrosensor MPU-6050 und ein Magnetfeldsensor HMC5883L.

Schaltplan I2C Raspi

Standardmäßig ist I2C beim Raspberry Pi deaktiviert. Man kann es in der Raspi-Konfiguration

sudo raspi-config

unter Interface Options - P5 I2C aktivieren oder deaktivieren. Aktiviert wird damit der I2C-Bus 1 an den Pins 3 und 5. Die zugehörige Device-Datei ist /dev/i2c-1

Über die i2c-tools, die in neueren Raspberry-Pi-OS-Installationen bereits vorhanden sind, kann man von der Kommandozeile mit dem I2C-Baustein kommunizieren:

Mit dem Befehl i2cdetect kann man rausfinden an welcher Adresse der Baustein liegt:

Man sich die installierten Busse auflisten lassen.

$ i2cdetect -l
i2c-1	i2c       	bcm2835 (i2c@7e804000)          	I2C adapter

Hier sieht man, dass der Bus 1 installiert ist.

Dann kann man auf diesem Bus nach Geräten suchen:

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

Dabei sorgt der Parameter -y dafür, dass keine weitere Rückfrages stattfindet. Die 1 steht für den zu scannenden Bus 1.

Im Ergebnis sieht man, dass der Baustein an Adresse 0x68 (hexadezimal) angeschlossen ist.

Mit dem Befehl i2cset kann man Daten an den Baustein senden und damit einen Wert in ein Register des Bausteins schreiben:

i2cset -y <busnummer> <Adresse des Bausteins> <Adresse des Registers des Bausteins> <Wert>

Dabei sind die Adressen der beschreibbaren Register und die Werte abhängig vom Typ des angeschlossenen Bausteins und können aus dem Datenblatt entnommen werden.

Umgekehrt kann man i2cget Daten vom Baustein lesen:

i2cget -y <busnummer> <Adresse des Bausteins> <Adresse des Registers des Bausteins>

Die Adresse des Registers und der zurückggebene Wert sind wiederum abhängig vom Typ des angeschlossenen Bausteins. Sie erhalten dann bespielsweise dei Messdaten eines Sensors.

I2C mit Python

Um I2C-Bausteine aus Python-Programmen heraus anzusprechen, nutzt man am besten die Bibliothek python-smbus, die bei aktuellem Raspberry Pi OS bereits installiert ist.

Mit folgenden Befehlen kann man dann Daten an den Baustein schicken bzw. Daten auslesen.

busnr = 1
bus = smbus.SMBus(busnr)

# Schreiben eines Werts in ein bestimmtes Register des Bausteins
bus.write_byte_data(i2c_addr, register, value)

# Lesen eines Werts aus einem bestimmten Regsiter des Bausteins
value = bus.read_byte_data(i2c_addr, register)

Weitere Infos hierzu in der smbus2-Dokumentation.

Oftmals gibt es für den jeweiligen Baustein schon entsprechende Bibliotheken oder Beispielprogramme. Hier hilft eine Suche

Pakete aus dem Pypi können über pip3 installiert und dann in eigenen Programmen genutzt werden. Oder man verwendet den jeweiligen Programmcode direkt in eigenen Programmen.

Nutzung und Programmierung mit dem ESP32 / MicroPython

Bei dem von mir genutzten ESP32-Board können ebenfalls I2C-Gräte angeschlossen werden:

  • I2C SDA an GPIO 21
  • I2C SCL an GPIO 22
  • VCC an 3V3
  • GND an GND

Die Programmierung von I2C unter Micropython ist hier beschrieben.

Nutzung und Programmierung mit dem Calliope Mini

Am Calliope Mini gibt es für I2C die Anschlüsse C18 und C19, einerseits über den Groove-Stecker zum anderen auch auf der unteren Pinleiste:

  • SDA: C18
  • SCL: C19

Für die Programmierung gibt es in Makecode unter Pins entsprechende Blöcke um I2C-Werte zu schreiben und zu lesen