Skip to the content
2 layers318.5 × 121.1 mmDachshund70, the printed circuit board in 3D

The receiver for the keyboard's 2.4 GHz mode (SPEC phase 14). It is a small desk puck: a USB-C cable runs to the computer, and the puck sits on the desk near the keyboard. KiCad 10, 2 layers, 1.6 mm.

Size
318.5 × 121.1 mm
Copper layers
2
Thickness
1.6 mm
Parts
217
Nets
153
Pads
931
Tracks, vias
2,072, 409
Pours
4
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
22 Oct 2026
Updated
5 Nov 2026

Overview

Dachshund70 is an open-source printed circuit board by TiamDesigns, from the TiamDesigns/Dachshund70 repository on GitHub, published under the MIT licence. It is a 2-layer board of 318.5 × 121.1 mm with 217 parts on 153 nets, routed with 2,072 tracks and 409 vias.

It is built around the MDBT50Q-P1MV2, 1N4148W and AO3401A, with the B5819W and BAT54WS among its other parts. Its parts include 82 diodes, 59 switches, 19 capacitors, 3 resistors and 3 connectors. It belongs with the nRF52 and nRF5x boards of this library.

Main components

5

README

hardware/Dachshund70-Dongle/README.md

Dachshund70 2.4 GHz dongle

The receiver for the keyboard's 2.4 GHz mode (SPEC phase 14). It is a small desk puck: a USB-C cable runs to the computer, and the puck sits on the desk near the keyboard. KiCad 10, 2 layers, 1.6 mm.

Pins come from the dongle section of boards/Dachshund70/board.json, as for the keyboard.

Board

  • 40 × 24 mm, 2 mm corners. Two unplated M2 holes, both at the USB end, so no screws sit near the antenna.
  • U2, Raytac MDBT50Q-P1MV2: the same nRF52840 module as the keyboard, with a certified PCB antenna. The antenna end sits 0.4 mm inside the right edge. A keep-out covers the whole strip from the antenna to the edge, across the full board width, on both layers: no copper, pour or vias there.
  • J1, USB-C (HRO TYPE-C-31-M-12): the same part as the keyboard's daughterboard. It is on the left edge, at the opposite end from the antenna. USB 2.0 sink: 5.1 kΩ Rd on CC1 and CC2, no PD.
  • Protection: U1 USBLC6-2SC6 ESD clamp on D+, D− and VBUS; F1 750 mA PTC on VBUS. FB1 ties the receptacle shell to GND (the daughterboard does the same).
  • Power: VBUS feeds both the module's VBUS and VDDH pins (high-voltage mode). VDD (REGOUT0) is +3V3. DCCH is unconnected, so REG0 runs as an LDO. There is no 32.768 kHz crystal, so firmware uses the internal RC oscillator. Decoupling: 4.7 µF + 100 nF on VBUS/VDDH (C1, C2) and on VDD (C3, C4).
  • User parts:
    • SW1 PAIR: P1.06, active low.
    • SW2 RESET: P0.18.
    • D1: RGB status LED, common anode on +3V3. Red P0.08 through 1 kΩ; green P1.09 and blue P0.12 through 330 Ω. All active low, about 1–2 mA each at standard drive.
    • The buttons sit along the top edge, with RESET on the left.
  • J2, SWD: a 1×5 1.27 mm header in the keyboard's pin order: 1 VDD, 2 SWDIO, 3 SWDCLK, 4 nRESET, 5 GND. Pin 1 is the probe's voltage reference. Power the dongle from USB while debugging.
  • PCA10059 compatibility: the button and LED pins match Nordic's nRF52840 Dongle. The dongle firmware can be developed on a PCA10059, and the existing nrf52840dongle/nrf52840 build target drives the same button and LEDs. Adafruit's pca10059 UF2 bootloader uses P1.06 as its DFU button and P0.12 as an LED, so it should run here unchanged: hold PAIR while plugging in to get the UF2 drive. This hasn't been tried yet.

