Outside of work, I lead a 24 hours of lemons endurance racing team. For our Spring 2026 Sonoma Race, we needed to build a custom telemetry system that could:

  • Give a realtime camera feed of the driver POV
  • See a realtime dashboard of critical engine/car/driver-input telemetry
  • Stream all of this to a livestream for spectators and audience abroad

This was a ton of fun to get to apply all my skills from Orchard Robotics and SpaceX to an engineering project to directly make my friends happy.

I designed the hardware architecture, wrote the embedded software, and built the physical system. Jacky built out the entire software stack and data-flows. And of course, the rest of the team built the race car.

In the rest of this blog, I’ll talk about the hardware design and build out.

Sanjana Miata Pass

01 - HW Architecture

Telemetry Block Diagram

Design Considerations

We had considered a Starlink Mini as vehicle data offload but decided against this because I was unsure if we would be in a garage. The line-of-sight requirements are tough.

The need for multiple camera POVs, as well as pulling in data from multiple diverse sources essentially forces a Jetson-like central OBC.

We had also considered running the stream on the vehicle, but this would have been very rough as the stream would have died if the telemetry computer restarted. So keeping that separate was a great choice.

Nailing down the HW architecture was the first step in the process. This was very similar to systems I had built in the past at Orchard Robotics, so it felt like home turf.

02 - Hardware BOM

ComponentModelSpecsPowerCostCategoryNotes
Forward Wide CameraLogitech C920x1080p × 30fpsUSB 2.5W$70VideoDriver POV
Driver CameraLogitech C920x1080p × 30fpsUSB 2.5W$70VideoShifting and pedal movements
On Board ComputeJetson Orin NX16GB RAM, NVENC accelerator12V/5A → 60W max$1150ComputeHardware encoding accelerator avoids video bottleneck
5G ModemGL-X30005G, physical SIM12V/2.5A → 30W max$323Connectivity
SIM Card + PlanVisible+ ProUnlimited data$45/moConnectivityVerizon works well at Thunderhill and Sonoma
GPS/AccelRaceBox Micro25Hz, <1m accuracy12V, 0.2W max$125TelemetryAlso works as standalone product with phone
Bluetooth DongleUD100-G03BLE 4.0USB, 2.5W max$39TelemetryJetson lacks built-in BT; needed for RaceBox BLE
MicrocontrollerArduino Mega 256054 digital I/O, 16 analog inputsUSB, 1W max$49TelemetryOverkill; smaller 5V Arduino would suffice
MicrophoneLavMicro-UUSB lavalierUSB, 0.5W$30AudioIn-car audio, Opus 64kbps

One of the earliest things I derisked was whether or not the modem would even work with the Visible Physical Simcard. I had to borrow a friend’s Android with a physical simcard slot, activate it, then transfer the sim and hope everything would “just work”. Luckily, despite online sources reporting otherwise, it did.

03 - Telemetry Points

Tapping Strategy

Since the 1992 Honda Accord is before the OBD2 era, we needed to grab most of our telemetry points via analog sense taps. For 12V signals, this would require a voltage divider circuit. For 5V signals, as long as we use a 5V micro controller we can skip the voltage divider.

Finding what pins to tap where was a slow and tedious process.

  1. Figure out what line to tap via FSM + Haynes
  2. Tap the line via t-splice connectors
  3. Connect the line to an o-scope while the engine was running.
  4. Verify I could process the signal later.
Ignition square waves on oscilloscope
Using the oscope to verify what signal I would have to process
T-splice connectors on extension harness
T-splice connectors on an extension harness
FSM throttle position pinout
Using the FSM to find which pins to tap
Telemetry PointSense StrategySignal TypeArduino PinSense Line
Video 1CameraUSB
Video 2CameraUSB
Car AudioMicrophoneUSB
Brake IndicatorBinary yes/no voltage12V divided down 4.3×A5White/Green brake light line
Battery VoltageAnalog12V divided down 4.3×A6Tap off PDB +12V bus
Throttle PositionCalibrated 0–100%5V analogA9D11 ECU D connector
Engine Coolant TempLookup table5V analogA8D13 ECU D connector
MAPLookup table5V analogA10D13 ECU D connector
RPM (Tach)Instantaneous pulses/sec12V square wave, stepped down to 5VD18A7 BLU Dash connector
VSSInstantaneous pulses/sec12V square wave, stepped down to 5VD19B10 ECU B connector
GPSRaceBoxDigital
AccelRaceBoxDigital
GyroRaceBoxDigital
Arduino with voltage dividers and sense tap points
Arduino with voltage divider boards and sense tap points off the ECU
RPM and brake tap points behind the dash
RPM and brake tap points behind the dash

