Skip to the content
PCBKitNew board
2 layers85 × 45 mmBench, the printed circuit board in 3D

Wi-Fi upload dock for Arduino

Size
85 × 45 mm
Copper layers
2
Thickness
1.6 mm
Parts
58
Nets
63
Pads
206
Tracks, vias
316, 115
Pours
1
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
22 Jul 2026
Updated
21 Aug 2026

Overview

Bench is an open-source printed circuit board by Amir-Vered, from the Amir-Vered/Bench repository on GitHub, published under the CERN-OHL-P-2.0 licence. It is a 2-layer board of 85 × 45 mm with 58 parts on 63 nets, routed with 316 tracks and 115 vias.

It is built around the ESP32-S3-WROOM-1-N8R8, TLV62569DBVR-TP and TPS2553DBV, with the USBLC6-2SC6 among its other parts. Its parts include 17 resistors, 9 capacitors, 4 ICs, 3 connectors and 1 diode. It belongs with the ESP32 boards of this library.

Main components

4

README

README.md

Bench

Bench Rev A render

Status Hardware Firmware Software

🎥 Video  •  🌐 Writeup

Project Goals • System Overview • Diagrams • Hardware • Software • License


Bench... and it's not made out of wood?

Here's the pitch:

TL;DR wires are annoying, let's put Bench in the middle of the Arduino workflow.

I love Arduino, it's perfect for prototyping your projects before making your PCBs. But, idk about you, the most annoying thing to me is the fact that the board is tied to my laptop. And it's not a graceful connection, no, these wires are some of the most stale twisted things you've ever used, especially the uni lab ones. This gets even worse when you're using a desktop computer. But what if we put a device in the middle?

Enter: Bench.

