ahk02x / field notes
SQ5 · 2025 · 3.0 litre turbo V6

The SQ5 garage

A car that I log, tune, and argue with. I bought it to drive it. Then I wanted to know what it was actually doing, and the factory gauges answer almost nothing. This is the hobby.

This week
Needs attention
Week of Oct 20 to Oct 27 · open the health card
Logged
243drives
just under 600,000 samples, integrity clean
Channels
53× 5 Hz
engine-computer RAM, not generic OBD
Plugs, September
−37%misfires
the change that mattered most

What's on it

Software
Stage 2 engine and gearbox tune.
Air in
034 S34 carbon intake with the aluminium turbo inlet.
Air cooled
IE FDS intercooler.
Chassis
034 Dynamic+ lowering springs. 034 billet inserts in the rear differential, rear subframe and transmission mounts, plus the Street Density transmission mount. CTS flush spacers on the factory wheels. A proper alignment afterwards.
Ignition
Fresh NGK Laser Iridium plugs in September. See below for why that line is on this list.
Inside
Q7 steering wheel retrofit, carbon paddle shifter knob, dynamic hub caps, engine cover studs.
Wanted
Cat-back exhaust, charge pipe, front strut brace, sway bar bundle, two-piece rotors, a carbon hood.

How the data gets from the car to this page

Engine computerDiagnostic cableRaspberry PiHome serverSunday job 53 RAM variablesprotocol reverse-engineeredlogs every drive, 5 Hzmaster copy, one normalizerweek vs week vs baseline away from home: keeps data, retries every 10 min→ one verdict, in words
  1. Engine computer53 RAM variables
  2. Diagnostic cableReverse-engineered serial protocol
  3. Raspberry PiLogs every drive, five times a second
  4. Home serverMaster copy, one normalizer
  5. Sunday jobWeek vs week vs baseline → health card
Read only, end to end. Nothing in this chain can write to the car.

The car came with a diagnostic cable whose Windows app I didn't want to depend on, so I reverse-engineered the cable. The protocol is request and response over a serial link: a framed message with a 16-bit checksum, a handshake that opens "measurement mode," then about five reads a second of 53 engine-computer variables. These are not generic OBD values. They are the ECU's own RAM: per-cylinder misfire counters, knock correction per cylinder, oil and transmission temperatures, boost, lambda, voltage at the module. The full write-up, including the bug that made a million readings silently wrong, is in jackal-protocol-re.

A Raspberry Pi 4 in the passenger footwell runs the logger on every drive. Away from home it keeps the data and tries every ten minutes; back on the home network it pushes everything to a server, which is the master copy. Every row goes through one normalizer so nothing reaches the database by a side door.

The case is fanless by evidence, not by hope: 121,072 temperature samples over two weeks, a maximum of 67.7 °C on the chip, zero throttling. The first case failed on measurement, not material: 1.2 mm of clearance for a board edge that overhangs 1.2 mm is zero, and the hold-down legs snapped. The second is written in OpenSCAD with fit assertions that caught four real collisions before anything was printed. Rule since then: when adding a port, model the connector, not just the board.

What the data taught me

The weekly health card

Every Sunday a job compares the week to the week before and to a four-week baseline and writes one message: the verdict in words first, then what to do, then the evidence with its threshold in the same sentence. "Oil peaked at 104 °C, fine, worry starts at 130." No channel names, no units nobody asked about. The current card is here, as a static snapshot. It is deliberately not a live feed: a live feed of a car tells the world when it is and isn't home.

Rules I keep

Next

A measured low-voltage cutoff for the Pi. Proving which counter index is which physical cylinder before anyone touches a coil. Then the coil swap as a designed experiment with a before and after, not a hunch.