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.
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 computer53 RAM variables
- Diagnostic cableReverse-engineered serial protocol
- Raspberry PiLogs every drive, five times a second
- Home serverMaster copy, one normalizer
- Sunday jobWeek vs week vs baseline → health card
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
- Misfires are a rate, not a count. The counter never resets on its own, so only rates per 10,000 firings compared week to week mean anything. Day-to-day noise is about five times what a naive model predicts. Single days lie.
- Cylinder 3 runs about twice its siblings, and the story changed. Before the new plugs the excess was the same at every load. The plugs cut the warm misfire rate across all six cylinders by about a third and made what was left depend on load. Same symptom, different shape, different suspect.
- Nearly 40% of all misfire counts land in the second after an upshift, which is under 10% of driving time. That is not one cylinder's fault. It is shared, with cylinders 3, 4 and 6 about twice 1, 2 and 5 inside that window.
- Cylinder 4 dislikes cold oil. With the coolant warm but the oil under 50 °C it misfires at nearly three times its warm-oil rate. Nothing else does that.
- The battery problem was my logger. On long parks the Pi fell into boot storms, up to 128 reboots in a day, each one a drain. The fix is a hardware low-voltage cutoff, not more software.
- High charging voltage is normal here. A 15.3 V median looked like a sick battery until I learned this platform recuperates on deceleration. Learn the car's normal before judging a number.
- Bin by load before comparing windows, and assign a drive to a week by when it started, not row by row. Both bit me before I wrote them down.
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
- Read only. My tools never flash or write to the car.
- One normalizer. Nothing bypasses it.
- Rates with baselines, binned by load, before blaming any cylinder.
- Trust the physical part in your hand, not the listing photo.
- Never delete an assertion to make a model render.
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.