Raspberry PI: GPIOs mittels I2C Port Expander (MCP23017) erweitern
Mit dem Chip MCP23017 ist es sehr einfach möglich, eine Porterweiterung (Port Expander) des Raspberry Pi vorzunehmen. Dafür wird der I2C-Bus (Inter Integrated Circuit) des Raspberry Pi verwendet, um mit dem Baustein MCP23017 zu kommunizieren.
Setup
Komponenten | Beschreibung |
---|---|
Raspberry PI | Raspberry Pi 2 Model B v1.1 |
Betriebssystem | Raspbian Stretch |
Chip | MCP23017 |
Datenblatt | microchip.com/wwwproducts/en/MCP23017 (Documents) |
Software | fritzing.org |
Vorbereitung
Vor dem Einsatz sollte das System des Raspberry Pi aktualisiert werden. Dafür die folgenden Befehle eingeben:
apt-get update apt-get upgrade
Daraufhin die Verwendung von I2C in der Datei “/boot/config.txt” aktivieren (Zeile einfügen oder auskommentieren).
dtparam=i2c_arm=on
Als nächstes in der Datei “/etc/modules” zwei Module einfügen.
i2c-dev i2c-bcm2708
Bei neueren Pi Versionen müssen die Module noch aus der Blacklist Datei entfernt werden:
sudo vi /etc/modprobe.d/raspi-blacklist.conf
Vor den beiden Einträgen eine Raute (#) setzen.
#blacklist spi-bcm2708 #blacklist i2c-bcm2708
Damit der I2C Bus angesprochen werden kann, folgende Pakete installieren:
sudo apt-get install python-smbus i2c-tools
Anschließend den Pi neu starten.
Verkabeln
Der MCP23017 besitzt den folgenden Aufbau, wie auf dem Bild ersichtlich. Weitere Information können dem Datenblatt entnommen werden.
Um sich mit der Funktionsweise des MCP23017 vertraut zu machen, wurden 3 Dioden angeschlossen.
Folgende PINs sind belegt:
Pin (MCP23017) | Pin (Pi) |
---|---|
Pin 9 (VDD) | Pin 1 (Power 3.3V) |
Pin 10 (VSS) | Pin 30 (GND) |
Pin 12 (SCL) | Pin 5 (GPIO3 – SCL1) |
Pin 3 (SDA) | Pin 3 (GPIO3 – SDA1) |
Pin 18 (Reset) | Power 3.3V |
Pin 15 (A0) Pin 16 (A1) Pin 17 (A2) |
GND |
Aufbau
Testen
Die Adresse einen angeschlossenen I2C-Bausteins kann mit dem Programm “i2cdetect” geprüft werden:
sudo i2cdetect -y 1
Befehl | Beschreibung |
---|---|
ic2detect | Der Befehl aus i2c-tools zum “Auffinden” von I2C Peripherie |
-y | Parameter zum Ausführen ohne Nachfrage |
1 | Nummer des Busses; Die Nummer kann 1 oder 0 sein, je nachdem, ob der I2C0- oder I2C1-Port verwendet wird. |
Die Ausgabe des Befehls sollte sich so darstellen:
Werte schreiben
Nachdem die Baustein-Adresse ablesbar ist, kann jetzt mit dem Schreiben von Werten begonnen werden. Dafür müssen alle Pins der Bank A (GPA) als Ausgang deklariert werden:
i2cset -y 1 0x20 0x00 0x00
Es wird in jedes der 8 Bits eine “0” geschrieben. Eine 1 würde den entsprechenden Pin als Eingang deklarieren (Default). Daraufhin können einzelne Pins oder alle angesprochen werden. Danach können mit dem Befehl “i2cset” einzelne Pins geschaltet werden.
i2cset -y 1 0x20 0x14 0xff
Befehl | Beschreibung |
---|---|
i2cset | Der Befehl aus i2c-tools zum “Setzen” von Werten |
-y | Parameter zum Ausführen ohne Nachfrage |
1 | Bus Nummer |
0x20 | Bausteinadresse |
0x14 | Zeile (GPA = 0x14; GPB = 0x15) |
0xff | Der jeweilige Wert (Pin) in hexadezimal. In diesem Fall werden alle PINs gesetzt. |
Folgende PINs können je Bank (GPA/GPB) belegt werden:
Pin (Wert) |
Hex |
---|---|
7 | 0x80 |
6 | 0x40 |
5 | 0x20 |
4 | 0x10 |
3 | 0x08 |
2 | 0x04 |
1 | 0x02 |
0 | 0x01 |
all | 0xff |
off | 0x00 |
Wenn z.B. der PIN 0 und 2 gleichzeitig gesetzt werden soll, dann muss der Hex Wert 0x05 (Binär 101) vergeben werden.
0x01 + 0x04 = 0x05
Werte lesen
Zum Auslesen wir der Befehl “i2cget” verwendet.
i2cget -y 1 0x20 0x14
Befehl | Beschreibung |
---|---|
i2cget | Der Befehl aus i2c-tools zum “Auslesen”von Werten |
-y | Parameter zum Ausführen ohne Nachfrage |
1 | Bus Nummer |
0x20 | Adresse des Bauteils |
0x14 | Auszulesende Zeile |