V
Visla Hardware
Portal R&D
πŸ› οΈ R&D Visla β€” bring-up bench Β· 21 giugno 2026

XIAO nRF52840 + SIM7080 + Expansion Board

Nordic nRF52840 + modem SimCom SIM7080 (Cat-M/NB-IoT) su XIAO Expansion Β· bring-up incrementale + analisi consumi
βœ… Registrato Cat-M Voda IT πŸ”‹ 51 mA idle Β· picco 328 mA ⚑ auto-power PWRKEY 🧩 MCU del Visla Tag

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.

πŸ”§ Cablaggio & pinout
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").

50-51 mA
idle registrato (DRX) Β· 0.19 W Β· ~2.5 gg su 3000mAh
114 mA
picco TX periodico Β· solo 5% del tempo
328 mA
picco di attach (una-tantum) β†’ dimensiona alim/cap
+19 mA
delta del modem registrato vs baseline ~31 mA
Scomposizione (idle @3.8V)
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.

Quanto scende sul prodotto (Tag ottimizzato)
  • 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.

ScenarioConsumoAutonomia 3000mAhQuando
Picco TX~328 mAβ€”millisecondi, durante una trasmissione
πŸ”΄ Peggiore sostenuto (misurato)~78 mA~38 htutto acceso: live tracking h24
🟒 Reale prodotto (duty-cycle)~5-10 mA~2 settimanereport ~10 min: fix+TX poi sleep
Sleep profondo~Β΅Amesitra gli eventi: MCU 0.4Β΅A + modem PSM 3.2Β΅A + GPS off
πŸ”˜ Bottone D1 spegne l'OLED (setPowerSave): display ON ~78mA / OFF ~72mA β†’ l'OLED costa ~6 mA (pannello + bit-bang SW-I2C). Modem e GPS continuano. Sul prodotto l'OLED non c'Γ¨ β†’ il bottone diventa wake/SOS. Il duty-cycle (PSM + GPS + sleep) non lo misura il DPS (risoluzione mA) β†’ serve il PPK2 per il floor Β΅A.
πŸ”§
Bring-up
carrier: OLED + buzzer + button
πŸ“‘
Modem
SIM7080 UART + auto-power + reg
πŸ›°οΈ
GPS
MAX-M10S I2C (TODO)

Le fasi

Bring-up incrementale: un pezzo alla volta, misurando i consumi.

Bring-up Fase 1

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.

SSD1306buzzer A3button D1U8x8
21 giu 2026
Modem Fase 2

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.

UART D6/D7auto-power D2anti-sleepCat-M Voda IT
21 giu 2026
GPS Fase 3

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.

MAX-M10S2Β° UART D0SW I2C fix12 sat fix$GN
21 giu 2026

πŸ“Œ 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=0 per 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-cli core Seeeduino:nrf52, upload UF2 (no debugger).