Skip to the content
PCBKitNew board
2 layers50.8 × 50.8 mmPaddle, the printed circuit board in 3D

ESP32C6 Wireless CW paddle project

Size
50.8 × 50.8 mm
Copper layers
2
Thickness
1.6 mm
Parts
16
Nets
19
Pads
59
Tracks, vias
75, 0
Pours
1
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
4 Jan 2026
Updated
20 Oct 2026

Overview

Paddle is an open-source printed circuit board by tdwgithub, from the tdwgithub/dih-dah-blue repository on GitHub. It is a 2-layer board of 50.8 × 50.8 mm with 16 parts on 19 nets, routed with 75 tracks and 0 vias.

Its parts include 4 connectors, 3 resistors, 2 switches, 1 capacitor and 1 IC. It belongs with the ESP32 and RISC-V boards of this library.

README

README.md

Dih Dah Blue

A Bluetooth LE wireless link between a Morse code (CW) paddle and a radio.

Dih Dah Blue replaces the cable between your CW paddle and your radio with a pair of small battery-powered boards. The paddle-side board watches the paddle contacts and sends each transition over Bluetooth LE. The radio-side board drives a solid-state relay wired to the radio's key input. To your radio, it looks like the paddle is plugged straight in.

This repository holds the firmware, KiCad schematics and PCB layouts, and the 3D-printable enclosure described in the Circuit Cellar article "Dih Dah Blue – Bluetooth Remote CW Key" by Todd Wade, W8LEV.

Enclosure and lid

How it works

Both boards are built around the Seeed Studio XIAO ESP32-C6. The module provides a RISC-V high-power (HP) core and an ultra-low-power (ULP/LP) core, a built-in LiPo charger and a USB-C port for power and programming.

Paddle sideRadio side
BLE roleCentralPeripheral (advertises as CW_Radio)
Connects toPaddle via 3-position terminal block (left, right, common)Radio key input via 3-position terminal block, through an ASSR-1228 2-pole solid-state relay
Power strategyULP core watches the paddle while the HP core sleeps. HP core goes to light sleep after 2 min idle and deep sleep after 10 minHP core only, light sleep when idle
Typical idle current~90 µA~17 mA

Paddle side: The ULP core debounces the paddle inputs, places time-stamped events on a queue shared with the HP core, then wakes the HP core. The HP core re-establishes the BLE link if needed and sends each queued event to the radio side. While the link is idle, the HP core steps down from light sleep to deep sleep. A paddle tap wakes everything back up, and the LED blinks three times quickly once the link is up.

Radio side: Accepts the connection, receives paddle events and drives the relay outputs to match.

Repository layout

text
firmware/
  paddle/     ESP-IDF project: HP core (main/main.c) + ULP core (main/ulp/)
  radio/      ESP-IDF project: radio-side BLE peripheral
hardware/
  paddle/     KiCad project, schematic PDF and BOM for the paddle-side board
  radio/      KiCad project, schematic PDF and BOM for the radio-side board
  panel/      Both boards panelized into one 2-up panel, with ready-to-order Gerbers
enclosure/    OpenSCAD source and STL for the shared enclosure
docs/images/  Photos and renders

Building the hardware

Each board is 2" × 2" and uses only through-hole parts. You can also build the circuits on a breadboard or stripboard.

Panelized PCBs

Assembly notes:

  1. Solder the low-profile parts first (resistors and capacitors), then the battery connector, then the buttons.
  2. If you'll use the enclosure, bend the LED leads 90° about 1/8" above the board so the LED pokes through the enclosure hole. The cathode goes to the square pad nearest the board edge.
  3. Install the XIAO module last. Its battery and RESET/EN and BOOT connections are only on pads underneath the module. Before soldering the module down, solder four wires to the Battery +, Battery −, Reset/EN and Option/BOOT pads on its underside. Route the wires out from under the edge opposite the USB-C connector. Then solder the module's header pins, trim the wires and solder them to the four labeled holes near the battery connector.

XIAO module back-side pads

Module wiring

Article correction: The article text says R2 and R3 are the paddle input pull-ups and R1 is the LED resistor. On both boards R3 (1K) is the LED resistor. On the paddle side, R1 and R2 (100K) are the paddle input pull-ups. The schematics (Figures 1 and 2), the PCBs and the files here are correct.

