Vehicle Tracking — XIAO + SAM-M10Q + 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 SAM-M10Q TX | D0 | RX UARTE1 · GPS @9600 · output UBX NAV-PVT |
| GPS SAM-M10Q 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 9600 (default 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 SAM-M10Q | UART 9600, talker $GN, ~9.9 mA |
| 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 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 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 |
| CFG-SIGNAL-GAL_ENA | 0x10310021 | 1 | Abilita Galileo |
| CFG-SIGNAL-BDS_ENA | 0x10310022 | 1 | Abilita BeiDou (B1C) |
| CFG-SIGNAL-GLO_ENA | 0x10310025 | 1 | Abilita GLONASS |
| 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; a 9600 le GSV saturavano la UART) |
| CFG-ANA-USE_ANA | 0x10230001 | 1 | AssistNow 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.