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

ESP32C6 Wireless CW paddle project

Size
104.7 × 50.8 mm
Copper layers
2
Thickness
1.6 mm
Parts
41
Nets
38
Pads
154
Tracks, vias
171, 0
Pours
2
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
4 Jan 2026
Updated
20 Oct 2026

Overview

Dihdah blue r2 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 104.7 × 50.8 mm with 41 parts on 38 nets, routed with 171 tracks and 0 vias.

It is built around the ASSR-1228-002E and P4KE15CA. Its parts include 8 resistors, 4 capacitors, 4 diodes, 4 connectors and 4 switches. It belongs with the ESP32 and RISC-V boards of this library.

Main components

2

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

41
QtyValueFootprintReferences
8MountingHoleMountingHole:MountingHole_3.5mmH1, H1, H2, H2, H3, H3, H4, H4
4Conn_01x02_PinConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalBatt1, EN1, J1, J4
4SW_PushButton_Switch_THT:SW_Tactile_SPST_Angled_PTS645Vx83-2LFSSW1, SW1, SW2, SW2
210 ohmResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR4, R5
2100 nFCapacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mmC1, C2
2100KResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR1, R2
2180 ohmResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR1, R2
2P4KE15CADiode_THT:D_DO-41_SOD81_P10.16mm_HorizontalD2, D3
2Screw_Terminal_01x03Wurth:691313510003J1, J5
2VAL**Panelization:mouse-bite-1mm-slotmouse-bite-1mm-slot, mouse-bite-1mm-slot
2XIAO-ESP32-C6Seeed Studio XIAO Series Library:XIAO-ESP32C6-DIPU1, U1
10.01uFCapacitor_THT:C_Disc_D3.0mm_W1.6mm_P2.50mmC3
10.1uFCapacitor_THT:C_Disc_D3.0mm_W1.6mm_P2.50mmC1
11 kResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR3
11KResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR3
1ASSR-1228-002EPackage_DIP:DIP-8_W7.62mmU2
1BatteryConnector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_HorizontalJ3
1Conn_01x02Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_HorizontalJ3
1LEDLED_THT:LED_D3.0mm_Horizontal_O1.27mm_Z6.0mmD1
1~LED_THT:LED_D3.0mm_Horizontal_O1.27mm_Z6.0mmD1

More from tdwgithub/dih-dah-blue

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

    Radio

    tdwgithub/dih-dah-blue

    ESP32C6 Wireless CW paddle project

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

    Paddle

    tdwgithub/dih-dah-blue

    ESP32C6 Wireless CW paddle project

    16 parts

Similar boards

  • 2 layers80 × 100 mmTiming light, the printed circuit board in 3D

    Timing light

    ChipCE/juice-plus-pcb

    Varios PCB design for 3D printers and drones

    54 parts2GPL-3.0
  • 2 layers70 × 35 mmTLF35584 breakout, the printed circuit board in 3D

    TLF35584 breakout

    rusefi/rusefi

    rusefi - GPL internal combustion engine control unit

    41 parts1.2k
  • 2 layers270 × 11 mmDaylight Disco, the printed circuit board in 3D

    Daylight Disco

    VoronDesign/Voron-Hardware

    Cool Hardware designed by the Voron Design group

    41 parts1.1kGPL-3.0
  • 2 layers27.5 × 48.3 mmICE40DevBoard, the printed circuit board in 3D

    ICE40DevBoard

    hackclub/OnBoard

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

    41 parts915
  • 2 layers45 × 25 mmEasy PD Sink, the printed circuit board in 3D

    Easy PD Sink

    openwch/ch32v003

    CH32V003 is an ultra-cheap RISC-V MCU with 2KB SRAM, 16KB flash, and up to 18 GPIOs that sells for under $0.10

    41 parts599
  • 2 layers97 × 78.5 mmDumbpad, the printed circuit board in 3D

    Dumbpad

    imchipwood/dumbpad

    Simple 4x4 numpad with rotary encoder. Powered by QMK via ATmega32u4 Pro Micro

    41 parts517GPL-2.0
  • 2 layers37 × 15 mmCanTactDist, the printed circuit board in 3D

    CanTactDist

    bondus/KlipperToolboard

    A 3D printer tool head controller board

    41 parts373GPL-3.0

Questions

How big is the Dihdah blue r2 PCB?

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

What parts does the Dihdah blue r2 use?

41 parts, built around the ASSR-1228-002E and P4KE15CA. 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 Dihdah blue r2 KiCad files?

From the tdwgithub/dih-dah-blue repository on GitHub, at the commit this page was made from: the board is hardware/panel/dihdah_blue_r2.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 Dihdah blue r2 design in my own project?

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