XIAO nRF52840 + SIM7080 + Expansion Board
Cos'Γ¨
Mini-progetto di bring-up incrementale per validare il core del Visla Tag: si parte dall'MCU Nordic nRF52840 (XIAO + Expansion Board) e si aggiunge un pezzo alla volta β prima display/buzzer/button, poi il modem SIM7080, poi il GPS β misurando i consumi ad ogni passo. Niente PCB: tutto su dev-board, per capire a fondo prima di disegnare la scheda.
Il modem Γ¨ lo stesso SIM7080G della board winner LilyGO, ma qui pilotato da un Nordic (scelto come MCU del Tag per il miglior BLE low-power + Channel Sounding del nRF54L15). Obiettivo: un core riusabile MCU+modem+GPS+IMU per veicoli/animali/persone.
- MCU
- XIAO nRF52840
- Modem
- SIM7080 (Waveshare HAT)
- Carrier
- XIAO Expansion
- Modem UART
- D6=TX β RXD Β· D7=RX β TXD
- PWRKEY auto
- D2 β PWR (impulso 1Γ)
- Livello UART
- VCC β 3V3
- OLED
- SSD1306 I2C D4/D5 (0x3C)
- Buzzer / Button
- A3 / D1
- VBAT modem
- 3.8V (LiPo / DPS)
β οΈ VBAT modem dedicato (no rail 3V3 della XIAO): i burst TX ~330mA browni-out il rail condiviso. GND comune obbligatorio.
π Analisi consumi β DPS-150 @3.8V, modem registrato Cat-M, always-on
Sistema completo: XIAO + OLED + Expansion + modem. PSM disabilitato (demo "sempre connesso").
- baseline XIAO + OLED + Expansion
- ~31 mA
- + modem registrato (idle-DRX)
- +19 mA
- subtotale (no GPS)
- ~51 mA
- + GPS MAX-M10S (tracking) + CPU SW-I2C
- +~27 mA
- π― TAG COMPLETO always-on
- ~78 mA
Di cui ~18 mA Γ¨ overhead del dev-board (boost+LED+buck dell'Expansion) β assente su PCB custom.
- PSM attivo: modem ~19mA β ~Β΅A tra i TX (datasheet 3.2Β΅A) β risparmio enorme
- No overhead Expansion (PCB custom): β18 mA
- OLED off / assente sul Tag: β5 mA
- nRF52840 deep-sleep tra eventi: 5mA β 0.4Β΅A
β con PSM + duty-cycle la media crolla a pochi mA = settimane/mesi. Il floor Β΅A serve il PPK2 (il DPS legge solo mA).
π Spettro scenari β dal peggiore al reale
I ~78mA sono il "tutto sempre acceso" (upper bound), NON il prodotto. L'autonomia vera la decide il duty-cycle.
| Scenario | Consumo | Autonomia 3000mAh | Quando |
|---|---|---|---|
| Picco TX | ~328 mA | β | millisecondi, durante una trasmissione |
| π΄ Peggiore sostenuto (misurato) | ~78 mA | ~38 h | tutto acceso: live tracking h24 |
| π’ Reale prodotto (duty-cycle) | ~5-10 mA | ~2 settimane | report ~10 min: fix+TX poi sleep |
| Sleep profondo | ~Β΅A | mesi | tra gli eventi: MCU 0.4Β΅A + modem PSM 3.2Β΅A + GPS off |
Le fasi
Bring-up incrementale: un pezzo alla volta, misurando i consumi.
Bring-up carrier β OLED + buzzer + button
βXIAO nRF52840 inserito nella Expansion Board: display OLED SSD1306 (I2C 0x3C, libreria U8x8), buzzer passivo su A3, pulsante su D1. Valida la carrier e la toolchain (arduino-cli + core Seeed nRF52, upload UF2). Base di tutto.
Integrazione modem SIM7080 (auto-power + registrazione)
βSIM7080 (Waveshare HAT) via UART hardware D6(TX)/D7(RX), VCC=3V3 come riferimento livello. Auto-power: impulso PWRKEY da D2 UNA volta in setup() (mai nel loop β no reboot loop). Anti-sleep (CSCLK/CPSMS/CEDRXS=0) per restare raggiungibile. OLED mostra Modem OK β segnale β REGISTRATO. Aggancia Vodafone IT Cat-M, segnale ~15/31.
GPS MAX-M10S (2Β° UART su D0)
βGPS u-blox MAX-M10S sul 2Β° UART hardware (UARTE1, RX=D0) @9600. Modem(UARTE0) + GPS(UARTE1) + OLED + USB tutti simultanei: 12 satelliti, fix, posizione reale. Gotcha risolto: UARTE1 e TWIM1(I2C) condividono l'instance 1 del nRF52840 β l'OLED spostato su SW I2C (bit-bang) per liberare il GPS. TinyGPS++ parsa il talker $GN nativo. GPS dedicato, NON il combo del modem.
π Lezioni di banco (21 giu 2026)
- PWRKEY Γ¨ un TOGGLE β l'auto-power va impulsato una volta sola in setup(), MAI nel loop. Pulsarlo "quando il modem non risponde" crea un reboot loop (lo spegne mentre cerca rete).
- Auto-power D2βPWRKEY Γ¨ fragile: se la MCU si resetta (brownout sul rail condiviso), al boot ripulsa il PWRKEY β spegne il modem β loop accoppiato MCUβmodem. Sicuro solo con alimentazione stiff (MCU non si resetta) o con un latch (flag in flash/RTC).
- Brownout UVLO: il picco TX (fino a 328mA) attraverso DPS + fili sottili + pinzetta fa crollare VBAT β il modem si resetta (compaiono i boot URC
RDY/+CPIN: READY/SMS Ready). Alzare la tensione (3.8β4.0V) non basta: Γ¨ un problema di impedenza di consegna sui transienti veloci. - Serve VBAT stiff: LiPo (ESR bassissima) o cap bulk 470-1000Β΅F su VBAT-GND vicino al modem. Una LiPo eroga i 328mA all'istante; il DPS attraverso i fili Γ¨ "soft" (loop lento). GND comune solido (una massa unica) β un GND scadente da solo causava i reset.
- Anti-sleep:
CSCLK=0 + CPSMS=0 + CEDRXS=0per tenere il modem raggiungibile via UART (altrimenti dopo la registrazione dorme e l'UART va muta). Per il prodotto Γ¨ l'opposto: PSM ON β autonomia. - nRF52 + USB Serial: per stampare debug su USB-CDC serve
#include <Adafruit_TinyUSB.h>(le sketch con solo OLED+Serial1 non lo richiedono). Toolchain:arduino-clicoreSeeeduino:nrf52, upload UF2 (no debugger).