V
Visla Hardware
Portal R&D
πŸš— R&D Visla β€” banco tracker veicolare

Vehicle Tracking β€” XIAO + DAN-F10N + A7670E

Tracker veicolare: Nordic nRF52840 (XIAO + Expansion) + GPS u-blox DAN-F10N dual-band L1+L5 + modem SimCom A7670E Cat-1 always-on, alimentato a LiPo. Variante del banco SAM-M10Q (vedi): cambia solo il GPS β†’ confronto accuracy.
βœ… MQTTS end-to-end β†’ server βœ… A7670 registrato LTE Cat-1 πŸ›°οΈ DAN-F10N L1+L5 ~21 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 DAN-F10N TXD0RX UARTE1 Β· GPS @38400 Β· output UBX NAV-PVT dual-band
GPS DAN-F10N 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 38400 (default DAN-F10N, non 9600 come il 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 DAN-F10NUART 38400, NAV-PVT dual-band L1+L5, ~21 mA, accuracy ~1m
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 DAN-F10N 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. Differenze vs SAM-M10Q: baud 38400 (non 9600), GLONASS off (F10 dual-band non ha L5), costellazioni L1+L5. Su F10 (SPG 6.00) alcune chiavi CFG differiscono ("no CFG legacy") β†’ una NAK non applica ma non blocca.

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 (L1CA + L5 dual-band)
CFG-SIGNAL-GAL_ENA0x103100211Abilita Galileo (E1 + E5a dual-band)
CFG-SIGNAL-BDS_ENA0x103100221Abilita BeiDou (B1 + B2a dual-band)
CFG-SIGNAL-GLO_ENA0x103100250⚠️ Disabilitato β€” F10 dual-band, GLONASS non ha L5
CFG-SIGNAL GPS_L5 health override0x103200011⭐ F10-only β€” usa i sat GPS L5 "pre-operational" (unhealthy di default, altrimenti IGNORATI) β†’ sblocca il dual-band REALE su GPS. Chiave dalla Table 3 dell'Integration Manual DAN-F10N
CFG-SIGNAL-SBAS_ENA0x103100201Abilita SBAS (EGNOS in EU)
CFG-SBAS-USE_DIFFCORR0x103600041⭐ Applica 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_UART10x209100071⭐ NAV-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 dual-band)
CFG-ANA-USE_ANA0x102300011AssistNow Autonomous β€” predizione orbite on-chip β†’ TTFF piΓΉ veloce ai riavvii
CFG-MSGOUT-UBX_SEC_SIG_UART10x209106351⭐ F10-only β€” abilita UBX-SEC-SIG β†’ parser: jam (jamming) + spoof (spoofing). Antifurto: becca jammer/spoofer del ladro
CFG-ITFM-ENABLE0x1041000D1Monitor interferenze β†’ alimenta il jammingState di SEC-SIG (senza, resta "unknown")
CFG-ITFM-ENABLE_AUX0x104100131Scansiona interferenze anche sulla banda L5 (dual-band)
CFG-MSGOUT-UBX_NAV_PL_UART10x209104161⭐ F10-only β€” abilita UBX-NAV-PL β†’ parser: pl = protection level orizzontale (m) = accuracy garantita 95%

Payload pubblicato: {imei,battery,volt,rssi,jam,spoof,pl,batch:[{t,lat,lon,spd,sats,hdop(=pDOP),hacc(m)}…]} β€” con jam/spoof (0-3, antifurto) e pl (protection level, m). Il parser gestisce 3 messaggi UBX (NAV-PVT + SEC-SIG + NAV-PL) e sostituisce TinyGPS++. βœ… Verificato al banco (7 lug 2026): in cielo aperto aggancia fix 3D (9 sat, hacc 25-32m, Orvieto), publish OK end-to-end (broker β†’ bridge β†’ DB, batch da 5 pt/5s), jam=1 spoof=1 = clean nel payload. ⏳ Quantificare il confronto hacc SAM (L1) vs DAN (L1+L5) resta da fare sul campo.

Extra F10 attivi βœ…: UBX-SEC-SIG (jamming+spoofing β†’ antifurto, parser fatto) Β· UBX-NAV-PL (protection level, parser fatto) Β· ITFM (monitor interferenze). Non usati: NavIC (costellazione India L5 β†’ nessuna copertura in EU, solo export). Chiavi + layout messaggi presi dal F10 Interface Description SPG-6.00 (UBX-23002975). Verificato in GKE: spoof=no βœ… arriva nel payload; jammingState operativo con ITFM.

πŸ”¬ Findings banco β€” debug end-to-end (7 lug 2026)

Sessione di debug "non vedo il pallino verde nell'app": tutta la catena verificata anello per anello. Nessun guasto β€” era una combinazione di 3 cose + un bug di lettura batteria.

πŸ”‹ Bug batteria: lettura che "ballava" 20%↔95% β€” non era la carica USB nΓ© lo stale-read ADC. È il sag del modem: in TX l'A7670E tira ~2A, e sulla LiPo (Rint ~0.2Ξ©) β†’ Ξ”V = 2A Γ— 0.2Ξ© = 0.4V. Il firmware leggeva a caso durante o fuori dal burst β†’ 3.73V (sag) vs 4.13V (riposo). Fix: readVbat() prende il MAX su 250ms = tensione a riposo, scarta i sag. Ora stabile 96% / 4.15V su USB. ⚠️ Off-USB inaffidabile su questo banco: col Y-split (LiPo β†’ modem + Expansion) la LiPo non arriva al pad-BAT del XIAO (P0.31 legge 2.73V fantasma); provato AT+CBC del modem ma non Γ¨ calibrato (2.9-3.3V mentre gira a β‰₯3.4V). Nessun pin ADC libero (D0-D5 usati) β†’ fix vero = divider batteria dedicato sul PCB v2. La LiPo comunque sta bene (modem+GPS girano off-USB).
πŸ›°οΈ "0 satelliti" β‰  guasto β€” 3 cause in fila: (1) indoor = 0 sat (il GPS non vede il cielo); (2) il TX del GPS era stato spostato sul Waveshare per debug β†’ il XIAO non riceveva piΓΉ il GPS su D0; (3) alla finestra il fix era debole (5 sat, hacc 57m, gnssFixOK=0). In cielo aperto: 9 sat β†’ gnssFixOK=1 β†’ fix=YES β†’ publish β†’ pallino verde. Il chip letto direttamente (Waveshare @38400) sputava NAV-PVT+SEC-SIG puliti β†’ HW/config/baud tutti ok.
πŸ“Ÿ Debug seriale aggiunto β€” l'heartbeat ora stampa anche sats= fix= hacc= buf= + Vbat (prima solo su OLED) β†’ si diagnostica il GPS senza guardare il display. fix.valid = gnssFixOK && (fixType 2|3): serve un fix affidabile, non basta vedere satelliti.

⚠️ Gotcha da ricordare: leggere la batteria sempre col max-su-finestra (mai lettura singola, il modem la falsa). E il fix "vero" richiede cielo aperto β€” alla finestra gnssFixOK spesso resta 0.

πŸ—ΊοΈ 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.