Details of Tapping

Direct sense taps require a high impedance resistor in line to prevent the Arduino ESD protection diodes (when arduino is unpowered) from pulling the sense lines low and confusing the ECU. Especially if MAP is pulled low, the car will not start.

The RPM line comes from the ignition which has a lot of noise, and can separately also spike as high as 24V or 36V. I have a diode to suppress the voltage spikes, but next time I’ll add a cap to suppress the noise.

To make the build complete, it is helpful to have:

  • T Splice connectors
  • Butt splice connectors
  • Diodes, resistors, capacitors
  • Physical switch
  • Inline fuses and fuse holders

04 - Power Architecture

Onboard Power Diagram

I decided to make the source of all the power the kill switch +12V downstream. This is for safety reasons so that if we pull the kill switch telemetry powers off too. The “power distribution board” was just a perf board with everything soldered up to meet it. It was jank, but it worked well. Yes it was covered later. I got very lucky that the Jetson, Modem, and Racebox all supported automotive 12V input. That made things significantly easier.

Power distribution board and Jetson mounted in car
Power distribution board and Jetson mounted on 3mm plywood
Kill switch tap off wiring
Kill switch +12V tap off

Power Considerations

I had considered adding another secondary battery onboard, but descoped it at the time to make deadlines. The primary goal was to power as much as we could off the onboard battery to keep things simple.

05 - Testing

Jacky will likely talk more about this, but we did multiple all up integration tests on our driveway, which helped shake down many “on-startup” stability problems. To test live data while moving, we also built a race track around our city block, which is also where we made sure to get our camera mounting dialed in, as well as discovered that we needed adjustable camera gain while the stream was running.

Once everything was tested and working, that’s when I did a final pass to zip tie everything down. If I were to do this a second time, I would definitely make a PCB for this. Too many zip ties for jumper wires that shouldn’t exist haha.

06 - Places to Improve

Sensing

I really wish I had more time and could have put some caps on the RPM sense line, there’s a lot of noise and caused us to read higher RPMs than what we actually should have been seeing on track

Power

There are two big issues:

  • You can deplete the vehicle battery while running telemetry which means we had to repeatedly hook up a battery charger while running telem only
  • Cranking the starter brings the +12V rail below +10V which browns out the computers. This meant stalling the car and restarting the car would necessitate a power cycle, very annoying.

For the next iteration we plan to add a small auxiliary battery with:

  • a relay that switches off if the kill switch is switched to cut power to telemetry
  • diodes that prevent auxiliary battery from flowing to the main electrical bus

07 - Software

I did the embedded software running on the Arduino, and Jacky did most of 95% of the software stack. This was a lot of fun working with him as a hackathon for basically 3 days straight. Check out the github here: https://github.com/shihaocao/telem

A lot of the lessons about how this kind of software has immense parallels with my time at Orchard. It was fun to basically be on the customer side of things (when discussing software goals with Jacky). I think rebuilding what we had at Orchard indicates that we got a lot of things right at Orchard.

Jacky is also writing a blog post on the software side of things: COMING SOON

Driver Communication

We ran driver communication completely parallel to telemetry. We would communicate with drivers via discord audio call. This meant that if the telemetry stack restarted, our audio communications persisted. This was very useful during hotpits when we shut off telemetry, or if we ever had to crank the starter on track.

08 - Supporting Us

If you’re interested in sponsoring our team, or donating, please reach out to me over email at shihaocao@gmail.com, or on X

You can also donate directly here: https://donate.stripe.com/9B6cN52esdN1d3LbbOcAo00

If you’re also interested in equipping your own car with this setup, for a donation to the team, Jacky and I are happy to help bootstrap you and call until the system works. We love seeing more teams have more fans cheer for them!

Team photo with the car at the track
Team photo after we won Heroic Fix at Sonoma 26
Car 129 overlooking San Francisco
A photoshoot at twin peaks