From 0af2c956e436929da905f4f45de0ddde92f2e7a1 Mon Sep 17 00:00:00 2001 From: Mikkeli Date: Thu, 15 Oct 2026 20:15:07 +0900 Subject: [PATCH] Z27AG decode pass 2: vehicle speed, coolant, front wiper; wheel speeds little-endian; IMU checked against GNSS Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz --- docs/impl/reports/Z27AG-DECODE-2.md | 60 +++++++++++++++++++++++++++++ schema/signals.json | 54 +++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 docs/impl/reports/Z27AG-DECODE-2.md diff --git a/docs/impl/reports/Z27AG-DECODE-2.md b/docs/impl/reports/Z27AG-DECODE-2.md new file mode 100644 index 0000000..ca87a7a --- /dev/null +++ b/docs/impl/reports/Z27AG-DECODE-2.md @@ -0,0 +1,60 @@ +--- +type: report +date: 2026-10-15 +--- +# Z27AG CAN: second pass, against OBD-II and GNSS + +Sessions `000007-20261015T192938` and `000008-20261015T200202` (car Orin): doors, tailgate, +bonnet and wipers (checklist step 10–11), then a short drive with GNSS (3D fix, helix antenna) +and OBD-II through the ELM327 on the K-line, all on the Orin's clock. The first time CAN, OBD-II +and GNSS were recorded together. About 30 minutes; 1190 OBD-II samples of each fast value. + +## Confirmed + +| Signal | Where | Evidence | Registered as | +|---|---|---|---| +| Engine speed | `210` bytes 4–5, BE, 1 rpm (pass 1) | equal to OBD-II `0C`: median ratio 1.0000, median difference 4 rpm, 1190 samples | `engine_rpm` (unchanged) | +| Coolant temperature | `449` byte 2, −40 °C | equal to OBD-II `05` within ±1 °C (median 0.0) over 86–97 °C; no other byte tracks it | `coolant_temp_c` | +| Vehicle speed | `231` bytes 6–7, **little-endian**, **0.0577 km/h per count** | steady cruising (> 15 km/h, GNSS change < 1 km/h over 2 s, 117 fixes): spread 2.6 % against GNSS | `vehicle_speed_kph` | +| Four wheel speeds | `235` four words, **little-endian** (pass 1 left the byte order open) | big-endian misses by 28 km/h rms; little-endian fits. Words 0, 1: 0.0578; words 2, 3: 0.0581 km/h per count against GNSS | not yet: which word is which wheel waits for the jack-stands run (fronts turn, rears stay) | + +Scales are against **GNSS**, so they include this car's tyres today. **OBD-II speed reads 3 % low** +against GNSS (0.9706): the ECU's figure is no better a reference than the ABS frames. The two +word pairs of `235` differ by 0.5 %, the usual size of a front/rear tyre difference. + +## Doors, tailgate, bonnet, wipers + +| Thing | Bit | Notes | +|---|---|---| +| Driver's door | `423.0.4` | its own bit (pass 1); also sets any-door | +| Passenger, rear left, rear right | only `423.2.1` (any door) | no bit of their own | +| Tailgate | only `423.2.1` | with the driver's door open, `423.0.4` cleared on closing it while `423.2.1` stayed set until the tailgate shut | +| Bonnet | nothing | a mechanical latch with no switch, as expected | +| Front wiper running | `423.3.3` | set through "low" and "high"; nothing in a 4 s "interval" window. Medium confidence; also explains pass 1's unexplained `423.3.3` stretch | + +## IMU calibration, checked against GNSS + +Level from session `000006` (two still stretches, the ground's 1.9° slope cancelled), forward from +`000008` (three stops, one launch; 3512 samples, mean spread 12.7°). The module sits upside down, +about 24° off level, turned so its X axis points forward. Calibrated, the marked stretches read: + +| Stretch | IMU longitudinal (0.25 s mean, peak) | GNSS | +|---|---|---| +| Stop, 48 → 0 km/h | −0.35 g | −0.28 g | +| Stop, 45 → 0 | −0.17 g | −0.17 g | +| Stop, 40 → 0 | −0.21 g | −0.18 g | +| Launch | +0.32 g | +0.36 g | + +Lateral stays at about 0 in all four: forward is straight ahead. GNSS reports about once a second, +which smooths short peaks. + +## Not found + +- **Intake air temperature:** no byte of `449` tracks OBD-II `0F` (29–51 °C here). +- `449` bytes 0, 1, 3 move like temperatures but match nothing on OBD-II. + +## Notes on the recording + +- **The Orin froze mid-drive** (19:59; hardware watchdog reset at 20:01:47), splitting the drive + over two sessions. orin-nano-env-setup has the investigation. +- OBD-II through the ELM gave each fast value about every 2 s (K-line, ~250 ms per request). diff --git a/schema/signals.json b/schema/signals.json index b580ce9..3f9d63a 100644 --- a/schema/signals.json +++ b/schema/signals.json @@ -250,7 +250,7 @@ "unit": "", "type": "boolean", "source": "z27ag", - "description": "Any door open", + "description": "Any door open, the tailgate included (the bonnet has no switch)", "can": { "id": "0x423", "byte": 2, @@ -263,7 +263,7 @@ "unit": "", "type": "boolean", "source": "z27ag", - "description": "Driver's door open", + "description": "Driver's door open: the only door with its own bit", "can": { "id": "0x423", "byte": 0, @@ -285,6 +285,56 @@ "evidence": "Z27AG-DECODE-1" } }, + "vehicle_speed_kph": { + "unit": "kph", + "type": "number", + "source": "z27ag", + "description": "Road speed from the ABS (CAN), scaled against GNSS on this car's tyres: OBD-II speed reads 3 % lower", + "range": [ + 0, + 250 + ], + "can": { + "id": "0x231", + "byte": 6, + "length": 16, + "order": "little", + "scale": 0.0577, + "offset": 0, + "evidence": "Z27AG-DECODE-2" + } + }, + "coolant_temp_c": { + "unit": "celsius", + "type": "number", + "source": "z27ag", + "description": "Engine coolant temperature (CAN): equal to OBD-II's within 1 °C over 86-97 °C", + "range": [ + -40, + 215 + ], + "can": { + "id": "0x449", + "byte": 2, + "length": 8, + "scale": 1, + "offset": -40, + "evidence": "Z27AG-DECODE-2" + } + }, + "front_wiper": { + "unit": "", + "type": "boolean", + "source": "z27ag", + "description": "Front wiper running (low or high; interval not seen in a 4 s window). Medium confidence", + "can": { + "id": "0x423", + "byte": 3, + "bit": 3, + "length": 1, + "evidence": "Z27AG-DECODE-2" + } + }, "orin_cpu_temp_c": { "unit": "celsius", "type": "number",