V
Visla Hardware
Portal R&D
🚗 R&D Visla — banco tracker veicolare

Vehicle Tracking — XIAO + SAM-M10Q + A7670E

Tracker veicolare: Nordic nRF52840 (XIAO + Expansion) + GPS u-blox SAM-M10Q + modem SimCom A7670E Cat-1 always-on, alimentato a LiPo
✅ MQTTS end-to-end → server ✅ A7670 registrato LTE Cat-1 🛰️ SAM-M10Q 9.9 mA 🔋 LiPo 1S 🚗 NON il Tag (always-on)

Configurazione di riferimento per rimontare il banco tracker veicolare in 2 minuti: chi va su quale pin + come si alimenta a batteria. A differenza del Tag (SIM7080 + PSM low-power), qui il modem è A7670E Cat-1 sempre attivo (always-on, alimentato dal veicolo/LiPo).

🔌 Configurazione A — pin map

SegnalePin XIAONote
GPS SAM-M10Q TXD0RX UARTE1 · GPS @9600 · output UBX NAV-PVT
GPS SAM-M10Q RXD10TX config UBX (CFG-VALSET al boot)
GPS VCC / GND3V3 / GND~10 mA, dalla XIAO
Modem A7670 TXD7RX Serial1 (UARTE0) · modem @115200
Modem A7670 RXD6TX Serial1
Modem PWRKEYD2impulso UNA volta in setup() — mai nel loop (reboot loop)
Modem VBATLiPo diretto3.4–4.2V · NON dal 3.3V dell'expansion (picchi 2A)
OLED SSD1306D5=SCL D4=SDA⚠️ SW I2C (bit-bang) — non HW, sennò collide con UARTE1/GPS
BottoneD1INPUT_PULLUP
BuzzerA3passivo
LED RGB onboardLED_BLUE/GREENactive LOW · blu=vivo, verde=fix

🔋 Alimentazione mobile — LiPo 1S (3.7V, ≥1000mAh)

Opzione Wago:                          Opzione cavi JST (più pulita):
  Wago ROSSO (3): LiPo+ ─ VBAT modem      LiPo (JST) → Y-parallelo JST-PH 2.0 ─┬→ Expansion (JST)
                        ─ +expansion                                          └→ pigtail → VBAT modem
  Wago NERO  (2): LiPo− ─ GND expansion
                  (GND modem già via cablaggio)   GPS: VCC→3V3 XIAO · GND→GND XIAO
+ Cap bulk 470–1000µF tra VBAT e GND del modem (vicino al modem)
  • Modem VBAT direttamente dalla LiPo (3.7V = range A7670): la LiPo eroga i picchi 2A, il regolatore 3.3V dell'expansion NO → senza, brown-out/reset.
  • GND comune solido (un nodo unico): LiPo− + expansion + modem.
  • Cap bulk sul VBAT modem: assorbe i transienti TX.
  • Carica LiPo: via Expansion Board (USB-C → carica sul JST, sicuro/automatico). Connettori: JST-PH 2.0.
  • Baud: GPS 9600 (default SAM), modem 115200.
  • ⚠️ Tagliando la LiPo: un filo alla volta, mai cortare + e − insieme.

📦 BOM

ComponenteParteRuolo
MCUXIAO nRF52840 (Seeed)Nordic, BLE, 2× UART, USB CDC
CarrierXIAO Expansion Boardcarica LiPo (BQ), OLED, JST-PH 2.0, buzzer, button
ModemSimCom A7670E (Waveshare HAT)LTE Cat-1, MQTTS nativo CMQTT
GPSu-blox SAM-M10QUART 9600, talker $GN, ~9.9 mA
DisplayOLED SSD1306 128×64SW-I2C (D5/D4)
AlimentazioneLiPo 1S (≥1000mAh)VBAT modem diretto + cap bulk; carica via USB-C
SIM1NCE (iot.1nce.net)connettività LTE

⌨️ Firmware

Arduino — core Seeed nRF52. arduino-cli FQBN Seeeduino:nrf52:xiaonRF52840Sense, upload UF2 (doppio-click RESET, no debugger). ⚠️ il core chiama python (non python3) → serve uno shim.

🛰️ mqtt-tracker v0

GitHub →

