2026-10-21

DZGarage Cockpit in the race: from the bench to the Spain Classic Raid

Four stages, 894 km of logs and 2,080 TRIP corrections. How the DZGarage Cockpit went from the caliper and the CAD to the dashboard of the #89 Audi 100, and how we used it from Gijón to Palencia.

By •~9 min read •rally, spain-classic-raid, esp32, hardware, dzlabs, claude-code

In the previous post I wrote about what I built for the XII Spain Classic Raid: three ESP32s, two GPS receivers, a touch screen and about 23,000 lines of C++, all of it shown with CAD renders. I promised photos of the thing mounted and a report after Palencia.

We ran the four stages, from Gijón to Palencia, with Andrés driving and me as co-driver. The cockpit logged 894 km at 10 Hz, almost 1.4 million GPS rows, and we finished 28th of 127 overall (the stage by stage chronicle of the race is in DZ Lab), but this post is about the device, from the garage to Palencia.

The maroon Audi 100 with Spain Classic Raid number 89 on the door, splashed with mud, stopped on a mountain road with a crew member leaning on the open door
The #89 on Stage 1, Saturday afternoon, already muddy.

From the CAD to the dashboard

The mount and the boxes came out of OpenSCAD, but the dashboard measurements I took by hand. On October 12 I spent the afternoon in the garage with the tape measure, the caliper and a piece of cardboard cut to copy the curve over the glovebox, and every number went back into the .scad. That same afternoon I put everything together on the table for the first time, and on the 14th we mounted it in the car, with the neopod stuck to the top of the windscreen.

A hand holds a light wood SKÅDIS pegboard against the Audi's dashboard, on the passenger side, inside a garage
First fitting of the SKÅDIS in the car.
The SKÅDIS panel on a table with the black tablet frame on the left and the black cockpit box on the right, its screen in the middle and blue, yellow, green and red buttons on the sides
Same day, on the table, with the tablet frame and the cockpit box.

Gijón, Saturday at 11:17

At the start in Gijón the co-driver's side of the dashboard looked like this: the cockpit on the right, the tablet with Rabbit in the middle, the driver's phone on a suction mount, and up top the neopod and the organiser's receiver. Before the start the cockpit said 0.123 km and the tablet 0.122, and by the afternoon the tablet was already 24 m ahead.

Inside the Audi at the start in Gijón: the SKÅDIS panel on the dashboard with the tablet showing the navigation app and the cockpit box reading 0.123 km, a phone on a suction mount and the neopod at the top of the windscreen
Gijón, before the start. Cockpit 0.123, tablet 0.122.
Andrés drives on a dirt road; on the right, the panel with the tablet reading 7.187 km and the cockpit 7.163 km
Stage 1, in the afternoon. The tablet was already 24 m ahead of the cockpit.

Saturday's log

Saturday night, in León, I downloaded the cockpit logs and crossed them with the roadbook and with the official results from MiRally. I looked in the GPS track for the turns the roadbook draws and compared their km with the cockpit's. At the three junctions we could identify without doubt, the cockpit was 5 to 15 m off the roadbook.

The tablet counts too much, about 6 m per km. It adds up distances between GPS points, and in a 6 km TC it drifts 40 m, and at 27 km/h that's 5 seconds early that don't exist. From Sunday on, in the car, the tablet was always aligned to the cockpit with its buttons.

In TC1, 247 of the day's 289 points came from three batches of −10 m we pressed at km 2.8, where there wasn't any tulip: 470 m less of TRIP. The screen went to say we were 43 s late when we were really 20 s early, and Andrés sped up to recover a delay we invented. The log keeps every ±1 and ±10 press with the time, the TRIP and the position, so one night was enough to rebuild the mistake meter by meter. The review had the question of what we thought was at km 2.73 written down, to talk it over at breakfast.

In four days there were 2,080 TRIP corrections. About 1,000 went only to the tablet, to align it with the cockpit; the rest to both or only to the cockpit. After Saturday we kept the rule of correcting only at a turn you can't mistake or at a speed change.

The nights

Every night at the hotel we did the same. When we arrived, the cockpit's "copy of the day" (the web page, at /logs) went to the phone and from there by AirDrop to the Mac. I gave Claude Code the CSV, the GPX, the MiRally results link and what happened in the car, because that's in no log. Claude downloaded the results of every control for every crew, ran tc_review.py over the log and the roadbook, compared our track with the official controls and with the median of the top 20, and wrote in Spanish the review of the day and the plan for the next one. A script turns them into a phone-sized PDF, an A4 and a WhatsApp text.

