Curiosity
Carrier board universale per la famiglia XIAO di Seeed (SKU 103030356, $16.40 / 10+: $11.50). Ospita qualsiasi XIAO ESP32/nRF52840/RP2040 e gli aggiunge in un colpo: OLED 0.96” SSD1306, RTC PCF8563 con backup CR1220, slot microSD, buzzer passivo (A3), user button (D1), pulsante RESET hw, SWD debug header, 5V servo connector e JST 2.0mm LiPo charging. Quattro connettori Grove pre-cablati (2× I2C, 1× UART, 1× A0/D0). Form factor “metà di Raspberry Pi 4” per prototipi tascabili. Compatibile con TUTTI gli XIAO TRANNE nRF54L15 e MG24 (footprint diverso). Sul bench Visla è la base default per esperimenti rapidi con periferiche I2C/UART senza saldare niente.
🗺️ Pinout map + dove cablare i Dupont
Pinout ufficiale Seeed (legenda colori in basso: Analog · Digital · IIC · UART · Power · GND · SPI):
Guida cablaggio Visla — dove infilare le 4 femmine Dupont per chain Qwiic I2C (3V3 + GND sulla strip superiore, D4/SDA + D5/SCL sulla strip inferiore — SWD header NO):
⚠️ Gotcha frequente: SWCLK/SWDIO sono pin debug SWD del chip XIAO, NON I2C. Se cabli SDA/SCL lì il bus I2C non vede il device esterno (vedi solo OLED 0x3C + RTC 0x51 onboard).
Specs tecniche
| Parametro | Valore |
|---|---|
| Seeed SKU | 103030356 |
| Prezzo | $16.40 (10+: $11.50) |
| Compatibilità XIAO | ESP32-S3 ✅ · ESP32-C3/C5/C6 ✅ · nRF52840 ✅ · RP2040/2350 ✅ · SAMD21 ✅ · MG24 ❌ · nRF54L15 ❌ |
| Display | OLED 0.96” SSD1306 128×64 I2C (addr 0x3C) |
| RTC | PCF8563T/5 I2C (addr 0x51) + backup CR1220 |
| Storage | microSD slot (SPI) |
| Buzzer | Passivo (PWM-driven) su A3/D3 |
| User button | D1 (active-LOW, pull-up esterna onboard) |
| Reset button | HW RESET su pin XIAO |
| SWD header | SWCLK + SWDIO + GND + RESET (male 2.54mm) |
| Power input | USB-C 5V · JST 2.0mm LiPo 3.7V |
| Charging current | Max 460 mA |
| PMIC | SY6974B (era ETA6003 fino al 2025-11-21) |
| Grove I2C × 2 | SDA=D4 (GPIO5 su S3), SCL=D5 (GPIO6 su S3) — bus condiviso con OLED + RTC |
| Grove UART × 1 | TX=D6, RX=D7 — è la HW UART1 del XIAO |
| Grove Analog × 1 | A0/D0 |
| Grove Button × 1 | D1 (collegato al pulsante onboard) |
| 5V servo header | 5V out per servomotori / sensori 5V |
| IP rating | IP40 (uso bench, non outdoor) |
| Dimensioni | ~½ Raspberry Pi 4 (compatto) |
| HSCODE | 8543909000 (CN) · 8543903500 (US) · 8471707000 (EU) |
| HW revisions | 2025-11-21 PMIC ETA6003 → SY6974B |
⚡ Consumi bench (2026-06-21, DPS-150)
Misurato con XIAO nRF52840 Sense + sketch demo (CPU in loop continuo, niente sleep — caso “tutto attivo”). USB-C staccata. Confronto 3V3 diretto (sistema puro, bypassa il PMIC) vs presa batteria JST 3.8V (drain reale via PMIC SY6974B):
| Stato | @3.3V diretto (sistema) | @3.8V batteria (via PMIC) |
|---|---|---|
| Display ON | 26.9 mA · 89 mW | 30.7 mA · 117 mW |
| Display OFF | — | 25.7 mA · 98 mW |
| → OLED (delta) | — | 5.0 mA · 19 mW |
Cosa emerge:
- OLED SSD1306 ≈ 5 mA (acceso, contenuto testo). Spegnerlo (
u8x8.setPowerSave(1)) risparmia ~5 mA → per un prodotto a batteria tienilo spento di default. - Sistema senza OLED ≈ 25.7 mA @3.8V: di cui il nRF52840 attivo è solo ~6 mA → restano ~18 mA di overhead dev-board.
🔍 Perché ~18 mA con OLED OFF? (dallo schematico Seeed) la board ha 3 convertitori + LED, tutti “comodità da dev board”:
| Sorgente | ~Consumo | Cosa |
|---|---|---|
Boost 5V ETA1038 (sempre acceso) | grosso | genera il rail 5V del servo header anche a vuoto → quiescent + switching loss |
| LED carica (lampeggia se “no battery”) | ~mA | col DPS come batteria finta il charger non vede LiPo valida → LED lampeggia |
Buck 3.3V ETA3410 (PMIC SY6974B, era ETA6003) | ~24% | perdita di conversione 3.8V→3.3V |
| Level shifter + pull-up Grove + RTC | ~1-2 mA | quiescent |
→ Sul PCB custom del Tag non metti il boost 5V (rail inutile), né il LED carica lampeggiante, né i level shifter Grove → questi ~18 mA spariscono. Riferimento prodotto = chip nudo 5.8 mA (vedi /tests/ nrf52840 mcu-active-idle), NON la Expansion. Schematico Seeed.
- Overhead PMIC ~24%: batteria 117 mW vs 89 mW del 3V3 diretto → efficienza SY6974B ~76% a basso carico. ⚠️ Per misure di consumo componenti usa il 3V3 diretto (pulito); per l’autonomia reale usa la presa batteria (include il PMIC).
- ⚠️ Questi NON sono numeri low-power: il demo tiene CPU+OLED sempre on. Tag vero = CPU deep-sleep + OLED off → floor µA (serve PPK2 per leggerli, il DPS si ferma a ~mA).
💡 Gotcha presa batteria: il PMIC col DPS come “batteria finta” può non abilitare il FET se non vede mai una USB (ship mode). Se a batteria legge 0 mA con tensione che regge → ri-inserisci bene il JST o sveglia con USB 1s. Polarità: verifica col multimetro (continuità del pin − verso un GND noto) prima di alimentare.
🧪 Note dal bench Visla
- ✅ Bench-tested 2026-06-04 (hello-OLED + button + buzzer): sketch
test-moduli/xiao-esp32s3-expansion-board/test-hello-oled/con U8g2 HW-I2C, button D1 active-LOW, buzzer passivo D3 contone()→ tutto OK al primo flash sia su XIAO ESP32-S3 (FQBNesp32:esp32:XIAO_ESP32S3) sia su XIAO ESP32-C6 (FQBNesp32:esp32:XIAO_ESP32C6). Pin-map XIAO D0–D10 è identica tra S3 e C6 → sketch portabile senza modifiche (gestiamo solo il label chip viaCONFIG_IDF_TARGET_*) - ✅ Plug-and-play assoluto: zero saldature, basta innestare il XIAO e attaccare Grove cables (Seeed kit SKU 110990036, $1.45). I2C SDA=D4 / SCL=D5 verificati con OLED SSD1306 0x3C
- ✅ I2C bus condiviso = molto utile: OLED (0x3C) + RTC (0x51) + qualsiasi Qwiic sensor (es. MAX-M10S 0x42, LSM6DS3 0x6A) coesistono tutti sullo stesso bus. Aggiungendo un Grove I2C Hub puoi avere 6+ device in parallelo
- ✅ Pin neri = passthrough pieno del XIAO: i 14 pin maschio sui due lati NON sono Grove, sono i pin del XIAO esposti tal-quali (D0–D10, GND, 3V3, 5V, USB+ev, SWD). Servono per cablare Dupont a qualsiasi modulo non-Grove (motor driver, NeoPixel strip, modulo SPI custom)
- ✅ Trick multi-UART su ESP32-S3/C6: anche se Seeed espone “solo 1 Grove UART” (D6/D7), l’ESP32 ha 3 UART hardware interne mappabili a qualsiasi GPIO via UART matrix. Esempio per modem + GPS contemporaneamente:
HardwareSerial modem(1); modem.begin(115200, SERIAL_8N1, D7, D6);sul Grove UART,HardwareSerial gps(2); gps.begin(9600, SERIAL_8N1, D9, D8);sui pin neri con Dupont - ✅ Scenario “all-in-one” Visla v2 bench (modem + GPS + display senza Dupont): A7670E breakout su Grove UART (D6/D7), MAX-M10S Qwiic su Grove I2C insieme a OLED+RTC, button D1, buzzer A3. Tutto simultaneo sul bus esistente perché MAX-M10S è I2C (0x42) e non occupa la UART
- ⚠️ L76K invece è UART-only: il L76K shield XIAO si attacca solo al Grove UART (occupa D6/D7), quindi NON puoi metterlo insieme al modem A7670E sullo stesso Expansion Board. Per quel setup serve MAX-M10S Qwiic
- ⚠️ Le 2 Grove I2C condividono lo stesso bus: non sono 2 bus separati, sono 2 connettori sullo stesso SDA/SCL. Utile per topologia daisy-chain ma indirizzi I2C devono restare unici
- ⚠️ nRF54L15 e MG24 NON compatibili: footprint XIAO leggermente diverso (B2B connector + pinout modificato). Per quei chip Seeed vende variants dedicati (Grove Base, ePaper Breakout)
- ⚠️ OLED soffre indoor estate: il GC9A01 è OLED organico, sopra +50°C va in fade. Per Visla v2 outdoor estate (oggetto in auto sotto sole) preferire ePaper o LCD reflective
- ⚠️ microSD usa pin SPI (D6-D10) che conflittano col Grove UART: NON puoi usare microSD + Grove UART contemporaneamente sullo stesso XIAO
⚠️ Gotchas
- I 2 Grove I2C sono lo STESSO bus, non bus indipendenti — gli indirizzi I2C devono restare unici
- microSD + Grove UART = conflitto pin (SPI MOSI/MISO/SCK = D10/D9/D8 + CS = D2 condividono con SPI bus dei pin neri; il Grove UART usa D6/D7 in modo isolato ma microSD CS=D2 conflitta col PIN_RST del L76K shield)
- Buzzer su A3 = D3 = GPIO4 (su XIAO S3) → conflitta col CS microSD su alcune board revisione vecchia. Verifica schematic se usi entrambi
- 5V servo header è 5V boost, non passa USB diretto — non superare 460 mA charging current
- Lotti pre-2025-11 hanno PMIC ETA6003 (charging termico più povero) → SY6974B nuovo è migliore
- Pin numbering: in Arduino usa
D0..D10(macros Seeed), NON i GPIO Espressif (es. su S3D4= GPIO5, su C6D4= GPIO22) - Acrylic Case SKU 110010024 ($3.20) è SOLO per Expansion Board base, non per Grove Base
- nRF54L15 Sense (nuovo lancio Seeed 2026) NON è compatibile — serve Grove Base separata