Routing

  • D+/D−: routed by hand from U1 to the module as a side-by-side pair, about 23.5 mm each, on F.Cu over the B.Cu ground plane. The pair approaches the module pads from below.
  • USB-C fan-out: no vias on the data lines. The two D+ pads are joined by a short loop under the receptacle body, and the two D− pads just behind the pads. U1 is flow-through: each line runs straight under the package between its two I/O pins.
  • Supplies: short straight tracks, hand-routed and locked: +3V3 from C3/C4 into VDD; VDDH down to the VBUS row from C1/C2.
  • Everything else: Freerouting 2.5.0, then GND pours on both layers and stitching vias. B.Cu is almost entirely ground.
  • Checks (kicad-cli): ERC 0. DRC: 0 errors, 0 unconnected items, 0 schematic parity issues. Two warnings remain: the stock receptacle footprint's silkscreen runs past the board edge, the same as on the daughterboard.
  • Pin check: a script compared every module pad with board.json and followed each net to its button, LED, resistor, SWD or USB pin: 0 mismatches.
  • One +3V3 track runs on B.Cu under the D+/D− pair on its way to J2. At 12 Mbit/s this doesn't matter, but a re-spin could move it.

Polling rate: 1000 Hz

The nRF52840's USB peripheral is full speed only (12 Mbit/s). A full-speed interrupt endpoint can be polled at most once per 1 ms frame (bInterval = 1), so 1000 Hz is the ceiling for this dongle, and for the keyboard over its own USB cable. SPEC already asks for a 1 ms interval.

The radio isn't the limit. An ESB packet at 2 Mbit/s with a ~16-byte report is about 100 µs on air, plus 40 µs for the fast radio ramp-up. The link could carry well over 2000 reports per second.

4000 Hz or 8000 Hz would need High-Speed USB (480 Mbit/s), which polls every 125 µs. That means a different receiver chip, such as Nordic's nRF54LM20A, which has a High-Speed USB peripheral. It's out of scope for v1, since the stack is pinned to the nRF52840.

Keeping latency low

Rough budget for one key press over the dongle, at 1000 Hz polling and with no retransmits. These are estimates to be measured in phase 14; SPEC already lists logic-analyser latency tests.

StageTimeHow to keep it low
Detect the press~0.05–1 msWhen idle, drive all columns and wait for a row interrupt (GPIO SENSE), so the first press wakes the scan at once. While keys are held, scan at 1 kHz or faster.
Debounce~0 msEager debounce on press (report the first edge, then ignore the key for 5 ms), deferred on release.
KeymapµsPlain keys go out at once. Tap-hold keys wait by design; keep their timeouts short.
Radio~0.15–0.2 msESB at 2 Mbit/s, fast ramp-up, a short fixed report, and send immediately on change rather than on a timer. Keep the keyboard's HFXO running while keys are active (cold start costs ~0.3–0.4 ms). In dongle mode, keep BLE off so ESB has the radio to itself.
Retransmits+~0.3 ms eachShort retransmit delay, a few retries, then hop to the next channel. Pick channels between the Wi-Fi channels 1, 6 and 11.
Dongle to USB0–1 ms (avg 0.5 ms)The dongle listens all the time (it runs on USB power). Queue the report on the IN endpoint from the radio interrupt with bInterval 1. Use a small FIFO so a fast press and release in one frame isn't merged.

Typical total: about 1 ms, worst case about 2.5 ms without retransmits. BLE is slower: its connection interval is 7.5 ms at best, and many hosts use 11.25–15 ms.

What the hardware does for latency:

  • Puck on a cable, not a stick: the puck can sit next to the keyboard, away from the computer's metal case and from USB 3 ports, which emit noise in the 2.4 GHz band. Fewer lost packets means fewer retransmits.
  • Clear antenna: the antenna is at the board end with a full-width keep-out, and there is no metal near it. Use a plastic case, with no screws or labels over the antenna strip.
  • USB-powered receiver: the dongle can keep its radio in receive and its crystal oscillator running all the time, with no wake-up delay.
  • Host to keyboard: send lock LEDs and config data back as ESB ACK payloads, so the keyboard never needs a separate receive window.

Bring-up checks

  1. Power from USB, then check the rails: VBUS ≈ 5 V, and VDD ≈ 1.8 V on a blank module (the factory UICR default). Firmware must set REGOUT0 to 3.3 V, as the keyboard's board.c does; green and blue barely light at 1.8 V.
  2. Flash over SWD: either the Adafruit pca10059 UF2 bootloader (then hold PAIR while plugging in for the UF2 drive), or the dongle app directly.
  3. Check that it enumerates as 1209:0002 "Dachshund70 Receiver", with both plug orientations and from a USB-C to USB-C cable (the Rd resistors).
  4. Check that the LED shows red, green and blue, and that PAIR and RESET work.
  5. Range and latency: measure them with the keyboard in phase 14, with the puck next to the keyboard and then plugged straight into a USB 3 port, to see the difference.

