Canonical hardware reference for the Tiny Engineer robot.
Firmware pin constants live in include/pins.h. The default build is the main control board (main-control-board.md). The advanced path wires separate breakouts (wiring.md + drawio) when you add modules the board does not support. Same nets and firmware.
Source of truth: firmware include/pins.h, then this docs/hardware/ set. Modular topology: docs/wiring/. PCB connectivity: board expected-nets.yml / netlist per pcb.md.
| Audience | Use this set for |
|---|---|
| Human | Assembly, wiring, power, bring-up, debugging |
| Firmware agent | Pin map, buses, voltages, servo PWM conventions, test sequence |
Small desktop robot with:
- 5 analog micro servos (head, neck, hands, body — robot-movement.md)
- I2C OLED status display
- I2S speaker for tones and WAV playback
- ESP32-C3 Wi-Fi for HTTP control and AI hooks
Firmware (src/main.cpp) is the robot application: Wi-Fi, settings, hardware tests, animations, and the JSON API.
One ESP32-C3 module owns all logic. Servo PWM is offloaded to a PCA9685 so pulse generation does not depend on ESP32 timing. Audio is I2S into a class-D amp. Display and servo driver share one I2C bus. On the default build those chips are on the main control board. The advanced path puts the same chips on breakouts — the diagram is the same either way.
flowchart TB
USB["USB 5V / GND<br/>as drawn"]
subgraph p5["5 V power domain"]
ESP5["ESP32 5V"]
PCA5["PCA9685 5V"]
PCAVplus["PCA9685 V+"]
MAXVIN["MAX98357A Vin"]
SERVOS["Servo 5V"]
end
subgraph p33["3.3 V logic domain"]
ESP["ESP32-C3-Zero"]
PCA["PCA9685 VCC"]
OLED["OLED VCC"]
end
USB -->|"5V"| ESP5
USB -->|"5V"| PCA5
USB -->|"5V"| MAXVIN
PCA5 --> PCAVplus
PCAVplus --> SERVOS
ESP5 --> ESP
ESP -->|"3V3"| PCA
ESP -->|"3V3"| OLED
ESP -->|"GP0 SDA / GP1 SCL"| PCA
ESP -->|"GP0 SDA / GP1 SCL"| OLED
ESP -->|"GP2 BCLK / GP3 LRC / GP4 DIN"| MAXVIN
PCA -->|"PWM"| SERVOS
Speaker SPK+/SPK-: main-control-board.md. The modular PNG omits them — wiring.md.
| Domain | Voltage | What lives there |
|---|---|---|
| Power rail | +5V | USB 5V → ESP32 5V, PCA9685 5V, MAX98357A Vin; PCA9685 V+ → servo 5V |
| Logic | 3V3 | ESP32 GPIO, PCA9685 VCC, OLED VCC, I2C, I2S |
| Ground | GND | Every module — common ground is mandatory |
Warning
Never power the servos from the ESP32 3.3 V regulator.
Warning
MAX98357A SPK- is not ground. Speaker connects between SPK+ and SPK- only.
| Role | Main control board (default) | Advanced breakouts | Qty |
|---|---|---|---|
| Controller | Waveshare ESP32-C3-Zero (plugs into board sockets) | same | 1 |
| Servo PWM | PCA9685 on PCB | Adafruit PCA9685 breakout | 1 |
| Actuators | Analog micro servos — Tower Pro SG90 recommended; Feetech FS0307 / EMAX ES9051 compact; PowerHD HD-1370A still supported | same | 5 |
| Audio amp | MAX98357A on PCB | MAX98357A breakout | 1 |
| Speaker | Adafruit Mini Oval Speaker - 8 Ohm 1 Watt | same | 1 |
| Display | Waveshare 0.91inch OLED Module (SSD1306, 128×32, I2C) | same | 1 |
| Robot USB | USB-C on PCB | Adafruit 5993 USB-C breakout | 1 |
Carts: shopping.md. Spec detail: components.md. Connect: main-control-board.md.
| Bus | ESP32 pins | Devices |
|---|---|---|
| I2C | GP0/SDA, GP1/SCL (Waveshare OLED SCL) | PCA9685 0x40, SSD1306 0x3C |
| I2S | GP2/BCLK, GP3/LRC, GP4/DIN | MAX98357A |
| Servo PWM | (none on ESP32) | PCA9685 channels 0–4 @ 50 Hz |
| USB | Board USB-C (VBUS/GND + D+/D− → GP19/GP18). Advanced path: 5993 — wiring.md | Power, flash, serial CDC |
Details: interfaces.md, pinout.md.
Single nominal +5V supply via the main control board USB-C. ESP32 onboard LDO makes 3V3 for logic only. PCA9685 V+ (servos) is electrically separate from PCA9685 VCC (logic). The advanced path brings 5 V in through an Adafruit 5993 — wiring.md.
Prefer a 5 V / ≥2 A source with margin. Details: power.md.
| File | Contents |
|---|---|
| ../shopping.md | Default cart; advanced extra modules |
| main-control-board.md | Default connect: ESP32, OLED, servos, speaker |
| order-main-control-board.md | Order the PCB / PCBA (any fab; JLCPCB walkthrough) |
| components.md | Inventory, voltages, limits |
| pinout.md | GPIO map + allocation rules |
| wiring.md | Advanced: breakout harness |
| ../3d/assembly-modular.md | Advanced: mount breakouts in the desk |
| power.md | Budget, brownout symptoms, single-USB policy |
| servos.md | PWM, test limits, safe ranges |
| interfaces.md | I2C / I2S / PWM / USB |
| testing.md | Bring-up sequence, failures, what to check |
Modular schematic sketch: docs/wiring/Tiny Engineer.drawio / PNG. KiCad: hardware/boards/; contribution rules: docs/pcb.md.
- Repository firmware /
include/pins.h - This
docs/hardware/set; modular nets also indocs/wiring/; PCB nets via board expected-nets / netlist - Component datasheets