racecar-35

A two-MCU telemetry dash for a track car: trunk-side sensing and SD logging, a driver-facing 7″ display in the cabin, and a cloud service that takes every session from the car to lap charts, GPS maps, overlays and an AI coach.

Rev C — engineering prototype Firmware v0.1.149 Cloud receiver: FastAPI Rev D in layout
Open the Dash Cloud   Read the project notes

What racecar-35 is

racecar-35 is the data system for the car, not just a gauge. The trunk box senses the engine and chassis, logs everything to SD at full rate and ships each session to the cloud. The cabin screen (CrowPanel, ESP32-S3, 7″ 800×480) shows the driver what matters live — speed, RPM band, shift flash, best/last/delta timing, GPS heading and sensor warnings — and is the WiFi/OTA path for the whole car.

  +--------------+  Serial2 (UART)  +---------------+  Serial3 (UART) +---------------------+
  |  u-blox GNSS | <--------------> |  Teensy 4.1   | <------------> |  CrowPanel S3 7"    |
  |              |  38400/9600 baud |  trunk logger |  115200 8N1    |  cabin display      |
  +--------------+                  +-------+-------+                +----------+----------+
                                            |                                   |
                                     SD logging / sensors                    WiFi  |
                                     SD chunks (Rev C)                           |
                                            v                                   v
                                  +--------------------------+      +------------------------+
                                  | ESP32-S3 NET module      |      | OTA + upload           |
                                  | (Rev C, SPI0, planned)   |      | fallback (working)     |
                                  +-----------+--------------+      +-----------+------------+
                                              |  HTTPS                          |
                                              +------------+--------------------+
                                                           v
                                        https://racecar.api.blueuc.com
                                        FastAPI cloud receiver  --  sessions, laps,
                                        maps, overlays, AI coach, firmware OTA

In the trunk

Teensy 4.1 — GNSS, MPU-6050 IMU, tach, oil pressure, coolant (NTC) and AEM AFR inputs, microSD session logging, CAN capture.

In the cabin

CrowPanel Advance 7.0 (ESP32-S3) running the LovyanGFX dash UI. RGB332 framebuffer, delta bar, shift flash, sensor warnings, REC handshake watchdog.

In the cloud

Session upload and archive, automatic lap detection, line view, video overlay export, GPS basemap, CAN capture tools, AI race coach, firmware/OTA hosting and share links.

Hardware

The current board is Rev C — a real, routed electrical design that has passed ERC/DRC and netlist checks. It is an unbuilt engineering prototype: it is not independently reviewed, not fabricated, and the new WiFi/RTC features it carries are not implemented in firmware yet.

RevisionStateNotes
Rev A / Rev BRetired Archived under hardware/_archive/. Sources still supply render assets; not orderable designs.
Rev CCurrent prototype 130 × 140 mm, 136 PCB parts, 76 nets, 392 connected pads, 427 pin/geometry assertions, zero ERC/DRC and zero unconnected. All six screw terminals on one left edge. Gerbers, BOM and assembly docs exist in engineering-prototype (unapproved first-build) mode.
Rev DIn layout Four-layer integrated trunk logger. BOM revision 1 fixed six unprocurable/mis-specified parts.

Rev C connectors (left edge)

RefFunction
J1POWER
J2SCREEN
J3TACH
J4OIL pressure
J5NTC coolant
J6AEM (AFR / lambda gauge output)

What Rev C adds

Firmware

Two PlatformIO projects in one repository, each with its own build environment.

ProjectTargetPath
Teensy firmwareTeensy 4.1platformio.ini, src/main.cpp
Dash UICrowPanel ESP32-S3 Advance 7.0crowpanel-ui/ (DASH_BOARD=71)

Recent releases

VersionWhat it brought
v0.1.149Opt-in AFR/lambda logging from the external AEM 30-0300 gauge output (white signal / brown reference) on a protected, clamped ADC input — not a direct oxygen sensor.
v0.1.148WiFi-only: Ethernet/W5500 support and the Internet-route setting removed; WiFi credentials and status always visible.
v0.1.147New dash layout (delta bar, BEST, GPS 3D, TIME), band-only shift flash, sensor-warning block, REC handshake watchdog, screen-side test simulator, RGB332 framebuffer (kills the shake).
v0.1.146CrowPanel Advance 7.0 board support; touch-debug UART0 prints stripped.
v0.1.144Speed up uploads; SD session history.

