Introduzione
I2C (Inter-Integrated Circuit) è un popolare protocollo di comunicazione che permette ai microcontrollori di dialogare con sensori, display e altre periferiche usando solo due fili: SDA (dati) e SCL (clock). Ma quando si prototipa, spesso non si conosce l’indirizzo esatto di un nuovo dispositivo I2C. È qui che uno scanner I2C torna utile. Esplora ogni possibile indirizzo sul bus e segnala quali rispondono.
In questo tutorial, costruiremo uno scanner I2C per il Raspberry Pi Pico usando il simulatore in-browser Velxio. Imparerai come cablare un semplice circuito con due LED indicatori, scrivere il codice di scansione in Arduino C++ e interpretare i risultati. Nessun hardware necessario — solo il tuo browser!

Spiegazione del Circuito
Il nostro circuito è minimale ma istruttivo. Useremo due LED per fornire feedback visivo durante la scansione:
- LED blu (led-scan): Collegato a GP12 (D12 sul Pico) tramite un resistore limitatore di corrente (interno al componente LED). Il suo anodo (A) si collega a GP12 e il catodo (C) va a massa. Questo LED lampeggia ogni volta che lo scanner invia una condizione di start sul bus I2C.
- LED verde (led-found): Collegato a GP10 (D10). Il suo anodo va a GP10, il catodo a massa. Questo LED si accende ogni volta che un dispositivo viene trovato durante la scansione.
Entrambi i LED condividono una connessione di massa comune al pin GND.1 del Pico. Il bus I2C stesso utilizza i pin predefiniti: SDA = GP4 e SCL = GP5. Non sono necessari resistori di pull-up esterni perché i pull-up interni del Pico sono abilitati dalla libreria Wire.
Per costruire questo circuito in Velxio:
- Apri il selettore componenti dalla barra degli strumenti del canvas.

- Aggiungi una scheda Raspberry Pi Pico.
- Aggiungi due LED (blu e verde) dalla categoria Output.
- Collegali come descritto: GP12 → anodo LED blu, GP10 → anodo LED verde, entrambi i catodi → GND.
- Usa la barra degli strumenti del canvas per zoomare e disporre i componenti ordinatamente.

Spiegazione del Codice
Ora immergiamoci nel codice. Apri l’editor di codice in Velxio e incolla il seguente sketch:
// Raspberry Pi Pico — I2C Scanner
// Scans I2C bus (Wire / I2C0: SDA=GP4, SCL=GP5) for devices
#include <Wire.h>
void setup() {
Serial.begin(115200);
delay(500);
Wire.begin(); // SDA=GP4, SCL=GP5 by default on Pico
Serial.println("=== Pico I2C Scanner ===");
Serial.println("Default I2C0: SDA=GP4, SCL=GP5");
Serial.println();
}
void loop() {
Serial.println("Scanning I2C bus...");
int found = 0;
for (byte addr = 1; addr < 127; addr++) {
Wire.beginTransmission(addr);
byte error = Wire.endTransmission();
if (error == 0) {
found++;
Serial.print(" Device found at 0x");
if (addr < 16) Serial.print("0");
Serial.print(addr, HEX);
// Identify known addresses
switch (addr) {
case 0x48: Serial.print(" (Temperature sensor)"); break;
case 0x50: Serial.print(" (EEPROM)"); break;
case 0x68: Serial.print(" (DS1307 RTC)"); break;
case 0x27: Serial.print(" (LCD backpack)"); break;
case 0x3C: Serial.print(" (SSD1306 OLED)"); break;
default: break;
}
Serial.println();
}
}
Serial.print("Scan complete. Found ");
Serial.print(found);
Serial.println(" device(s).");
Serial.println();
delay(5000);
}
Come Funziona
Wire.begin()inizializza la periferica I2C sui pin predefiniti (GP4/GP5). Sul Pico, questo imposta I2C0.- Il ciclo
foritera attraverso tutti i possibili indirizzi a 7 bit da 1 a 127. L’indirizzo 0 è riservato per la chiamata generale, quindi lo saltiamo. - Per ogni indirizzo, chiamiamo
Wire.beginTransmission(addr)e poiWire.endTransmission(). Il valore restituito daendTransmission()è 0 se il dispositivo ha riconosciuto, o un codice di errore diverso da zero altrimenti. - Se un dispositivo risponde, stampiamo il suo indirizzo in formato esadecimale. Il codice include anche un’istruzione switch che etichetta alcuni indirizzi comuni (ad esempio, 0x3C per display OLED SSD1306).
- Il LED blu su GP12 si alterna ogni volta che un ciclo di scansione inizia (puoi aggiungere
digitalWrite(12, HIGH)edigitalWrite(12, LOW)intorno al ciclo di scansione per feedback visivo). Il LED verde su GP10 si accende quando un dispositivo viene trovato.
Per compilare ed eseguire, clicca sul pulsante compile nella barra degli strumenti dell’editor.

Concetti Chiave
- Protocollo I2C: Un bus di comunicazione seriale multi-master, multi-slave, a commutazione di pacchetti, single-ended. Ogni dispositivo ha un indirizzo unico.
- Libreria Wire: La libreria integrata di Arduino per la comunicazione I2C. Sul Pico, utilizza I2C0 per impostazione predefinita.
- Resistori di Pull-up: Le linee I2C necessitano di resistori di pull-up verso VCC. Il Pico ha pull-up interni che possono essere abilitati, ma per un funzionamento affidabile con molti dispositivi, si consigliano resistori esterni da 4,7kΩ.
- Indirizzamento: Gli indirizzi a 7 bit vanno da 0x01 a 0x7F (127). Alcuni indirizzi sono riservati (ad esempio, 0x00 per la chiamata generale).
Insidie Comuni e Suggerimenti per il Debug
- Nessun dispositivo trovato? Verifica che i tuoi dispositivi I2C siano alimentati e collegati correttamente. In simulazione, assicurati di aver aggiunto periferiche I2C virtuali (come un OLED o un sensore di temperatura) al circuito.
- Pin sbagliati? I pin predefiniti I2C0 del Pico sono GP4 (SDA) e GP5 (SCL). Se stai usando pin diversi, chiama
Wire.setSDA(pin)eWire.setSCL(pin)prima diWire.begin(). - Il Monitor Seriale non mostra output? Assicurati che il baud rate corrisponda (115200 nel nostro codice). In Velxio, apri il Monitor Seriale dalla barra degli strumenti.
- I LED non lampeggiano? Verifica il cablaggio: anodo al GPIO, catodo a GND. Controlla anche di aver impostato i pin come output in
setup()conpinMode(12, OUTPUT)epinMode(10, OUTPUT).
Estensioni Suggerite
- Aggiungi un dispositivo I2C reale: Posiziona un OLED SSD1306 o un sensore BMP280 sul canvas e vedi lo scanner rilevarlo.
- Scansiona più bus: Il Pico ha due periferiche I2C (I2C0 e I2C1). Modifica il codice per scansionare entrambi.
- Mostra i risultati su un LCD: Invece del Seriale, mostra gli indirizzi trovati su un LCD 16x2.
- Rilevamento e configurazione automatici: Una volta che conosci l’indirizzo di un dispositivo, inizializza automaticamente la sua libreria.
Provalo Tu Stesso!
Pronto a scansionare il bus I2C? Apri l’esempio live in Velxio e inizia a sperimentare:
Avvia lo Scanner I2C per Pico su Velxio
Niente download, niente saldatura — solo pura simulazione. Modifica il codice, aggiungi nuovi componenti e vedi i risultati istantaneamente. Buona scansione!