Skip to Content

Finde die Standardpins für I2C und SPI

Finde die Standardpins für I2C und SPI

In diesem Tutorial lernst du, wie du die Standard-/Hardware-Pins für die I2C- und SPI-Schnittstellen der vom Arduino IDE unterstützten Mikrocontroller findest, wie Arduino, ESP32 und ESP8266.

Viele externe Hardwaregeräte wie Displays oder Sensoren verwenden das I2C- oder SPI-Protokoll, um mit deinem Mikrocontroller zu kommunizieren. I2C ist ein Zwei-Draht-Protokoll, das die Signale SDA und SCL nutzt, und SPI ist ein Vier-Draht-Protokoll mit SS, MOSI, MISO, SCK.

I2C and SPI wiring
I2C- und SPI-Verkabelung (source)

Um ein I2C- oder SPI-Gerät mit deinem Mikrocontroller zu verbinden, musst du wissen, welche Pins an deinem Mikrocontroller die I2C (SDA, SCL) oder SPI (SS, MOSI, MISO, SCK) Pins sind.

I2C and SPI pins on Arduino Uno
I2C- und SPI-Pins beim Arduino Uno

Bei den gängigeren Entwicklungsboards wie den meisten Arduino-Boards sind diese Pins meist gut dokumentiert, leicht zu finden oder auf dem Board beschriftet. Bei exotischeren, älteren oder Klon-Boards, besonders aus der ESP8266- und ESP32-Familie, fehlt oft die Dokumentation.

I2C- und SPI-Standardpins ausgeben

Solange du dein Board (oder ein kompatibles Board) im Board Manager findest, gibt es eine einfache Möglichkeit, die Standardpins für die I2C- und SPI-Schnittstellen auszugeben. Der Screenshot unten zeigt, wie man den Arduino Uno im Board Manager auswählt und welche anderen Arduino-Boards verfügbar sind:

Board Manager in Arduino IDE
Board Manager in der Arduino IDE

Nachdem du dein Board ausgewählt hast, kannst du den folgenden Code ausführen. Er nutzt die Konstanten für diese Pins, die für alle/fast alle Entwicklungsboards definiert sind, um sie auf dem Serial Monitor auszudrucken.

void print(const char* name, int pin) {
  Serial.print(name);
  Serial.println(pin);
}

void setup() {
  Serial.begin(9600);
}

void loop() {
  print("LED:  ", LED_BUILTIN);

  print("SDA:  ", SDA);
  print("SCL:  ", SCL);

  print("SS:   ", SS);
  print("MOSI: ", MOSI);
  print("MISO: ", MISO);
  print("SCK:  ", SCK);

  delay(5000);
}

Achte nur darauf, die richtige Baudrate für deinen Serial Monitor einzustellen. Diese kann je nach ausgewähltem Board variieren. Andere Baudraten als 9600 sind ebenfalls möglich, aber die Baudrate im Code (Serial.begin()) und im Serial Monitor müssen übereinstimmen, sonst siehst du nur Kauderwelsch.

Set baud rate for Serial Monitor
Baudrate (9600) für Serial Monitor einstellen

Wenn du den obigen Code auf einem Arduino Uno hochlädst und ausführst, solltest du folgende Ausgabe im Serial Monitor sehen:

I2C and SPI default pins printed to Serial Monitor
I2C- und SPI-Standardpins im Serial Monitor ausgegeben

Die Pin-Definitionen findest du in der pins_arduino.h Datei für Standard-Arduinos. Für Varianten wie Mega, Leonardo und andere schaue im Unterordner variants nach.

I2C und SPI für ESP32 und ESP8266

Der obige Code funktioniert genauso für die meisten ESP32- oder ESP8266-Boards, aber du musst zuerst den ESP32- oder ESP8266-Core installiert haben. Schau dir unser Tutorial zu How to Program ESP32 with Arduino ID an, falls du Probleme bei der Installation des ESP32-Cores hast.

Die Installation des ESP8266-Cores funktioniert genauso. Wenn du Hilfe brauchst, schau dir das Game of Life on a Dot Matrix Display with MAX7219 Tutorial an, in dem ich detailliert erkläre, wie man den ESP8266-Core installiert.

Für jeden Boardtyp gibt es unterschiedliche Pin-Definitionen in der Datei pins_arduino.h. Die verschiedenen Boardtypen sind in einem Unterordner namens „variants“ organisiert. Siehe ESP32 board variants und das ESP8266 board variants. Der Screenshot unten zeigt die Ordnerstruktur mit dem variants Ordner für die ESP32-Boards:

GitHub Repo with ESP32 variants
GitHub-Repo mit ESP32-Varianten (source)

Jeder der boardspezifischen Unterordner enthält eine pins_arduino.h Datei. Zum Beispiel hier die pins_arduino.h für den Standard-ESP32 und hier die pins_arduino.h für das WEMOS LOLIN32 lite – ein Board, das ich häufig verwende.

Beachte, dass dies die Standard-Pin-Definitionen sind und du bei den meisten ESP32- und ESP8266-Boards die Pins für I2C und SPI ändern kannst. Je nach Board können einige Definitionen fehlen oder es gibt zusätzliche Definitionen, z.B. A0, A1 für analoge Eingänge oder TX und RX für die serielle Schnittstelle.

Fazit

Ich hoffe, dieser kleine Code-Schnipsel ist nützlich für dich, und wenn du Fragen hast, zögere nicht zu fragen.

Viel Spaß beim Tüfteln ; )