Battery: Either board runs from a single-cell 3.7 V LiPo (the author uses Adafruit's 500 mAh flat pack) or directly from USB-C. Buy batteries from a reputable supplier. A slot in the PCB lets the battery lead pass up from below the board.

Radio-side note: The relay output is meant for "dry contact" key inputs on radios or keyers with a built-in electronic keyer. Don't connect it to older rigs that put a voltage on the key line.

Building the firmware

Requires ESP-IDF v5.3.x (developed on v5.3.4).

sh
cd firmware/radio        # or firmware/paddle
idf.py set-target esp32c6
idf.py build
idf.py -p <serial-port> flash monitor

The paddle project builds the ULP program in main/ulp/ and embeds it into the HP-core image automatically.

To force a XIAO into the bootloader, hold BOOT (SW2) while pressing RESET/EN (SW1).

Current limitations / ideas for future versions

  • The paddle mode is fixed at NORMAL. REVERSED, IAMBIC_A and IAMBIC_B are defined but not yet selectable.
  • Each event carries a timestamp, but the radio side doesn't yet use it to reconstruct paddle timing.
  • Settings could be made configurable through the BOOT button, a serial console or a phone app.

Enclosure

enclosure/dihdah_blue_enclosure.scad is a parametric OpenSCAD design (Listing 1 in the article). It fits either board, and dihdah_blue_enclosure.stl is ready to slice. GitHub shows the STL in a 3D viewer.

  • PCB mounting: M3 × 8 mm pan-head self-tapping screws
  • Lid: M2.5 × 8 mm countersunk self-tapping screws
  • The design isn't meant for repeated opening. Switch to brass heat-set inserts and machine screws if you'll open it often.

License

  • Firmware (firmware/): MIT
  • Hardware and enclosure (hardware/, enclosure/): CERN-OHL-P-2.0

© 2024–2026 Todd D. Wade, W8LEV

Parts

16
QtyValueFootprintReferences
4MountingHoleMountingHole:MountingHole_3.5mmH1, H2, H3, H4
2100KResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR1, R2
2Conn_01x02_PinConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ1, J4
2SW_PushButton_Switch_THT:SW_Tactile_SPST_Angled_PTS645Vx83-2LFSSW1, SW2
10.1uFCapacitor_THT:C_Disc_D3.0mm_W1.6mm_P2.50mmC1
11KResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR3
1Conn_01x02Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_HorizontalJ3
1Screw_Terminal_01x03Wurth:691313510003J5
1XIAO-ESP32-C6Seeed Studio XIAO Series Library:XIAO-ESP32C6-DIPU1
1~LED_THT:LED_D3.0mm_Horizontal_O1.27mm_Z6.0mmD1

Questions

How big is the Paddle PCB?

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

What parts does the Paddle use?

16 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 Paddle KiCad files?

From the tdwgithub/dih-dah-blue repository on GitHub, at the commit this page was made from: the board is hardware/paddle/Paddle.kicad_pcb and its schematic hardware/paddle/Paddle.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Paddle design in my own project?

Its repository states no licence, so its author keeps all rights: ask tdwgithub before reusing the design.

More from tdwgithub/dih-dah-blue

2
  • 2 layers104.7 × 50.8 mmDihdah blue r2, the printed circuit board in 3D

    Dihdah blue r2

    tdwgithub/dih-dah-blue

    ESP32C6 Wireless CW paddle project

    41 parts
  • 2 layers50.8 × 50.8 mmRadio, the printed circuit board in 3D

    Radio

    tdwgithub/dih-dah-blue

    ESP32C6 Wireless CW paddle project

    23 parts

Similar boards

  • 2 layers140.5 × 30 mmType e, the printed circuit board in 3D

    Type e

    google/mozc-devices

    Circuit diagrams and firmware source code for Gboard DIY keyboards

    16 parts3kApache-2.0
  • 2 layers41.4 × 14.5 mmU2f zero, the printed circuit board in 3D

    U2f zero

    conorpp/u2f-zero

    U2F USB token optimized for physical security, affordability, and style

    16 parts2.4k
  • 2 layers122 × 37 mmV0-UmbilicalBoard, the printed circuit board in 3D

    V0-UmbilicalBoard

    VoronDesign/Voron-Hardware

    Cool Hardware designed by the Voron Design group

    16 parts1.1kGPL-3.0
  • 2 layers152 × 57.6 mmVideoslotadapter, the printed circuit board in 3D

    Videoslotadapter

    hoglet67/RGBtoHDMI

    Bare-metal Raspberry Pi project that provides pixel-perfect sampling of Retro Computer RGB/YUV video and conversion to HDMI

    16 parts1kGPL-3.0
  • 2 layers36 × 63.4 mmSmart ringfinal layout, the printed circuit board in 3D

    Smart ringfinal layout

    hackclub/OnBoard

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

    16 parts915
  • 2 layers60 × 40 mmHASwitchPlate, the printed circuit board in 3D

    HASwitchPlate

    aderusha/HASwitchPlate

    LCD touchscreen for Home Automation

    16 parts738MIT
  • 2 layers21.1 × 26.9 mmDemo, the printed circuit board in 3D

    Demo

    easyw/kicadStepUpMod

    kicadStepUp: ECAD to MCAD FreeCAD WorkBench

    16 parts704