Plate 1 · Black
Body, Lid, Base, Deck, Speaker ring, Hinge, Switch (key) bracket, Encoder bracket, Stem cap
Build guide
A 77 mm ESP32-S3 desk box with a record knob and a tonearm: the tonearm is a push button, the knob a rotary encoder, with a mic, a speaker and an LED glow inside. Bring your own firmware.
Your kit contains the printed parts, electronics, screws, pivot pin, four feet, headers, jumpers, wire and heat-shrink. Start with the checklist below; you do not need a 3D printer. Firmware is up to you: see Make it yours.
| Size | Qty | Where | |
|---|---|---|---|
| M3 × 6 | 4 | Base, into the body from the sides | |
| M3 × 6 | 2 | Encoder bracket, from the top of the lid | |
| M3 × 8 | 4 | Lid corners | |
| M3 × 10 | 2 | Hinge, from inside the lid | |
| M3 × 5 | 2 | Switch bracket, from the top of the lid | |
| M3 nut | 1 | Tonearm weight, already embedded in the supplied part | |
| M2 × 4–6 | 2 | Microphone posts | |
| M2 × 4–6 | 2 | Amplifier posts | |
| Supplied pivot pin, 1.75 mm × ~15 mm | 1 | Tonearm pivot pin | |
| Small self-adhesive rubber feet, about 8–10 mm | 4 | Under the plinth |
Screws thread straight into printed pilot holes. Use socket head screws. No inserts, magnets or glue.
Every module goes straight to the S3, no breadboard. Check your board’s silkscreen first, because some clones swap the header rows.
| Module | Pin | ESP32-S3 | Wire |
|---|---|---|---|
| INMP441 mic | SCK | GPIO 4 | Dupont |
| WS | GPIO 5 | ||
| SD | GPIO 6 | ||
| L/R | GPIO 7 (drive LOW) | ||
| VDD | 3V3 · never 5 V | ||
| GND | GND | ||
| MAX98357A amp | BCLK | GPIO 15 | Dupont |
| LRC | GPIO 16 | ||
| DIN | GPIO 17 | ||
| VIN | 5V (check USB power path) | ||
| GND | GND | ||
| GAIN, SD | not connected | ||
| + / − | speaker, screw terminal | ||
| KY-040 encoder | CLK (A) | GPIO 10 | Dupont |
| DT (B) | GPIO 11 | ||
| SW | GPIO 12 | ||
| + | 3V3 | ||
| GND | GND | ||
| MX switch | leg 1 | GPIO 13 | soldered |
| leg 2 | GPIO 14 (drive LOW) | ||
| 8x8 WS2812 | DIN | GPIO 8 | soldered |
| 5V | 5V (USB 5Vin) | ||
| GND | GND |
Screws 2× M2 (amp)
Electronics are drawn as simple blocks: green = boards. The speaker is hidden under the deck.
Screws 2× M2×4–6 (mic) · 4× M3×6 (base)
Screws 2× M3×5 · 2× M3×6 · 2× M3×10
Blue = KY-040, grey = MX switch.
Screws 4× M3×8
Screws supplied pivot pin
Screws 4× rubber feet
Buddybox ships without firmware. The hardware is a standard ESP32-S3 with an I2S mic, an I2S amp, a rotary encoder, a button (the tonearm switch) and the supplied LED matrix, so you can write your own. Two ways:
pip install esphome on a computer.secrets.yaml, never in a file you share.Minimal skeleton, written for this guide. Adjust it and check the ESPHome docs for your version. Add a media_player (speaker platform) to play music or announcements on it.
esphome:
name: buddybox
on_boot:
priority: 800
then:
- output.turn_off: mic_lr # mic L/R must be LOW (left channel)
- output.turn_off: button_gnd # the switch's second leg acts as ground
esp32:
board: esp32-s3-devkitc-1
framework:
type: esp-idf
logger:
api:
encryption:
key: !secret api_key
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
output:
- platform: gpio
id: mic_lr
pin: GPIO7
- platform: gpio
id: button_gnd
pin: GPIO14
i2s_audio:
- id: i2s_in
i2s_lrclk_pin: GPIO5
i2s_bclk_pin: GPIO4
- id: i2s_out
i2s_lrclk_pin: GPIO16
i2s_bclk_pin: GPIO15
microphone:
- platform: i2s_audio
id: mic
i2s_audio_id: i2s_in
i2s_din_pin: GPIO6
adc_type: external
channel: left
speaker:
- platform: i2s_audio
id: amp
i2s_audio_id: i2s_out
i2s_dout_pin: GPIO17
dac_type: external
voice_assistant:
microphone: mic
speaker: amp
sensor:
- platform: rotary_encoder
name: Knob
pin_a: { number: GPIO10, mode: INPUT_PULLUP }
pin_b: { number: GPIO11, mode: INPUT_PULLUP }
binary_sensor:
- platform: gpio
name: Knob button
pin: { number: GPIO12, mode: INPUT_PULLUP, inverted: true }
- platform: gpio
name: Tonearm
pin: { number: GPIO13, mode: INPUT_PULLUP, inverted: true }
on_press:
- voice_assistant.start:
on_release:
- voice_assistant.stop:
light:
- platform: esp32_rmt_led_strip
name: Glow
pin: GPIO8
num_leds: 64
rgb_order: GRB
chipset: WS2812
color_correct: [10%, 10%, 10%] # start with a low brightness
Any AI coding assistant can draft firmware (ESPHome YAML, Arduino or ESP-IDF) from a clear hardware description. Paste this and adapt the last paragraph:
I built a desk device on an ESP32-S3 DevKitC-1 (N16R8, 16 MB flash, octal PSRAM).
Hardware and pins:
- INMP441 I2S microphone: SCK GPIO4, WS GPIO5, SD GPIO6, L/R on GPIO7 (drive LOW), VDD 3V3
- MAX98357A I2S amplifier: BCLK GPIO15, LRC GPIO16, DIN GPIO17, VIN 5V; 40 mm speaker
- KY-040 rotary encoder: CLK GPIO10, DT GPIO11, SW GPIO12 (push button), + 3V3
- Push button (MX switch): one leg GPIO13, the other leg GPIO14 (drive LOW as ground)
- 8x8 WS2812 LED matrix: DIN GPIO8, powered from USB 5V (start with low brightness; match the panel’s data-level requirements)
Mic and amp are on separate I2S buses.
Write ESPHome YAML for Home Assistant: hold the button to talk to the voice assistant,
turn the knob for volume, click it to play/pause, and show a colour on the matrix
while listening. Keep Wi-Fi and keys in secrets.yaml.
Skip this section if you bought the kit: the printed parts are supplied. If you bought the digital files, follow the settings supplied with your download. The plate layout below describes the pictured reference print.
Print time is the slicer estimate for a Bambu Lab P1S; Bambu Studio's GUI may show more.
Bambu Lab P1S, 0.4 mm nozzle · 0.20 mm layers · 2 walls · 4 top / 3 bottom · 20 % cubic · no supports · auto brim · Textured PEI · eSUN PLA+.
Body, Lid, Base, Deck, Speaker ring, Hinge, Switch (key) bracket, Encoder bracket, Stem cap
Record knob, Record ring (grooved), Tonearm
Light plinth