Vehicle Tracking β XIAO + DAN-F10N + A7670E
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
| Segnale | Pin XIAO | Note |
|---|---|---|
| GPS DAN-F10N TX | D0 | RX UARTE1 Β· GPS @38400 Β· output UBX NAV-PVT dual-band |
| GPS DAN-F10N RX | D10 | TX config UBX (CFG-VALSET al boot) |
| GPS VCC / GND | 3V3 / GND | ~10 mA, dalla XIAO |
| Modem A7670 TX | D7 | RX Serial1 (UARTE0) Β· modem @115200 |
| Modem A7670 RX | D6 | TX Serial1 |
| Modem PWRKEY | D2 | impulso UNA volta in setup() β mai nel loop (reboot loop) |
| Modem VBAT | LiPo diretto | 3.4β4.2V Β· NON dal 3.3V dell'expansion (picchi 2A) |
| OLED SSD1306 | D5=SCL D4=SDA | β οΈ SW I2C (bit-bang) β non HW, sennΓ² collide con UARTE1/GPS |
| Bottone | D1 | INPUT_PULLUP |
| Buzzer | A3 | passivo |
| LED RGB onboard | LED_BLUE/GREEN | active 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
| Componente | Parte | Ruolo |
|---|---|---|
| MCU | XIAO nRF52840 (Seeed) | Nordic, BLE, 2Γ UART, USB CDC |
| Carrier | XIAO Expansion Board | carica LiPo (BQ), OLED, JST-PH 2.0, buzzer, button |
| Modem | SimCom A7670E (Waveshare HAT) | LTE Cat-1, MQTTS nativo CMQTT |
| GPS | u-blox DAN-F10N | UART 38400, NAV-PVT dual-band L1+L5, ~21 mA, accuracy ~1m |
| Display | OLED SSD1306 128Γ64 | SW-I2C (D5/D4) |
| Alimentazione | LiPo 1S (β₯1000mAh) | VBAT modem diretto + cap bulk; carica via USB-C |
| SIM | 1NCE (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 ID | Val | Cosa fa |
|---|---|---|---|
| CFG-NAVSPG-DYNMODEL | 0x20110021 | 4 | β Dynamic model Automotive β filtro nav per veicolo (aderenza strada, meno deriva) |
| CFG-SIGNAL-GPS_ENA | 0x1031001F | 1 | Abilita GPS (L1CA + L5 dual-band) |
| CFG-SIGNAL-GAL_ENA | 0x10310021 | 1 | Abilita Galileo (E1 + E5a dual-band) |
| CFG-SIGNAL-BDS_ENA | 0x10310022 | 1 | Abilita BeiDou (B1 + B2a dual-band) |
| CFG-SIGNAL-GLO_ENA | 0x10310025 | 0 | β οΈ Disabilitato β F10 dual-band, GLONASS non ha L5 |
| CFG-SIGNAL GPS_L5 health override | 0x10320001 | 1 | β 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_ENA | 0x10310020 | 1 | Abilita SBAS (EGNOS in EU) |
| CFG-SBAS-USE_DIFFCORR | 0x10360004 | 1 | β Applica le correzioni differenziali EGNOS β +accuracy (~1-2 m) |
| CFG-SBAS-USE_RANGING | 0x10360003 | 1 | Usa i satelliti SBAS anche per il ranging |
| CFG-RATE-MEAS | 0x30210001 | 1000 | Rate misura = 1 Hz (200 = 5 Hz) |
| CFG-MSGOUT-UBX_NAV_PVT_UART1 | 0x20910007 | 1 | β NAV-PVT ON β binario con pos+vel+tempo+sat+accuracy(m) |
| CFG-MSGOUT-NMEA_ID_GGA/RMC/GSV/GSA/GLL/VTG/ZDA_UART1 | 0x2091 00BB/00AC/00C5/00C0/00CA/00B1/00D9 | 0 | Spegne tutte le frasi NMEA (usiamo solo NAV-PVT dual-band) |
| CFG-ANA-USE_ANA | 0x10230001 | 1 | AssistNow Autonomous β predizione orbite on-chip β TTFF piΓΉ veloce ai riavvii |
| CFG-MSGOUT-UBX_SEC_SIG_UART1 | 0x20910635 | 1 | β F10-only β abilita UBX-SEC-SIG β parser: jam (jamming) + spoof (spoofing). Antifurto: becca jammer/spoofer del ladro |
| CFG-ITFM-ENABLE | 0x1041000D | 1 | Monitor interferenze β alimenta il jammingState di SEC-SIG (senza, resta "unknown") |
| CFG-ITFM-ENABLE_AUX | 0x10410013 | 1 | Scansiona interferenze anche sulla banda L5 (dual-band) |
| CFG-MSGOUT-UBX_NAV_PL_UART1 | 0x20910416 | 1 | β 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.
Ξ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).
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.
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.