Retour

Démo multi-protocole Pico : Serial, I2C, SPI et ADC sur RP2040

Introduction

Bienvenue dans la Démo multi-protocole Pico ! Dans ce tutoriel, nous allons explorer comment utiliser le Raspberry Pi Pico (RP2040) pour communiquer via plusieurs protocoles simultanément : Serial, I2C, SPI et ADC. Il s’agit d’un exemple avancé qui rassemble plusieurs compétences clés pour le développement embarqué. Nous allons construire le circuit dans le simulateur Velxio, écrire le code, et parcourir chaque étape en détail.

Schéma du circuit pico-multi-protocole sur le canevas du simulateur Velxio

Présentation du circuit

Examinons les composants et le câblage. Le circuit utilise un Raspberry Pi Pico (Nano RP2040 Connect) et plusieurs périphériques :

Toutes les LEDs partagent une masse commune. Le potentiomètre est alimenté par le rail 3,3 V. Le câblage est simple, mais notez que nous utilisons les périphériques I2C et SPI intégrés du Pico (bien que non représentés explicitement dans le schéma, le code suppose qu’ils sont disponibles sur les broches par défaut).

Analyse du code

Le code est écrit en Arduino C++ et utilise les bibliothèques Wire et SPI. Détaillons-le section par section.

Configuration

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

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

Nous commençons par initialiser la LED intégrée et le Serial à 115200 bauds. Le délai laisse le temps au moniteur série de se connecter.

1. Scanner I2C

  Wire.begin();
  Serial.println("[I2C] Scanning bus...");
  int found = 0;
  for (byte addr = 1; addr < 127; addr++) {
    Wire.beginTransmission(addr);
    if (Wire.endTransmission() == 0) {
      found++;
      Serial.print("  Found device at 0x");
      if (addr < 16) Serial.print('0');
      Serial.println(addr, HEX);
    }
  }
  Serial.print("  Total devices: "); Serial.println(found);
  Serial.println();

Ceci scanne toutes les adresses I2C possibles (1-126) et signale celles qui accusent réception. Dans le simulateur, vous pouvez voir des périphériques virtuels aux adresses comme 0x50 (EEPROM) et 0x68 (RTC).

2. Lecture/Écriture EEPROM I2C

  Serial.println("[I2C] EEPROM test at 0x50...");
  Wire.beginTransmission(0x50);
  Wire.write(0x00); // register 0
  Wire.write(0x42); // data
  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("  Wrote 0x42, Read 0x");
    Serial.print(val, HEX);
    Serial.println(val == 0x42 ? " — OK" : " — FAIL");
  }
  Serial.println();

Nous écrivons la valeur 0x42 dans le registre 0 de l’EEPROM à l’adresse 0x50, puis nous la relisons pour vérifier. Cela teste les opérations de base de lecture/écriture I2C.

3. RTC I2C

  Serial.println("[I2C] Reading DS1307 RTC at 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 responded OK");
  }
  Serial.println();

Ici, nous tentons de lire les registres de temps d’un RTC DS1307 à l’adresse 0x68. Le code lit trois octets (secondes, minutes, heures) mais vérifie seulement si le périphérique a répondu.

4. Boucle de retour SPI

  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();

Ceci effectue une simple boucle de retour SPI : il envoie 0xAB et lit ce qui est reçu. Dans le simulateur, MISO et MOSI ne sont pas connectés en externe, donc la valeur reçue peut être 0xFF ou autre chose. Cela teste le matériel SPI.

5. ADC

  Serial.println("[ADC] Reading analog channels...");
  analogReadResolution(12);
  int a0 = analogRead(A0);
  Serial.print("  A0 (GP26): "); Serial.println(a0);
  Serial.println();

Nous réglons la résolution de l’ADC sur 12 bits et lisons la valeur de A0 (GP26). La tension du curseur du potentiomètre est lue, donnant une valeur entre 0 et 4095.

6. Clignotement GPIO

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

  Serial.println("=== All protocol tests complete ===");
}

Enfin, nous faisons clignoter la LED intégrée trois fois pour indiquer que la configuration est terminée.

Boucle principale

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

La boucle affiche un message de pulsation toutes les 3 secondes pour montrer que le programme est toujours en cours d’exécution.

Concepts clés

Pièges courants et conseils de débogage

Extensions suggérées

Essayez par vous-même !

Prêt à expérimenter ? Ouvrez l’exemple en direct dans Velxio et lancez la simulation. Vous pouvez modifier le code, ajouter des composants et voir les résultats instantanément.

Lancer la Démo multi-protocole Pico sur Velxio

Barre d'outils de l'éditeur Velxio avec les commandes de compilation et d'exécution

Barre d'outils du canevas Velxio au-dessus de la fenêtre de simulation

Fenêtre modale de sélection de composants Velxio parcourant les pièces par catégorie

Bon bricolage !


Partager sur :
David Montero

Écrit par

David Montero

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

GitHub velxio.dev

Articles liés


Article précédent
Velxio vs Wokwi, Tinkercad, Proteus et Fritzing : une comparaison honnête
Article suivant
Lire des capteurs analogiques sur Raspberry Pi Pico avec Velxio