Skip to the content
PCBKitNew board
2 layers96 × 66 mmS3 handheld revA, the printed circuit board in 3D

S3 handheld revA

mhellar/handheld-robodj

A pocket robot-voice DJ on an ESP32-S3. SAM (the 1982 Software Automatic Mouth speech synth) pre-renders a bank of words into memory, and a "turntable deck" plays, scratches, stutters and reverses them over a drum…

Size
96 × 66 mm
Copper layers
2
Thickness
1.6 mm
Parts
12
Nets
20
Pads
54
Tracks, vias
65, 0
Pours
1
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
3 Oct 2026
Updated
3 Oct 2026

Overview

S3 handheld revA is an open-source printed circuit board by mhellar, from the mhellar/handheld-robodj repository on GitHub, published under the GPL-3.0 licence. It is a 2-layer board of 96 × 66 mm with 12 parts on 20 nets, routed with 65 tracks and 0 vias.

Its parts include 4 ICs and 4 switches. It belongs with the ESP32 boards of this library.

README

README.md

Handheld Robo DJ

A pocket robot-voice DJ on an ESP32-S3. SAM (the 1982 Software Automatic Mouth speech synth) pre-renders a bank of words into memory, and a "turntable deck" plays, scratches, stutters and reverses them over a drum machine, with a 16-step sequencer, granular and vocoder voice effects and a sci-fi HUD on a 128x128 OLED. Four buttons, one speaker.

The board is a single-sided PCB designed to be milled on a desktop CNC (all copper on the bottom, big pads, no jumper wires). The modules plug into female headers, so there's no SMD soldering.

board layout

What's in here

FolderContents
firmware/handheld_robodj/The Robo DJ sketch (Arduino), SAM's C core bundled alongside
firmware/handheld_bringup/Bring-up / test sketch: I2C scan, buttons, joystick, OLED, beep. Flash this first
hardware/kicad/KiCad project (schematic, PCB, custom symbols + footprints in s3_cnc.pretty)
hardware/cnc/Gerbers + Excellon drills, ready-made G-code for a Genmitsu Cubiko (GRBL), the FlatCAM script, a 1:1 print for checking parts fit, and CNC_CHEATSHEET.txt
docs/Board layout image

Parts

RefPartNotes
U1ESP32-S3 SuperMini2x 1x9 female headers. One with PSRAM (e.g. 4 MB flash / 2 MB PSRAM) holds the most words
U2MAX98357A I2S amp breakout1x7 female header, VIN on 5 V, plus a small 4-8 ohm speaker
U31.5" 128x128 OLED, SH1107, I2C1x4 female header (VCC GND SCL SDA), e.g. GME128128-01-IIC
U4KY-023 joystick module1x5 female header. Swap its right-angle pins for straight ones. Not used by Robo DJ, the bring-up sketch tests it
SW1-SW46 mm tact buttonsthe diamond: UP / LEFT / RIGHT / DOWN
100 x 70 mm single-sided copper cladboard is 96 x 66 mm, M3 holes

Pinout

FunctionGPIO
OLED SDA / SCL11 / 12
Amp DIN / BCLK / LRC1 / 2 / 3
Buttons UP / RIGHT / LEFT / DOWN7 / 6 / 5 / 4 (to GND, internal pull-ups)
Joystick X / Y / SW10 / 9 / 8 (on 3V3)

Build the firmware

  1. Arduino IDE (or arduino-cli) with the ESP32 core 3.x and the U8g2 library.
  2. Board settings: ESP32S3 Dev Module, USB CDC On Boot: Enabled, PSRAM: QSPI PSRAM (it runs without PSRAM, with fewer words). arduino-cli FQBN: esp32:esp32:esp32s3:CDCOnBoot=cdc,PSRAM=enabled
  3. Open firmware/handheld_robodj/handheld_robodj.ino and upload. Flash handheld_bringup first if you're bringing up a fresh board.
text
arduino-cli compile --fqbn esp32:esp32:esp32s3:CDCOnBoot=cdc,PSRAM=enabled firmware/handheld_robodj
arduino-cli upload  --fqbn esp32:esp32:esp32s3:CDCOnBoot=cdc,PSRAM=enabled -p COMx firmware/handheld_robodj

Tips:

  • The OLED uses the U8G2_SH1107_PIMORONI_128X128 constructor. The generic SH1107 one shifts the picture by 32 px.
  • If the SuperMini sits silent after an upload, press its RST button. The auto-reset can leave it in the bootloader.
  • Intermittent buttons on a milled board usually turn out to be a solder bridge between neighbouring 2.54 mm pads.
  • handheld_bringup prints to Serial every 250 ms: run it with a serial monitor open.

Controls

Diamond: UP = SHIFT, LEFT = VOICE, RIGHT = BEAT, DOWN = FX. Live hits play instantly. With REC on they're quantized into the 16 steps.

