ESP32 · Firmware

Firmware for the browser-brained Otto.

OttoBot v3 embeds a full web control surface directly into the ESP32 — streaming camera, live voice, OLED status, and gesture controls, all served by the robot itself. No cloud, no app install.

ESP32-S3·I2S audio·OV camera·FreeRTOS
36
workspace commits
15+
firmware patches
1
embedded web UI
0
cloud dependency
Capabilities

Everything the robot does lives on the chip.

The web UI is compiled into the firmware. Point a browser at the device and you get a live control surface — no backend, no separate host, no setup.

Camera streaming

Snapshot and live frames streamed straight from the ESP32 over the embedded web server, with post-stream cleanup to keep the pipeline stable.

Voice over I2S

Audio capture routed through I2S with TX-channel init fixed at boot — the root cause of silent output — plus raw PCM path cleanup.

OLED status

On-device display shows live state — network, streaming, and diagnostics — so the robot communicates its health without a screen attached.

Gesture & motion

Dithered fills and an expression grid give the robot character — expressive, physical responses driven by on-chip logic.

Real-time status

Embedded HTML served at flash time via CMake, so the interface the browser sees always matches the firmware that's actually running.

Single-binary deployment

One flash, one self-contained device. The browser brain and the robot body ship together — no external dependencies to keep in sync.

Architecture

A single chip, a self-hosted brain.

The web control surface is baked into the firmware at build time, then served by the device itself.

main/
├─ CMakeLists.txt # embeds ../index.html into firmware
├─ index.html ← browser control surface
├─ partitions.csv
└─ [ESP32] HTTP server → camera · audio · OLED · motion
 
mcp/
└─ ottobot_mcp.py ← MCP bridge for tooling
 
patches/ # 15+ targeted firmware patches
└─ 0001–0008 # I2S TX init · camera snapshot · stream cleanup · OLED status
Development

Built in deliberate stages.

Each milestone shipped as isolated patches, so the firmware stays auditable and the browser brain stays in lockstep with the hardware.

Core

I2S & capture

Fixed TX-channel init at boot, enabled camera snapshot with JSON metadata, and cleaned up the streaming pipeline.

Interface

Embedded web UI

Built and baked the browser control surface into the firmware — the robot serves its own dashboard.

Presence

OLED & expression

On-device status display plus dithered fills and an expression grid for physical, characterful responses.

Self-hosted. Self-served. No cloud.

A robot that carries its own brain and its own interface. Flash it, connect, and open the browser.