On Sunday we started at 21:40 and on Monday at 19:40, and both nights we went past 23:00. The repo has 31 commits from Saturday, 19 from Sunday, 11 from Monday and 4 from Tuesday.

Claude got things wrong too, and we found almost all of it before printing. On Sunday it said that with TC2 and TC4 at the level of the top 20 we'd be on the podium; once it did the math with the medians, it was 4th or 5th. In the Stage 4 plan it wrote that the tablet would show "early" in the R! TCs when it would show "late", and it put the lunch stop 32 km into the liaison when it was 26. A card for Tuesday's TC3 used kilometers taken from the roadbook file that aren't printed, which the project forbids on crew sheets, and we had to cut it back.

On Sunday night Claude's first draft said "always arm the cockpit's TABLA". I answered no: "arming the TC in cockpit is problematic, is not easy to load the info in cockpit using the web; after a reboot the info is lost; we can't do that multiple times while we are driving". From that answer came the correction cards and the way we ran Stage 3.

There's been only one firmware change during the race. Saturday night, in León, I flashed the version that loads the day plan from the roadbook in the structure of the time card (Saturday's log says v0.1-238, the other three days v0.2-91). With that I broke the feature freeze, and after it nobody touched the firmware until Palencia.

The tables and the liaison screen

The previous post had a whole section about the TC by tables mode, the one that reduces a sheet of passing times to a few cadences. The cockpit writes a row in the log every time a table gets armed or starts, and in the logs of the four stages there isn't a single one.

Loading a TC into the cockpit on the road didn't work. You have to do it from the web, with the phone, in the minutes between getting the sheet and the start, and if the cockpit reboots the TC data's gone. So we ran the TCs with the tablet, a stopwatch and a printed sheet with the passing time at each tulip.

In the TCs with hidden speed changes (the organiser marks them R!) the tablet uses Rabbit's average for the whole section and doesn't know about the changes. On Sunday, in TC2 and TC4, the tablet said we were late, we pushed until it showed 0 and we were really 2 to 4 s early for kilometers: 50 of the day's 63 points. That night we made correction cards, one table per TC that says what the tablet has to show at each km to be really on time.

By Monday we had dropped the ENLACE (liaison) screen and printed a table with the clock time for every point of the day. From Stage 3 on we used the cockpit only as the reference odometer, all day on the TC face with the big TRIP.

The panel during the race: the tablet with the roadbook tulips, the cockpit reading 30.6 km/h and 6.751 km, and a printed sheet of passing times held with a binder clip at the top right
Stage 2. Cockpit 6.751, tablet 6.755, and the passing-times sheet with an office binder clip.

Two GPS and a power cut

The Garmin GLO was the main source and measured between 89% and 100% of each day's kilometers. The neopod took over when the GLO dropped out: 7% of the distance on Sunday, 11% on Tuesday.

On Sunday, at 12:51:29, 90 seconds before the start of TC2, the cockpit went off. It came back by itself in 10 seconds with the TRIP where it was. The log marks it as a power-on reset, so something's moving in the power supply or there's a bad contact. That night we checked the cable and the plug, and on Tuesday it happened twice more, 3 or 4 minutes before the start of TC4. In the four days the cockpit booted 21 times between hotel, starts and power cuts, and every time it came back with the TRIP.

In that Tuesday TC4 Rabbit's odometer got about 290 m ahead. That night I wrote it to Claude like this: "In TC4, something happened with Rabbit app, and odometer went crazy but odometer in the cockpit was ok."

View from the co-driver's seat: a dirt road between pines with wind turbines behind, another rally car ahead, the panel with the tablet and a hand holding printed sheets
Sunday's TC4, among the wind turbines, with the sheet in hand.

The numbers

Stage Km Corrections Points Place
S1 Gijón–León 179.8 602 289 65th/117
S2 León–Salamanca 305.8 510 63 18th/119
S3 Salamanca–Ávila 173.3 543 170 26th/115
S4 Ávila–Palencia 235.5 425 456 25th/114

Km is what the log recorded and corrections are the ±1 and ±10 presses. The log km include the drives to and from the hotel, that's why they don't match the official route. The maps, every TC and the standings are in the Spain Classic Raid 2026 chronicle in DZ Lab.

What I'd change

We didn't use the tables and the liaison screen because in the car there's no time to load anything, and the co-driver's already got both hands busy with the roadbook and the stopwatch.

For next year, the first thing I'd do is make a TC's data survive a reboot, and teach the cockpit the hidden changes from the day plan so it replaces the correction card. Then I've got to find which cable moves, Sunday at 12:51 and Tuesday before TC4. And I don't know if the tablet has to stay on the dashboard, or if the cockpit needs a roadbook screen so Rabbit isn't needed anymore.