Buttontapdoubletriplehold
VOICEsay the wordnext wordrandom wordSCRATCH it (tempo-synced)
BEATkicksnareclaphi-hat roll
FXnext FXGROOVE on/offSTUTTER
SHIFT + VOICEREC on/offclear voice trackclear allREVERSE
SHIFT + BEATnext scratch styletempochord progressionTAPE STOP
SHIFT + FXvolumenext robot voice (re-renders the words)
SHIFT aloneMUTATE (new words, same rhythm)AUTO (random beat + words)UNDERWATER
  • Voice FX: CLEAN, CRUSH, ECHO, GRAIN (slow cloud of grains at mixed pitches), SWARM (dense detuned robot choir), VOX (16-band vocoder on a chord, words stay clear), CHOIR (pure vocoder).
  • Scratch styles: BABY, CHIRP, TRANSFORM, TEAR, FLARE.
  • Robot voices: ROBOT, SAM, ELF, E.T., STUFFY, OLD LADY.
  • Words: HELLO, ROBOT, YEAH, ERROR, DANCE, BEEP, BOOP, SYSTEM, ONLINE, WOW, FRESH, SCRATCH, ONE-FOUR, OH NO, COMPUTER, PARTY, FUNKY, AWESOME, DOES NOT COMPUTE. Edit bank[] in the sketch to make it say anything.

Make the board

The PCB is single-sided with all copper on B.Cu, made for isolation milling. The Gerbers in hardware/cnc/ also work at a board house as a 1-layer board.

Milling order (details in hardware/cnc/CNC_CHEATSHEET.txt): 0.1 mm 20° V-bit isolation, 1.0 mm drill, 2.0 mm drill, then V-bit outline score. The .nc files are ready to run on a GRBL machine. The drill files are already patched by fix_drill_spinup.py, which fixes the spindle start for GRBL laser mode. To regenerate with FlatCAM, set the path at the top of load_and_mirror.tcl and run it (File > Scripting > Run Script). It mirrors the board, because the copper is on the bottom.

Before milling, print PRINT_1to1_fit_test.pdf at 100% and check your modules against it. The OLED and joystick outlines were measured from photos.

Credits and license

  • SAM (Software Automatic Mouth) by Mark Barton / Don't Ask Software (1982). C port by Sebastian Macke, ESP8266SAM by Earle F. Philhower III. The C core is bundled in firmware/handheld_robodj/.
  • U8g2 by olikraus; esp-dsp and the ESP32 Arduino core by Espressif.
  • Co-created by Mark Hellar and Claude (Anthropic). PCB milled and soldered by Mark Hellar.

Licensed under the GNU GPL v3 (see LICENSE), the same as the bundled SAM core.

Parts

12
QtyValueFootprintReferences
4MountingHole_3.2mm_M3MountingHole:MountingHole_3.2mm_M3H1, H2, H3, H4
1BTN_DOWNs3_cnc:SW_Tact_6mm_CNCSW4
1BTN_LEFTs3_cnc:SW_Tact_6mm_CNCSW2
1BTN_RIGHTs3_cnc:SW_Tact_6mm_CNCSW3
1BTN_UPs3_cnc:SW_Tact_6mm_CNCSW1
1ESP32-S3_SuperMinis3_cnc:ESP32-S3_SuperMini_CNCU1
1KY-023 joysticks3_cnc:Joystick_KY023_CNCU4
1MAX98357As3_cnc:MAX98357A_Module_CNCU2
1OLED 1.5in SH1107s3_cnc:OLED_1.5in_128x128_I2C_CNCU3

Questions

How big is the S3 handheld revA PCB?

It measures 96 × 66 mm and has 2 copper layers, 1.6 mm thick.

What parts does the S3 handheld revA use?

12 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the S3 handheld revA KiCad files?

From the mhellar/handheld-robodj repository on GitHub, at the commit this page was made from: the board is hardware/kicad/s3_handheld_revA.kicad_pcb and its schematic hardware/kicad/s3_handheld_revA.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the S3 handheld revA design in my own project?

Its repository publishes it under the GPL-3.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 2 layersNrf bga, the printed circuit board in 3D

    Nrf bga

    github-linguist/linguist

    Language Savant. If your repository's language is being reported incorrectly, send us a pull request!

    12 parts14kMIT
  • 2 layers66.9 × 74.5 mmDeskHop, the printed circuit board in 3D

    DeskHop

    hrvach/deskhop

    Fast Desktop Switching Device

    12 parts7.9kGPL-3.0
  • 2 layers40 × 15 mmSensors, the printed circuit board in 3D

    Sensors

    google/mozc-devices

    Circuit diagrams and firmware source code for Gboard DIY keyboards

    12 parts3kApache-2.0
  • 2 layers42.7 × 56.5 mmTle6240 driver, the printed circuit board in 3D

    Tle6240 driver

    rusefi/rusefi

    rusefi - GPL internal combustion engine control unit

    12 parts1.2k
  • 2 layers49 × 25 mm5v boost regulator, the printed circuit board in 3D

    5v boost regulator

    hackclub/OnBoard

    💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

    12 parts915
  • 2 layers28.3 × 10.3 mmTap Photosensor PCB, the printed circuit board in 3D

    Tap Photosensor PCB

    VoronDesign/Voron-Tap

    Tap is a nozzle-based z-probe for the V2 and Trident printer designs. The entire toolhead moves to trigger an optical switch. Tap offers many advantages:

    12 parts716GPL-3.0
  • 2 layers25.4 × 70.4 mmTpmsniffer, the printed circuit board in 3D

    Tpmsniffer

    stacksmashing/pico-tpmsniffer

    A simple, very experimental TPM sniffer for LPC bus

    12 parts696