Bench is a wifi upload dock for Arduino (built primarily for the Uno R3 because it's the one I use most). Compile your sketch, run a command, and boom, it uploads to your device somewhere else. No more wire, Arduino dev becomes a little less life-draining.

This is a simple little project, but it's open source, and I hope you find some use out of it. Feel free to leave issues, fork, or really do whatever you want with it.

Project Goals

My goals for this project were to:

  • Improve the Arduino dev experience
  • Develop my hardware, firmware, and software design skills
  • Document a project from beginning to end

System Overview

Let's get into the details.

At a high level:

  1. The laptop compiles an Arduino sketch into a .hex file.
  2. The CLI sends the .hex file to Bench over Wi-Fi.
  3. The ESP32-S3 on Bench receives the upload request.
  4. Bench opens a USB host serial connection to the Arduino Uno R3.
  5. Bench triggers the Uno bootloader window.
  6. Bench uploads the program to the ATmega328P flash memory.

Bench does not compile Arduino code on-board; compilation happens on the laptop.

Diagrams

Labeled Board

Bench Rev A labeled board

System Block Diagram

Bench Rev A system block diagram

Power Path

Bench Rev A power path

Upload/Data Flow

Bench Rev A data flow

Repository Structure

text
bench/
├── hardware/
│   ├── kicad/
│   └── exports/
├── software/
│   ├── mock/
│   │   └── bench-mock-server/
│   ├── cli/
│   │   └── bench-upload/
│   └── firmware/
│       └── bench-fw/
├── media/
│   ├── diagrams/
│   ├── renders/
│   └── screenshots/
├── LICENSE-SOFTWARE
├── LICENSE-HARDWARE
└── README.md

Hardware

Bench is built around the ESP32-S3-WROOM-1.

Major hardware blocks include:

  • USB-C 5V input
  • Input protection using a PTC fuse and TVS diode
  • 3.3V buck regulator for the ESP32-S3
  • ESP32-S3-WROOM-1 Wi-Fi microcontroller
  • USB-A host output for the Arduino Uno R3
  • TPS2553 current-limited USB power switch
  • USB data ESD protection
  • Status LEDs for power, Wi-Fi, target, upload, and fault states
  • Reset and boot/config buttons

Software

Bench includes three software components:

text
software/
├── mock/
│   └── bench-mock-server/
├── cli/
│   └── bench-upload/
└── firmware/
    └── bench-fw/

Mock Server

The mock server simulates a Bench device on a local computer. It is used to test the CLI without Bench hardware.

powershell
cd software\mock\bench-mock-server
python -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -e .
bench-mock --port 8080

Test the mock server:

text
http://127.0.0.1:8080/api/v1/status

CLI

The Bench Upload CLI runs on the laptop, and can communicate with the firmware or mock server.

powershell
cd software\cli\bench-upload
python -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -e .
Here's how to use the commands, demoed on the mock server...

Check Bench status:

powershell
bench status --device http://localhost:8080

Upload a precompiled Intel HEX file:

powershell
bench upload --hex path\to\sketch.ino.hex --device http://localhost:8080

Upload without target reset:

powershell
bench upload --hex path\to\sketch.ino.hex --no-reset --device http://localhost:8080

Upload without verify:

powershell
bench upload --hex path\to\sketch.ino.hex --no-verify --device http://localhost:8080

Compile an Arduino sketch with Arduino CLI, then upload:

powershell
bench upload path\to\Blink --fqbn arduino:avr:uno --device http://localhost:8080

Firmware

The firmware is an ESP-IDF project for the ESP32-S3.

powershell
cd software\firmware\bench-fw
idf.py set-target esp32s3
idf.py build

Wi-Fi settings are configured locally with:

powershell
idf.py menuconfig

Then open:

text
Bench Configuration

and set:

text
Wi-Fi SSID
Wi-Fi password

Firmware Features

Current firmware includes:

  • Wi-Fi station startup
  • HTTP API server
    • GET /api/v1/status
    • POST /api/v1/target/power
    • POST /api/v1/target/reset
    • GET /api/v1/logs
    • POST /api/v1/upload
    • GET /api/v1/upload/{job_id}
  • ESP32-S3 USB host CDC
  • Arduino Uno R3 Optiboot/STK500 upload path (🤞😩)
  • GPIO control for TPS2553 target power
  • GPIO control for status LEDs

The firmware builds successfully for ESP32-S3, but I haven't had the chance to test it on hardware, so be careful.

API Overview

Bench firmware and the mock server expose the same main HTTP API shape.

text
GET  /api/v1/status
POST /api/v1/upload
GET  /api/v1/upload/{job_id}
POST /api/v1/target/power
POST /api/v1/target/reset
GET  /api/v1/logs

Primary upload states:

text
idle
receiving
opening_target
bootloader_sync
uploading
verifying
success
failed
fault

Primary error codes:

text
INVALID_HEX
NO_TARGET
POWER_FAULT
USB_OPEN_FAILED
BOOTLOADER_TIMEOUT
UPLOAD_FAILED
VERIFY_FAILED
POWER_DISABLED

Current Status

Bench Rev A is a complete prototype, but I haven't had the chance to fabricate it yet.

I'm confident in my hardware and software design, but the firmware, well, let's just say it was my first time programming an ESP32-S3... 😅

Something else pretty cool about this project is the documentation. I've created a video, a post on my website, this repo, and so much more, with full diagrams and explanations. It's been part of my goal to build more in public, and this is one of the projects I'm most proud of so far. My chess board (ICB, 1/26-6/26) was awesome, but its docs were scattered. Bench is hopefully the start of a more cohesive online doc cycle, stay tuned for more.

In terms of future Bench additions, if there is a Rev B, expect:

  • more in-depth CLI
  • hardware redesign, maybe
  • 3D printable exterior / mounts
  • and more

License

  • Software: Licensed under the MIT License.
  • Hardware: Schematics and PCB layouts are licensed under the CERN-OHL-P-2.0 (CERN Open Hardware Licence Version 2 - Permissive).
  • Media & Documentation: Renders, diagrams, and written assets are © 2026 Amir Vered unless otherwise stated. All rights reserved.

Parts

58
QtyValueFootprintReferences
51kResistor_SMD:R_0603_1608MetricR11, R12, R13, R14, R15
40.1uFCapacitor_SMD:C_0603_1608MetricC2, C5, C7, C9
410uFCapacitor_SMD:C_0805_2012MetricC1, C3, C4, C6
3100kResistor_SMD:R_0603_1608MetricR4, R5, R9
310kResistor_SMD:R_0603_1608MetricR6, R7, R10
222RResistor_SMD:R_0603_1608MetricR16, R17
25.1kResistor_SMD:R_0603_1608MetricR1, R2
1120uFCapacitor_SMD:CP_Elec_6.3x5.8C8
11A holdFuse:Fuse_1812_4532MetricF1
12.2uHInductor_SMD:L_Bourns-SRN4018L1
1453kResistor_SMD:R_0603_1608MetricR3
159kResistor_SMD:R_0603_1608MetricR8
1BootButton_Switch_SMD:SW_SPST_TL3342Boot
1ESP32-S3-WROOM-1-N8R8RF_Module:ESP32-S3-WROOM-1U2
1J_ESP_PROGConnector_PinHeader_2.54mm:PinHeader_1x06_P2.54mm_VerticalJ2
1LED_FAULTLED_SMD:LED_0603_1608MetricFLT
1LED_PWRLED_SMD:LED_0603_1608MetricPWR
1LED_TARGETLED_SMD:LED_0603_1608MetricTRG
1LED_UPLOADLED_SMD:LED_0603_1608MetricUPL
1LED_WIFILED_SMD:LED_0603_1608MetricWIFI
1ResetButton_Switch_SMD:SW_SPST_TL3342Reset
1TLV62569DBVRPackage_TO_SOT_SMD:SOT-23-5U1
1TPS2553DBVPackage_TO_SOT_SMD:SOT-23-6U4
1TP_3V3TestPoint:TestPoint_Pad_D1.0mmTP2
1TP_5V_PROTECTEDTestPoint:TestPoint_Pad_D1.0mmTP1
1TP_ESP_BOOTTestPoint:TestPoint_Pad_D1.0mmTP10
1TP_ESP_ENTestPoint:TestPoint_Pad_D1.0mmTP11
1TP_GNDTestPoint:TestPoint_Pad_D1.0mmTP5
1TP_TPS_ENTestPoint:TestPoint_Pad_D1.0mmTP9
1TP_TPS_FAULTTestPoint:TestPoint_Pad_D1.0mmTP8
1TP_USB_A_VBUSTestPoint:TestPoint_Pad_D1.0mmTP4
1TP_USB_D+TestPoint:TestPoint_Pad_D1.0mmTP7
1TP_USB_D-TestPoint:TestPoint_Pad_D1.0mmTP6
1TP_VBUS_INTestPoint:TestPoint_Pad_D1.0mmTP3
1TSD05Diode_SMD:D_SOD-323D1
1USBLC6-2SC6Package_TO_SOT_SMD:SOT-23-6U3
1USB_AConnector_USB:USB_A_Wuerth_614004134726_HorizontalJ3
1USB_CConnector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12J1

The 54 most common of 58 parts.

Questions

How big is the Bench PCB?

It measures 85 × 45 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Bench use?

58 parts, built around the ESP32-S3-WROOM-1-N8R8, TLV62569DBVR-TP, TPS2553DBV and USBLC6-2SC6. 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 Bench KiCad files?

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

Can I use the Bench design in my own project?

Its repository publishes it under the CERN-OHL-P-2.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

  • 4 layers66 × 90 mmIctester, the printed circuit board in 3D

    Ictester

    jakubfi/ictester

    Logic IC tester

    104 parts79
  • 6 layers140 × 100 mmSbc baseboard, the printed circuit board in 3D

    Sbc baseboard

    calicopizzadelivery/sbc-development-baseboard

    Baseboard for remote management of an attached SBC: K64 MCU as USB HID to the target and Ethernet to the workstation, six switched USB-A ports, isolated SPDT relays, level-shifted console, switched target power

    271 partsApache-2.0
  • 2 layers75 × 60 mmCircuit design, the printed circuit board in 3D

    Circuit design

    heresiarch/esp32-wifi-eth-gateway

    This is proof of concept of a Wifi to Ethernet Gateway with ESP32

    10 parts1Apache-2.0
  • 4 layers100 × 60 mmKigeyes power io board, the printed circuit board in 3D

    Kigeyes power io board

    jrymk/KigEyes

    Video passthrough and electronic eye for Kigurumi masks

    280 parts
  • 2 layers90 × 60 mmFanCtrl3-Pro, the printed circuit board in 3D

    FanCtrl3-Pro

    mikagosz/FanCtrl3

    USB-powered controller for three 4-pin PWM fans, driven by the CPU temperature of a Proxmox VE host - KiCad, MicroPython, OpenSCAD

    39 partsMIT
  • 4 layers106 × 110 mmRearCircuitBoard 10, the printed circuit board in 3D

    RearCircuitBoard 10

    ssbingo/samba-solar-track

    Samba Solar Track – Solarnachführung mit Sturmschutz: Handbuch, Platine und Gehäuse für den Nachbau (10,1-Zoll-Version)

    329 parts
  • 4 layers42 × 100 mmPsu, the printed circuit board in 3D

    Psu

    xdylanm/modular-system-psu

    A PSU for a modular Eurorack system, featuring +/-12V and 5V rails, USB-C input, and a regulated USB-A output.

    68 partsMIT
  • 6 layers100 × 120 mmAstra piNas, the printed circuit board in 3D

    Astra piNas

    jlcjak/astra_piNas

    Six-layer CM5 Lite dual-NVMe carrier with PCIe switch, Ethernet, microSD, USB-C PD and PoE. Review design; fabrication hold documented.

    176 parts30