Austin Marvin
The Garage
Where the tin is built. Electronics on the bench, the chassis on the lift, the code in the manual, the jobs on the board. 7 of 10 parts fitted. Mind the oil.
BAY 1The lift
Chassis
Two geared motors, the battery between them, a tin on top. The drawings are from the planning deck; the photographs are the prototype.




BAY 2The bench
Electronics
A Pi Zero 2 W with a voice bonnet and a display bonnet stacked on top. Face, ears and mouth. The motor bonnet underneath does the driving.


Pegboard
- Mint tinBody. The lid is the hood.fitted
- Raspberry Pi Zero 2 WThe brain. Wi-Fi, so the page can talk to it.fitted
- Motor bonnetDrives the two geared motors.fitted
- 1.3 inch display bonnetThe face.fitted
- Voice bonnetEars and mouth.fitted
- Battery packSits in the middle, between the motors.fitted
- Geared motors, twoOne per side. Differential drive, like a tank, or a mint tin.fitted
- Wheels, 40 mm70 mm apart.on order
- CameraFor the remote view, and for looking at you.proposed
- Edge sensorSo it stops at the edge of the desk, mostly.unverified
BAY 3The manual
Programming
What runs on the Pi today is two scripts from 2022, kept as found. What the site speaks is the protocol below; the Pi side of it is the next job on the board.
motor.py the 2022 motor test, Adafruit MotorKit
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT
"""Simple test for using adafruit_motorkit with a DC motor"""
import time
import board
from adafruit_motorkit import MotorKit
kit = MotorKit(i2c=board.I2C())
kit.motor1.throttle = 0.5
time.sleep(0.1)
kit.motor1.throttle = 0
camera.py the 2022 camera test, PiCamera
#!/usr/bin/env python
from picamera import PiCamera
from time import sleep
camera = PiCamera()
camera.start_preview()
sleep(5)
camera.capture('picture.jpg')
camera.stop_preview()
PROTOCOL.md commands and telemetry, v0, shared with the simulator
# Austin Marvin command protocol (v0, 2026-10-04)
The simulator on aheadinto.fun/austin-marvin and the real robot implement the same two messages,
so the page's controls and dashboard drive either. The Pi side is `motor.py` + a small socket server.
## Command, page -> car, 20 Hz, JSON
{"t": <ms since session start>, "l": <-1..1>, "r": <-1..1>}
- `l`, `r`: power for the left and right geared motor. +1 full forward, -1 full reverse.
- The car ramps motors itself (no instant jumps) and STOPS if no command arrives for 300 ms.
## Telemetry, car -> page, 10 Hz, JSON
{"t": ms, "x": m, "z": m, "h": rad, "v": m/s, "w": rad/s, "l": -1..1, "r": -1..1,
"bat": 0..100, "edge": bool, "bump": bool, "mode": "drive"|"auto", "mood": "neutral"|"happy"|"smug"|"sad"|"manic"|"dizzy"|"sleepy",
"persona": id, "say": string|null, "sayAt": ms}
- `persona` is who has the wheel (the personality engine swings it at random); `say` is its last line.
- Pose is in the desk frame: origin at the desk centre, `h` = 0 facing +z. The real car may send
only what it knows (motors, battery, bump from a sensor); the page tolerates missing fields.
## Transport
- Simulator: in-process (`SimTransport`).
- Robot: WebSocket from the page to a relay or directly to the Pi; the Pi camera streams to the
page (WebRTC or MJPEG) as the "Remote" view. To be built when the car is online.
## Geometry assumed by the simulator (from the page's specs)
Tin 95 x 60 mm, 30 mm tall with lid; wheels 70 mm apart, 40 mm diameter; top speed 0.28 m/s.
The simulator’s model lives in src/lib/am/sim.ts: differential drive, a desk edge, two props to bump, a battery, an autopilot. The real car replaces the model, not the page.
BAY 5The portal
Personality
The tin does not have a mood you choose. It has personalities, and it swings between them when it feels like it: time passes, or something knocks it, and someone else has the wheel. You decide who is in the rotation and how twitchy it is, and you can invent your own. The car on the home page follows this bay.
On the bench
Warming up
The rotation 4 of 4 in
- Austin Groovy. Driven.speedwanderpausechatterholds about 45 s · 8 lines · factory
- Marvin Brain the size of a planet. Driven.speedwanderpausechatterholds about 60 s · 7 lines · factory
- Sir Reginald Stately. Unhurried. Occasionally parked.speedwanderpausechatterholds about 50 s · 6 lines · factory
- Gremlin Zero to chaos in 0.3 seconds.speedwanderpausechatterholds about 20 s · 7 lines · factory
Factory personalities: Austin, Marvin, Sir Reginald, Gremlin. Yours are kept in this browser only. The car on the home page picks them up as soon as you save.
BAY 4The board
Jobs and mods
The whiteboard by the door. Done is done, queued is next, parked is an idea with its handbrake on.
- SoftwareDesk simulatorA desk, the tin, two motors, an autopilot. Drives on the site before the car exists.done
- SoftwareCommand protocol v0Commands at 20 Hz, telemetry at 10 Hz, the same two messages for simulator and car.done
- SoftwarePersonality engineFour factory personalities, random swings on a clock or a knock, each one drives and talks its own way. The portal in Bay 5 sets the rotation.done
- SoftwarePi simulatorThe board and its bonnets in the browser, with Asteroids on the 240 x 240 display and on the car's back in the sim.done
- SoftwareSocket server on the Pimotor.py grows up: takes the protocol over a WebSocket, ramps the motors, stops at 300 ms of silence.queued
- SoftwareRemote viewThe Pi camera to the page, WebRTC or MJPEG. Then the site is the remote.queued
- ElectronicsFit the bonnets in the tinPi, motor, display, voice: stacked, and the lid still closes.in progress
- ElectronicsEdge detectionA sensor that notices the end of the desk before the floor does.queued
- ModsCharging dockA parking space. It drives in by itself, or sulks nearby.parked
- ModsScreen petA small window that drives around your actual desktop. A different product, same robot.parked
- ModsThe badge, in chromeA real one, on the lid, to scale.parked
Want to put a job on the board? Enquire. Marvin reads the board. Marvin may not act on it.
