DragonBoard GPIO-ports erweitern mit MCP23017-ESP und Windows 10 IoT Core

Die letzten Tage habe ich mit dem Versuch verbracht, mithilfe eines MCP23017-E/SP-Chips einem DragonBoard 410c zusätzliche 16 GPIO-Ports hinzuzufügen und diese über Windows 10 IoT Core zu steuern. Eigentlich nicht so schwer, wenn man die „kleinen“ Stolpersteine kennt.

Wiring MCP23017-E/SP & DragonBoard 410c

DragonBoard 410 & MCP23107 Pin Mappings
DragonBoard 410c Pin Mappings | mehr Infos

Die Verkabelung von DragonBoard und Port Expander ist relativ simpel, vor allem wenn nur ein einzelner MCP23017-Chip angeschlossen werden muss:

  • Verbinde SCL (12) Pin mit DragonBoard I2C0 SCL (15) Pin
  • Verbinde SDA (13) Pin mit DragonBoard SDA (17) Pin
  • Verbinde RESET (18) und VDD (9) mit DragonBoard 1.8V PWR (35) Pin
  • Verbinde A0, A1, A2 (15, 16, 17) und VSS (10) mit Ground / GND (1, 2, 39 or 40)

DragonBoard 410c & MCP23017 Breadboard Wiring
Die MCP23017 Chips von Amazon sind an sich OK, die Sockel hielten allerdings nur schlecht auf meinem Breadboard, sodass ich auch keine Verbindung bekam. Bessere Sockel erkennt man an den runden Pins (wie diese z.B.), mit denen dann auch die Verbindung stabil war.

Verbindung mit Windows 10 IoT Core zu MCP23017-E/SP via I2C herstellen

Der „Windows.Devices.I2c“ Namespace nimmt einem bereits viel Arbeit bei der Herstellung einer Verbindung via I2C ab. Wie das beispielsweise aussehen kann zeigt dieses Code-Beispiel von Microsoft. Allerdings ist es meist nicht ganz so einfach.

Fast alle Tutorials die man zu Windows 10 IoT Core und I2C-Kommunikation findet beziehen sich auf ein Setup mit Raspberry Pi-Geräten. Diese versorgen den Expander-Chip mit 3.3V, das DragonBoard kann allerdings nur mit 1.8V arbeiten. An sich kein Problem, da der MCP23017 prinzipiell mit 1.8V – 5.5V funktioniert.

ABER

Es ist nicht möglich, bei 1.8V mit I2cBusSpeed.FastMode (400kHz) zu arbeiten. Stattdessen muss hier I2CBusSpeed.StandardMode (100 kHz) verwendet werden, da man sonst den Fehler „Slave address was not acknowledged.“ erhält, der alles und nichts sagt.

Wichtig ist auch, den Chip richtig zu adressieren. Das r/w-bit wird am Ende weggelassen, sodass man eine die 7-bit Adresse 0x20 erhält (sofern die Adress-Ports a0, a1 & a2 geerdet sind).

Mit MCP23017 produktiv arbeiten

Bei den Recherchen zum MCP23017-Chip bin ich auf eine sehr praktische Helper-Bibliothek für Raspberry Pi von Michael Hacker gestoßen, die ich geringfügig für das DragonBoard angepasst habe. Diese nimmt einem nochmal einiges an Arbeit zu Initialisierung des Chips ab. Außerdem kann man so statt anstatt von Hex-Adressen mit schönen Konstanten und Enums arbeiten.

Beispielsweise lässt sich damit so in wenigen Zeilen eine LED am GPB0-Port steuern:

private MCP23017 i2cPortExpanderClient = new MCP23017("I2C0");
await i2cPortExpanderClient.Init();
i2cPortExpanderClient.SetDriveMode(MCP23017.Pin.GPB0, MCP23017.PinMode.Ouput);
i2cPortExpanderClient.Write(MCP23017.Pin.GPB0, MCP23017.PinValue.High);
i2cPortExpanderClient.Write(MCP23017.Pin.GPB0, MCP23017.PinValue.Low);

Veröffentlicht von

Thomas

Developer, Microsoft Azure MVP

Kommentar verfassen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.