MCP23017 I/O Port Expander

Im folgenden Artikel beschäftigen wir uns mit dem MCP23017 I/O Port Expander.

Einfache Arduino oder ESP8266 / ESP32 Mikroprozessoren besitzen in der Regel schon einige Ports, mit denen weitere Komponenten wie Sensoren, Aktoren oder Displays an den Mikroprozessor angeschlossen werden können. Für einfachere Projekte sind diese Ports in der Regel ausreichend. In manchen Fällen kann man aber auch an die Grenzen der Anschlussmöglichkeiten stoßen. In diesem Artikel zeige ich Dir den Port Expander Chip des -Typs MCP23017, mit dem über den I2C-Bus zusätzlich 16 I/O Ports je Expander geschaffen werden können. Über die Pins A0, A1 und A2 kann dem Chip eine eindeutige Adresse vergeben werden, sodass am I2C-Bus bis zu 8 Port-Expander angeschlossen werden können. Somit stehen bis zu 128 Ports an einem einfachen Arduino oder ESP8266 Mikrocontroller zur Verfügung.

Ich verwende für diesen Artikel die folgenden Bauteile oder Produkte:

Technische Daten

EigenschaftWert
Anzahl I/O-Ports16 (Input und Output)
I2C-Interface100 kHz, 400 kHz, 1.7 MHz
Betriebsspannung1.8 – 5.5 V
Anzahl Adressen am I2C-Bus8

Anschlüsse

Im folgenden Schema siehst Du die Anschlüsse des MCP23017 Port-Expanders.

Adressen des Port-Expanders

Über die Pins A0, A1 und A2 kann dem MCP23017 Port-Expander eine Hardware-Adresse vergeben werden. Über die Adresse kann der Expander dann später im I2C-Bus angesteuert werden.

A0A1A2Adresse
0000x20
1000x21
0100x22
1100x23
0000x24
1010x25
0110x26
1110x27

Bibliothek und Sketch in Arduino IDE

Für die Ansteuerung des MCP23017 Port-Expanders gibt es verschiedene Vorgehensweisen. Ich habe mich für den Einsatz der Adafruit MCP23017 Bibliothek entschieden. Mit der Bibliothek können die Ports des Port-Expanders ähnlich wie normale Ports angesteuert und verwendet werden. Für das bessere Verständnis der Verwendung der Bibliothek und der Programmierung, möchte ich hier nun ein kleines Beispiel mit zwei MCP23017 Port-Expandern zeigen.

Im ersten Schritt müssen wir nun die hier gezeigte Bibliothek über den Bibliotheksverwalter installieren. Ich habe hier Version 1.3.0 eingesetzt (Stand April 2021).

Beispiel Schaltung und Sketch

In der folgenden Schaltung zeige ich Dir eine Wechselblinker-Schaltung über zwei MCP23017 Port-Expander. Die beiden LEDs werden hier vereinfacht ohne Vorwiderstand direkt an den Pins GPB0 der beiden Port-Expandern angeschlossen. Der I2C-Bus wird an Port D2 und D1 angeschlossen. Die Module werden zudem mit 3V und GND vom Mikrocontroller versorgt.

#include <Wire.h>
#include "Adafruit_MCP23017.h"

Adafruit_MCP23017 mcp1;
Adafruit_MCP23017 mcp2;

// Timer-Variablen
long myTimer = 0;
long myTimeout = 100;

int ledState1 = LOW;
int ledState2 = HIGH;

const uint8_t mcp1_addr = 0; // Adresse 0x20 / 0
const uint8_t mcp2_addr = 1; // Adresse 0x21 / 1

void setup() {  
  mcp1.begin(mcp1_addr);
  mcp2.begin(mcp2_addr);

  mcp1.pinMode(8, OUTPUT); // GPB0 an mcp1 als Output definieren
  mcp2.pinMode(8, OUTPUT); // GPB0 an mcp2 als Output definieren
}

void loop() {
   if (millis() > myTimeout + myTimer ) {
    myTimer = millis();
 
    if (ledState1 == LOW) {
      ledState1 = HIGH;
    } else {
      ledState1 = LOW;
    }
     
    if (ledState2 == LOW) {
      ledState2 = HIGH;
    } else {
      ledState2 = LOW;
    }    
 
    mcp1.digitalWrite(8, ledState1);
    mcp2.digitalWrite(8, ledState2);
  }  
}

Matthias Korte

Hauptberuflich Software-Entwickler und seit einigen Jahren Smart-Home Fan. Angefangen hat alles mit einem RaspberryMatic und einer schaltbaren Steckdose. Mittlerweile habe ich einige Steckdosen, Sensoren, und Thermostate sowie ioBroker zur Visualisierung im Einsatz.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.