byronthegreat.com Source code

1975 BMW R75/6 · Raspberry Pi 5

motoCarPlay

CarPlay and live engine data on a 3.4-inch round display. The demo below is the code the bike runs, compiled from the same repository, on a simulated ride.

tap any gauge to open its graph · the CarPlay center is a static screenshot

How it works
800×800
round display, 3.4″ · 235 ppi
586px
largest CarPlay square that fits
6
sensor feeds, all retrofitted
1Hz
telemetry logging, tap for history

Starting point

Wireless CarPlay on a Raspberry Pi

A Raspberry Pi and a Carlinkit adapter can run wireless CarPlay. f-io/pi-carplay proved it first. Navigation lives on this screen; audio stays phone-to-helmet and is never routed through the Pi.

  • AdapterCarlinkit CPC200-CCPA
  • Linkwireless CarPlay, H.264/H.265
  • Audio pathphone → helmet (untouched)

Geometry

The display geometry

CarPlay renders in the largest square that fits the circle. The gauges live in the curved margins around it. Every pill is placed by a clearance model that keeps it off the glass edge.

  • CarPlay square586 × 586 px
  • Gauge margins107 px each side
  • Edge clearance≥ 8 px, verified on-device

Software

The software stack

The dashboard is an Electron app built on LIVI, an open-source head-unit project for the Pi. It supplies the native video pipeline; the gauge overlay, graphs, and sensor integration are this project. The UI follows Apple conventions: one typeface, tabular numerals, capsule controls sized for gloves.

  • VideoGStreamer, hardware H.265
  • Displaycustom Wayland compositor
  • UI typeInter, tabular numerals
  • Tap targets≥ 64 px

Sensors · GPS

Speed, heading, and altitude from GPS

The R75/6 predates electronic engine data, so every number on screen comes from a sensor added to the bike. GPS supplies speed, heading, and altitude without touching a wheel or cable.

  • ReceiverNMEA over USB serial
  • Feedsspeed · heading · altitude · sky view
  • Altitude trimrider-set offset (QNH-style)

Sensors · temperature

Air and CPU temperature

A sealed probe reads ambient air; the Pi reports its own CPU temperature. Its graph marks the 80 °C soft-throttle threshold.

  • AmbientDS18B20, 1-Wire
  • Pi CPUon-die sensor
  • Throttle line80 °C, drawn on the graph

Sensors · engine

Cylinder head temperature

The engine is air-cooled, so head temperature is the earliest warning sign. A K-type thermocouple sits under each spark plug; each has its own amplifier on a shared SPI bus. The reading is embedded in the thermometer's base.

  • Probes2× K-type, 14 mm ring
  • Amplifiers2× MAX31856, SPI
  • Zones<80 cold · 80–140 ok · 140–150 warm · >150 hot

Sensors · motion

Lean, pitch, and G-force

A 9-axis IMU drives the artificial horizon and the G meter. Peak lean and peak G are held until reset. It runs over UART because the Pi 5's I²C controller mishandles this chip's clock stretching.

  • IMUBosch BNO055, 9-DOF fusion
  • BusUART (I²C clock-stretch workaround)
  • Held peakslean L/R · G

Data

Telemetry history

Telemetry is sampled at 1 Hz for the whole session and survives trips into the settings screens. Tapping a gauge opens its history: edge-to-edge chart, zone-tinted trace, min/max, reset with confirm.

  • Sampling1 Hz, all metrics
  • Retentionapp session
  • Chart stylecards, color zones on temps

Display modes

Four background modes

The background behind the gauges can be a solid color, the average color of the current frame, or a blurred sample of the live CarPlay frame, rendered in the native video pipeline. The fourth mode uses CarPlay's own background-extend option: the phone draws its wallpaper across the full circle and the gauges float on it.

The corners here are switching from solid to blur.

  • Solidfixed color
  • Averageframe's average color
  • Blurlive frame, scaled + blurred
  • ExtendCarPlay wallpaper, edge to edge

Tech specs

The complete build, as it runs today.

Display + compute

Panel
3.4″ round, 800×800, 235 ppi
Computer
Raspberry Pi 5
CarPlay link
Carlinkit CPC200-CCPA
Video decode
H.265 hardware, GStreamer
Compositor
custom Wayland (LIVI)

Sensors

GPS
NMEA / USB serial
IMU
BNO055 · UART
CHT ×2
MAX31856 + K-type · SPI
Ambient
DS18B20 · 1-Wire
Pi CPU
on-die thermal

Software

Base
LIVI (Electron + React)
UI typeface
Inter, tabular numerals
Sensor services
Python · systemd --user
This demo
same repo, browser build

Try it

Tap any gauge for its live graph. The ride loops every 100 seconds.

See the code ← More projects