Zurück

Pico Multi-Protocol Demo: Serielle, I2C-, SPI- und ADC-Kommunikation auf dem RP2040

Einleitung

Willkommen zur Pico Multi-Protocol Demo! In diesem Tutorial erkunden wir, wie man den Raspberry Pi Pico (RP2040) nutzt, um gleichzeitig über mehrere Protokolle zu kommunizieren: Serielle Schnittstelle, I2C, SPI und ADC. Dies ist ein fortgeschrittenes Beispiel, das mehrere wichtige Fähigkeiten für die eingebettete Entwicklung zusammenbringt. Wir bauen die Schaltung im Velxio-Simulator auf, schreiben den Code und gehen jeden Schritt im Detail durch.

Schaltplan der Pico-Multi-Protocol-Demo auf der Velxio-Simulator-Leinwand

Schaltungsaufbau

Schauen wir uns die Komponenten und die Verdrahtung an. Die Schaltung verwendet einen Raspberry Pi Pico (Nano RP2040 Connect) und mehrere Peripheriegeräte:

Alle LEDs teilen sich eine gemeinsame Masse. Das Potentiometer wird von der 3,3V-Schiene versorgt. Die Verdrahtung ist unkompliziert, aber beachten Sie, dass wir die integrierten I2C- und SPI-Peripheriegeräte des Pico verwenden (obwohl sie im Schaltplan nicht explizit gezeigt werden, geht der Code davon aus, dass sie auf den Standard-Pins verfügbar sind).

Code-Analyse

Der Code ist in Arduino C++ geschrieben und verwendet die Bibliotheken Wire und SPI. Lassen Sie uns ihn Abschnitt für Abschnitt aufschlüsseln.

Setup

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
  delay(500);

  Serial.println("==============================");
  Serial.println(" Pico Multi-Protocol Demo");
  Serial.println("==============================");
  Serial.println();

Wir beginnen mit der Initialisierung der eingebauten LED und der seriellen Schnittstelle mit 115200 Baud. Die Verzögerung gibt dem seriellen Monitor Zeit, sich zu verbinden.

1. I2C-Scanner

  Wire.begin();
  Serial.println("[I2C] Scanne Bus...");
  int found = 0;
  for (byte addr = 1; addr < 127; addr++) {
    Wire.beginTransmission(addr);
    if (Wire.endTransmission() == 0) {
      found++;
      Serial.print("  Gerät gefunden bei 0x");
      if (addr < 16) Serial.print('0');
      Serial.println(addr, HEX);
    }
  }
  Serial.print("  Gesamtgeräte: "); Serial.println(found);
  Serial.println();

Dies scannt alle möglichen I2C-Adressen (1-126) und meldet alle, die quittieren. Im Simulator sehen Sie möglicherweise virtuelle Geräte an Adressen wie 0x50 (EEPROM) und 0x68 (RTC).

2. I2C-EEPROM-Lesen/Schreiben

  Serial.println("[I2C] EEPROM-Test bei 0x50...");
  Wire.beginTransmission(0x50);
  Wire.write(0x00); // Register 0
  Wire.write(0x42); // Daten
  Wire.endTransmission();
  delay(5);

  Wire.beginTransmission(0x50);
  Wire.write(0x00);
  Wire.endTransmission();
  Wire.requestFrom(0x50, 1);
  if (Wire.available()) {
    byte val = Wire.read();
    Serial.print("  Geschrieben 0x42, Gelesen 0x");
    Serial.print(val, HEX);
    Serial.println(val == 0x42 ? " — OK" : " — FEHLGESCHLAGEN");
  }
  Serial.println();

Wir schreiben den Wert 0x42 in Register 0 des EEPROMs an Adresse 0x50 und lesen ihn dann zurück, um dies zu überprüfen. Dies testet das grundlegende I2C-Lesen/Schreiben.