Build & flash

$ pio run -t upload                 # Teensy 4.1 (tap the program button on first boot)
$ cd crowpanel-ui && pio run -t upload   # Dash UI

Important: disconnect the two UART jumpers between the Teensy and the CrowPanel before flashing the screen. UART0 (GPIO 43/44) is shared with the CH340 USB-serial chip, so with the Teensy connected both devices drive the same wire and the upload fails or corrupts. After a verified upload, unplug USB-C, reconnect the Teensy, then power the panel again.

How a session gets to the cloud

  1. Drive. The trunk logger reads GNSS, IMU, tach, oil, coolant and AFR, and writes full-rate NDJSON to microSD. The cabin screen shows the live dash over UART.
  2. Stop-and-recover. The screen's REC handshake watchdog verifies the recording handshake; session files and sidecars are finalised on the card.
  3. Upload. The car joins WiFi (screen today, on-board NET module once Rev C firmware lands) and POSTs the session to the cloud receiver with its API key. Uploads are resumable, so a dropped link continues where it stopped.
  4. Process. The server stores the session, detects laps, builds the line view and GPS track, and indexes it for the review pages.
  5. Review. Team members open the session on the web — lap table, speed/throttle traces, GPS map, camera overlay, corner-by-corner coach notes — or share a read-only link.

Remote firmware is published from the same server: the dash downloads its own update and can push the matching Teensy image over UART.

The Dash Cloud

Everything the car records lands here. Sign in with your team account to browse sessions, compare laps and read the coach notes.

Sign in to the Dash Cloud →

Session library

Every uploaded run, sorted by car, track and date, with the raw NDJSON, sidecars and debug logs kept alongside the processed result.

Lap detection & timing

Laps are found from the GPS line, timed, and can be excluded or renamed. Session histories roll up per driver and per car.

Line view & compare

Two laps on one map, one drawn in red, with interpolated reference dots so a stepped sample never hides the real line.

GPS track map

Keyless basemap of the session line, with corner numbering from start/finish going LEFT/RIGHT, and named tracks you can edit.

Video overlay

Burns speed, RPM, lap delta and sensor readouts onto your camera footage for the same session file.

AI race coach

Corner-by-corner analysis with per-session history, so you can reopen a corner after a change and see whether it actually helped.

CAN captures

Upload and inspect raw CAN logs straight from the car's bus, decoded from the same server.

Firmware & OTA hosting

The server publishes build manifests; the dash pulls its own update over WiFi and can hand the Teensy image across UART.

Sharing

Revocable read-only links for a single session, so a driver or a tuner can look without an account.

Accounts & API keys

Google sign-in for people, per-device API keys for the cars, with visibility controls over who sees which driver's data.

API & endpoints

The cloud receiver is a FastAPI service. Interactive API docs and the OpenAPI schema are available on the same host as the login.

EndpointPurpose
GET /healthLiveness probe for the service and its storage.
GET /loginBrowser sign-in (team account).
POST /sessionsCar-side session upload (resumable), authenticated by device API key.
GET /sessionsList the sessions you are allowed to see.
GET /sessions/{user}/{file}/dataProcessed channels for one session.
GET /sessions/{user}/{file}/lapsDetected laps and timings, with exclusions.
GET /sessions/{user}/{file}/linesLine geometries for the map and comparisons.
GET /sessions/{user}/{file}/aiAI coach output history for the session.
GET /coach/{user}Coach queue and per-corner notes for a driver.
GET /tracksKnown tracks and their start/finish definitions.
GET /firmware/manifest.jsonPublished firmware builds for OTA updates.
GET /account/apikeyIssue or rotate a device API key.
GET /shared/{token}Read-only shared session view.

Base URL: https://racecar.api.blueuc.com. The legacy hostname stays live for dash uploads; api.racecar35.com is the reserved replacement.

Where this is going