Not done

  • No case design yet. The case needs a light pipe over D1, button caps over SW1 and SW2, and a USB-C cutout. The M2 holes are a placeholder.
  • 3D models: the HRO receptacle is a generated model, not HRO's (hardware/3dmodels/), and D1 uses KiCad's Würth PLCC4 3.2 × 2.8 mm RGB LED model, the same package size. Swap in the manufacturers' STEPs before final case work.
  • A Zephyr board definition for the dongle (with the UF2 flash layout) is phase 14 work. Until then, CI builds the dongle app for nrf52840dongle/nrf52840.
  • BOM: every soldered part except the SWD header has an MPN. LCSC numbers are filled in only where they were checked (J1, U1, R1, R2).

Parts

217
QtyValueFootprintReferences
801N4148WDiode_SMD:D_SOD-123D100, D101, D102, D103, D104, D105, D106, D107, D108, D109, D110, D111, D112, D113, D114, D200 +64
9100nFCapacitor_SMD:C_0402_1005MetricC5, C7, C13, C14, C15, C16, C17, C18, C19
54.7uFCapacitor_SMD:C_0603_1608MetricC1, C2, C3, C4, C6
210nFCapacitor_SMD:C_0402_1005MetricC10, C11
212pFCapacitor_SMD:C_0402_1005MetricC8, C9
2GNDTestPoint:TestPoint_Pad_D1.5mmTP8, TP9
2MX Ctrl (1.25u)Keyswitch:SW_Hotswap_Kailh_MX_1.25uSW600, SW611
1+3V3TestPoint:TestPoint_Pad_D1.5mmTP5
1100kResistor_SMD:R_0603_1608MetricR3
1100kResistor_SMD:R_0402_1005MetricR2
11uFCapacitor_SMD:C_0402_1005MetricC12
13.3kResistor_SMD:R_0603_1608MetricR1
132.768kHz 9pFCrystal:Crystal_SMD_3215-2Pin_3.2x1.5mmY1
1AO3401APackage_TO_SOT_SMD:SOT-23Q1
1B5819WDiode_SMD:D_SOD-123D8
1BAT54WSDiode_SMD:D_SOD-323D1
1Battery (JST-PH 2P)Connector_JST:JST_PH_S2B-PH-SM4-TB_1x02-1MP_P2.00mm_HorizontalJ2
1CHG_STATTestPoint:TestPoint_Pad_D1.5mmTP7
1DisplayConnector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_VerticalJ4
1EncoderConnector_JST:JST_SH_SM05B-SRSS-TB_1x05-1MP_P1.00mm_HorizontalJ5
1LED_VDDTestPoint:TestPoint_Pad_D1.5mmTP6
1MCP73831-2-OTPackage_TO_SOT_SMD:SOT-23-5U2
1MDBT50Q-P1MV2RF_Module:Raytac_MDBT50QU1
1MX ' (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW411
1MX , (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW508
1MX - (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW211
1MX . (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW509
1MX / (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW510
1MX 0 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW210
1MX 1 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW201
1MX 2 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW202
1MX 3 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW203
1MX 4 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW204
1MX 5 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW205
1MX 6 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW206
1MX 7 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW207
1MX 8 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW208
1MX 9 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW209
1MX ; (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW410
1MX = (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW212
1MX A (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW401
1MX Alt (1.25u)Keyswitch:SW_Hotswap_Kailh_MX_1.25uSW603
1MX B (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW505
1MX Backspace (2.00u)Keyswitch:SW_Hotswap_Kailh_MX_2.00uSW213
1MX C (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW503
1MX Caps Lock (1.75u)Keyswitch:SW_Hotswap_Kailh_MX_1.75uSW400
1MX D (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW403
1MX Delete (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW113
1MX Down (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW613
1MX E (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW303
1MX Enter (2.25u)Keyswitch:SW_Hotswap_Kailh_MX_2.25uSW413
1MX Esc (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW100
1MX F (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW404
1MX F1 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW101
1MX F10 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW110
1MX F11 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW111
1MX F12 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW112
1MX F2 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW102
1MX F3 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW103
1MX F4 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW104
1MX F5 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW105
1MX F6 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW106
1MX F7 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW107
1MX F8 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW108
1MX F9 (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW109
1MX Fn (1.25u)Keyswitch:SW_Hotswap_Kailh_MX_1.25uSW610
1MX G (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW405
1MX H (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW406
1MX I (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW308
1MX J (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW407
1MX K (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW408
1MX L (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW409
1MX Left (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW612
1MX M (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW507
1MX Mod (1.25u, solder)Button_Switch_Keyboard:SW_Cherry_MX_1.25u_PlateSW604
1MX Mod (2.25u)Keyswitch:SW_Hotswap_Kailh_MX_2.25uSW608
1MX N (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW506
1MX O (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW309
1MX P (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW310
1MX Q (1.00u)Keyswitch:SW_Hotswap_Kailh_MX_1.00uSW301

The 175 most common of 217 parts.

More from TiamDesigns/Dachshund70

3
  • 2 layers40 × 24 mmDachshund70-Dongle, the printed circuit board in 3D

    Dachshund70-Dongle

    TiamDesigns/Dachshund70

    The receiver for the keyboard's 2.4 GHz mode (SPEC phase 14). It is a small desk puck: a USB-C cable runs to the computer, and the puck sits on the desk near the keyboard. KiCad 10, 2 layers, 1.6 mm.

    20 parts1MIT
  • 2 layers54 × 9 mmDachshund70-USB, the printed circuit board in 3D

    Dachshund70-USB

    TiamDesigns/Dachshund70

    The receiver for the keyboard's 2.4 GHz mode (SPEC phase 14). It is a small desk puck: a USB-C cable runs to the computer, and the puck sits on the desk near the keyboard. KiCad 10, 2 layers, 1.6 mm.

    10 parts1MIT
  • 2 layers22.5 × 22 mmDachshund70-Encoder, the printed circuit board in 3D

    Dachshund70-Encoder

    TiamDesigns/Dachshund70

    The receiver for the keyboard's 2.4 GHz mode (SPEC phase 14). It is a small desk puck: a USB-C cable runs to the computer, and the puck sits on the desk near the keyboard. KiCad 10, 2 layers, 1.6 mm.

    4 parts1MIT

Similar boards

  • 4 layers18.5 × 25.3 mmVarioSmooth v2, the printed circuit board in 3D

    VarioSmooth v2

    samp38/varioSmooth

    Energy self-sufficient helmet embedded variometer for free flight

    30 parts1
  • 2 layers121 × 75.5 mmJlctest, the printed circuit board in 3D

    Jlctest

    cjheath/jlcbasic

    JLC Basic parts library for Kicad fetched and converted from EasyEDA

    46 parts5
  • 4 layers63.8 × 50.8 mmV2 reference, the printed circuit board in 3D

    V2 reference

    ameesme/little-camera

    A small black-and-white camera that posts to its own tiny blog, and everything around it.

    85 partsMIT
  • 2 layersEphemerkey, the printed circuit board in 3D

    Ephemerkey

    ephemerkey/ephemerkey

    The consumer half of the ephemerkey system, and the second PCB in this repo (alongside hardware/ephemerkey/, sharing the same scripts/kschgen.py engine, Makefile, and lib tables — the multi-project layout used by…

    70 parts
  • 4 layers100 × 100 mmPhmod, the printed circuit board in 3D

    Phmod

    gallicchio/AMOD-and-RFMOD

    The tutorial's 2x12 adapter (/mudd/133electronics/icepi-zero-dac-adc/adapterboard/) with a 2 x 6 right-angle Pmod socket on a 15 mm extension of its right-hand end, so an Icepi Zero can drive AMOD-A's and RF-MOD's Pmod…

    234 parts
  • 2 layers90 × 55 mmS3.1-before repack, the printed circuit board in 3D

    S3.1-before repack

    puji4810/coffe-scale

    USB-C J5 ──► U8 ESD ──► R19/R20 22R ──► U4 IO19/IO20 (native USB-Serial/JTAG) │VBUS ├─► U5 TP4057 充电 ──► J6 1S Li-ion └─► D1/Q1 负载切换 ──► VSYS ──► U6 XC6220 3V3 1A ──► VCC3V3 ──► U4/外设 └──► U7 HT7533 ──► VDDADC ──► U1/U3…

    96 partsApache-2.0
  • 4 layers75 × 136 mmMynd Main, the printed circuit board in 3D

    Mynd Main

    Prototype-Fund-Hardware/MYND-Hardware

    Inofficial hardware repository for the Teufel MYND loudspeaker: https://teufel.de/mynd-107002004

    561 parts3

Questions

How big is the Dachshund70 PCB?

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

What parts does the Dachshund70 use?

217 parts, built around the MDBT50Q-P1MV2, 1N4148W, AO3401A and B5819W. 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 Dachshund70 KiCad files?

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

Can I use the Dachshund70 design in my own project?

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