3. I2C-RTC

  Serial.println("[I2C] Lese DS1307 RTC bei 0x68...");
  Wire.beginTransmission(0x68);
  Wire.write(0x00);
  Wire.endTransmission();
  Wire.requestFrom(0x68, 3);
  if (Wire.available() >= 3) {
    byte sec = ((Wire.read() & 0x7F) >> 4) * 10 + (Wire.read() & 0x0F);
    byte min2 = Wire.read();
    (void)sec; (void)min2;
    Serial.println("  RTC hat geantwortet OK");
  }
  Serial.println();

Hier versuchen wir, die Zeitregister von einer DS1307 RTC an Adresse 0x68 zu lesen. Der Code liest drei Bytes (Sekunden, Minuten, Stunden), überprüft aber nur, ob das Gerät geantwortet hat.

4. SPI-Loopback

  Serial.println("[SPI] Loopback-Test...");
  SPI.begin();
  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
  byte tx = 0xAB;
  byte rx = SPI.transfer(tx);
  Serial.print("  TX: 0x"); Serial.print(tx, HEX);
  Serial.print("  RX: 0x"); Serial.println(rx, HEX);
  SPI.endTransaction();
  Serial.println();

Dies führt einen einfachen SPI-Loopback durch: Es sendet 0xAB und liest zurück, was empfangen wird. Im Simulator sind MISO und MOSI nicht extern verbunden, daher kann der empfangene Wert 0xFF oder etwas anderes sein. Dies testet die SPI-Hardware.

5. ADC

  Serial.println("[ADC] Lese analoge Kanäle...");
  analogReadResolution(12);
  int a0 = analogRead(A0);
  Serial.print("  A0 (GP26): "); Serial.println(a0);
  Serial.println();

Wir setzen die ADC-Auflösung auf 12 Bit und lesen den Wert von A0 (GP26). Die Schleiferspannung des Potentiometers wird gelesen, was einen Wert zwischen 0 und 4095 ergibt.

6. GPIO-Blinken

  Serial.println("[GPIO] Blinke LED...");
  for (int i = 0; i < 3; i++) {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(200);
    digitalWrite(LED_BUILTIN, LOW);
    delay(200);
  }
  Serial.println("  3 Blinks abgeschlossen");
  Serial.println();

  Serial.println("=== Alle Protokolltests abgeschlossen ===");
}

Schließlich lassen wir die eingebaute LED dreimal blinken, um anzuzeigen, dass das Setup abgeschlossen ist.

Loop

void loop() {
  // Heartbeat
  static unsigned long last = 0;
  if (millis() - last >= 3000) {
    last = millis();
    Serial.print("[Heartbeat] ");
    Serial.print(millis() / 1000);
    Serial.println("s");
  }
}

Die Schleife gibt alle 3 Sekunden eine Heartbeat-Nachricht aus, um zu zeigen, dass das Programm noch läuft.

Wichtige Konzepte

Häufige Fallstricke & Debugging-Tipps

Vorgeschlagene Erweiterungen

Probieren Sie es selbst aus!

Bereit zum Experimentieren? Öffnen Sie das Live-Beispiel in Velxio und führen Sie die Simulation aus. Sie können den Code ändern, Komponenten hinzufügen und die Ergebnisse sofort sehen.

Starten Sie die Pico Multi-Protocol Demo auf Velxio

Velxio-Editor-Symbolleiste mit Kompilieren- und Ausführen-Steuerelementen

Velxio-Leinwand-Symbolleiste über dem Simulations-Viewport

Velxio-Komponentenauswahl-Modal zum Durchsuchen von Teilen nach Kategorie

Viel Spaß beim Hacken!


Teilen auf:
David Montero

Geschrieben von

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

Ähnliche Artikel


Vorheriger Artikel
Velxio vs Wokwi, Tinkercad, Proteus und Fritzing: ein ehrlicher Vergleich
Nächster Artikel
Analoge Sensoren am Raspberry Pi Pico mit Velxio auslesen