Tracker MQTTS nativo (port nRF52840 del firmware-mqtt-tracker-a7670 v2.3): AT raw su Serial1, stack CMQTT del modem + TLS Let's Encrypt. Batch store-and-forward: campiona il GPS ogni 5s in un ring buffer (600 punti, ~50 min) e pubblica visla/<IMEI>/pos in batch ogni 5s → {imei,battery,volt,rssi,batch:[{t,lat,lon,spd,sats,hdop}…]}. Durante i buchi di copertura accumula e svuota il backlog (max 20/invio) coi timestamp reali → percorso fedele. LWT offline + keepalive 30s per presence pulita. Verificato end-to-end: device 862608083899168 → broker TLS 8883 → positions:raw (fix Orvieto). Vedi registrazione device.

  • tag-bench — GPS + OLED + bottone + buzzer + modem (wake/registrazione) + debug batteria (Vbat + % carica). LED blu=vivo, verde=fix.GitHub →
  • modem-bridge — bridge USB↔Serial1 trasparente → configuri il modem via AT dal Mac attraverso la XIAO.GitHub →
  • battery-monitor — tool diagnostico lettura VBAT (divider 1M+0.51M, P0.31), % carica curva LiPo.GitHub →
  • gps-uart — solo lettore GPS (dump NMEA + LED).GitHub →

Modem A7670E verificato: CEREG: 0,5 (registrato roaming LTE), CSQ 27 (forte), sempre attivo (CSCLK=0).

🛰️ Configurazione GPS — gpsInit()

Al boot il firmware invia una serie di UBX CFG-VALSET (layer RAM|BBR) al SAM-M10Q sulla linea RX (D10). Va rimandato a ogni boot perché la BBR non persiste senza V_BCKP. L'output è UBX NAV-PVT (binario) al posto dell'NMEA → un solo messaggio con posizione + velocità + tempo + n.sat + accuracy orizzontale in metri (hacc). Helper cfgKey(key,val,vlen) costruisce il messaggio + checksum Fletcher.

Comando (chiave CFG)Key IDValCosa fa
CFG-NAVSPG-DYNMODEL0x201100214⭐ Dynamic model Automotive — filtro nav per veicolo (aderenza strada, meno deriva)
CFG-SIGNAL-GPS_ENA0x1031001F1Abilita GPS
CFG-SIGNAL-GAL_ENA0x103100211Abilita Galileo
CFG-SIGNAL-BDS_ENA0x103100221Abilita BeiDou (B1C)
CFG-SIGNAL-GLO_ENA0x103100251Abilita GLONASS
CFG-SIGNAL-SBAS_ENA0x103100201Abilita SBAS (EGNOS in EU)
CFG-SBAS-USE_DIFFCORR0x103600041Applica le correzioni differenziali EGNOS → +accuracy (~1-2 m)
CFG-SBAS-USE_RANGING0x103600031Usa i satelliti SBAS anche per il ranging
CFG-RATE-MEAS0x302100011000Rate misura = 1 Hz (200 = 5 Hz)
CFG-MSGOUT-UBX_NAV_PVT_UART10x209100071NAV-PVT ON — binario con pos+vel+tempo+sat+accuracy(m)
CFG-MSGOUT-NMEA_ID_GGA/RMC/GSV/GSA/GLL/VTG/ZDA_UART10x2091 00BB/00AC/00C5/00C0/00CA/00B1/00D90Spegne tutte le frasi NMEA (usiamo solo NAV-PVT; a 9600 le GSV saturavano la UART)
CFG-ANA-USE_ANA0x102300011AssistNow Autonomous — predizione orbite on-chip → TTFF più veloce ai riavvii

Payload pubblicato: {imei,battery,volt,rssi,batch:[{t,lat,lon,spd,sats,hdop(=pDOP),hacc(m)}…]}. Verificato in GKE (mqtt-bridge → positions:raw): batch a 1 Hz con hacc 2-3 m fermo. Il parser NAV-PVT sostituisce TinyGPS++ (firmware più leggero, no NMEA).

🗺️ Roadmap firmware — aspettative test successivi

🎯 Obiettivo finale: superare qualità GPS e durata batteria dei tracker Seeworld che vendiamo oggi, con un firmware nostro.

✅ v0 — MQTT tracker fatto

Batch store-and-forward 5s + batteria% + LWT, MQTTS end-to-end al server. Always-on (~84mA+).

🔜 v1 — Smart power / wake-on-motion prossimo

  • Accelerometro (IMU): il device va in sleep quando fermo per più di X minuti, e si sveglia sul movimento (wake-on-motion via interrupt).
  • Ottimizzare i consumi e misurarli nei 3 stati: sleep (fermo) · idle (registrato, in attesa) · tracking continuo (in marcia).
  • 🎯 Verifica sul campo: durata batteria > Seeworld a parità di reattività.

🔜 v2 — BLE antifurto smart

  • BLE beacon per armare/disarmare gli allarmi in modo smart: presenza del telefono/keyfob del proprietario → disarma; assenza/allontanamento → arma automaticamente.
  • Sfrutta il BLE nativo del nRF52840 (no hardware extra).

Sequenza test: baseline GPS+MQTT (v0)smart-power + consumi (v1)BLE antifurto (v2). Poi confronto GNSS SAM vs DAN dual-band per la scelta finale.