
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.

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.
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.
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.
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.board.json and followed each net to its
button, LED, resistor, SWD or USB pin: 0 mismatches.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.
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.
| Stage | Time | How to keep it low |
|---|---|---|
| Detect the press | ~0.05–1 ms | When 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 ms | Eager debounce on press (report the first edge, then ignore the key for 5 ms), deferred on release. |
| Keymap | µs | Plain keys go out at once. Tap-hold keys wait by design; keep their timeouts short. |
| Radio | ~0.15–0.2 ms | ESB 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 each | Short retransmit delay, a few retries, then hop to the next channel. Pick channels between the Wi-Fi channels 1, 6 and 11. |
| Dongle to USB | 0–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:
board.c does; green and blue
barely light at 1.8 V.pca10059 UF2 bootloader (then hold PAIR while plugging in for
the UF2 drive), or the dongle app directly.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.nrf52840dongle/nrf52840.| Qty | Value | Footprint | References |
|---|---|---|---|
| 80 | 1N4148W | Diode_SMD:D_SOD-123 | D100, D101, D102, D103, D104, D105, D106, D107, D108, D109, D110, D111, D112, D113, D114, D200 +64 |
| 9 | 100nF | Capacitor_SMD:C_0402_1005Metric | C5, C7, C13, C14, C15, C16, C17, C18, C19 |
| 5 | 4.7uF | Capacitor_SMD:C_0603_1608Metric | C1, C2, C3, C4, C6 |
| 2 | 10nF | Capacitor_SMD:C_0402_1005Metric | C10, C11 |
| 2 | 12pF | Capacitor_SMD:C_0402_1005Metric | C8, C9 |
| 2 | GND | TestPoint:TestPoint_Pad_D1.5mm | TP8, TP9 |
| 2 | MX Ctrl (1.25u) | Keyswitch:SW_Hotswap_Kailh_MX_1.25u | SW600, SW611 |
| 1 | +3V3 | TestPoint:TestPoint_Pad_D1.5mm | TP5 |
| 1 | 100k | Resistor_SMD:R_0603_1608Metric | R3 |
| 1 | 100k | Resistor_SMD:R_0402_1005Metric | R2 |
| 1 | 1uF | Capacitor_SMD:C_0402_1005Metric | C12 |
| 1 | 3.3k | Resistor_SMD:R_0603_1608Metric | R1 |
| 1 | 32.768kHz 9pF | Crystal:Crystal_SMD_3215-2Pin_3.2x1.5mm | Y1 |
| 1 | AO3401A | Package_TO_SOT_SMD:SOT-23 | Q1 |
| 1 | B5819W | Diode_SMD:D_SOD-123 | D8 |
| 1 | BAT54WS | Diode_SMD:D_SOD-323 | D1 |
| 1 | Battery (JST-PH 2P) | Connector_JST:JST_PH_S2B-PH-SM4-TB_1x02-1MP_P2.00mm_Horizontal | J2 |
| 1 | CHG_STAT | TestPoint:TestPoint_Pad_D1.5mm | TP7 |
| 1 | Display | Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_Vertical | J4 |
| 1 | Encoder | Connector_JST:JST_SH_SM05B-SRSS-TB_1x05-1MP_P1.00mm_Horizontal | J5 |
| 1 | LED_VDD | TestPoint:TestPoint_Pad_D1.5mm | TP6 |
| 1 | MCP73831-2-OT | Package_TO_SOT_SMD:SOT-23-5 | U2 |
| 1 | MDBT50Q-P1MV2 | RF_Module:Raytac_MDBT50Q | U1 |
| 1 | MX ' (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW411 |
| 1 | MX , (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW508 |
| 1 | MX - (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW211 |
| 1 | MX . (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW509 |
| 1 | MX / (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW510 |
| 1 | MX 0 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW210 |
| 1 | MX 1 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW201 |
| 1 | MX 2 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW202 |
| 1 | MX 3 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW203 |
| 1 | MX 4 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW204 |
| 1 | MX 5 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW205 |
| 1 | MX 6 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW206 |
| 1 | MX 7 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW207 |
| 1 | MX 8 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW208 |
| 1 | MX 9 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW209 |
| 1 | MX ; (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW410 |
| 1 | MX = (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW212 |
| 1 | MX A (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW401 |
| 1 | MX Alt (1.25u) | Keyswitch:SW_Hotswap_Kailh_MX_1.25u | SW603 |
| 1 | MX B (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW505 |
| 1 | MX Backspace (2.00u) | Keyswitch:SW_Hotswap_Kailh_MX_2.00u | SW213 |
| 1 | MX C (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW503 |
| 1 | MX Caps Lock (1.75u) | Keyswitch:SW_Hotswap_Kailh_MX_1.75u | SW400 |
| 1 | MX D (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW403 |
| 1 | MX Delete (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW113 |
| 1 | MX Down (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW613 |
| 1 | MX E (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW303 |
| 1 | MX Enter (2.25u) | Keyswitch:SW_Hotswap_Kailh_MX_2.25u | SW413 |
| 1 | MX Esc (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW100 |
| 1 | MX F (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW404 |
| 1 | MX F1 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW101 |
| 1 | MX F10 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW110 |
| 1 | MX F11 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW111 |
| 1 | MX F12 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW112 |
| 1 | MX F2 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW102 |
| 1 | MX F3 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW103 |
| 1 | MX F4 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW104 |
| 1 | MX F5 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW105 |
| 1 | MX F6 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW106 |
| 1 | MX F7 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW107 |
| 1 | MX F8 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW108 |
| 1 | MX F9 (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW109 |
| 1 | MX Fn (1.25u) | Keyswitch:SW_Hotswap_Kailh_MX_1.25u | SW610 |
| 1 | MX G (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW405 |
| 1 | MX H (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW406 |
| 1 | MX I (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW308 |
| 1 | MX J (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW407 |
| 1 | MX K (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW408 |
| 1 | MX L (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW409 |
| 1 | MX Left (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW612 |
| 1 | MX M (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW507 |
| 1 | MX Mod (1.25u, solder) | Button_Switch_Keyboard:SW_Cherry_MX_1.25u_Plate | SW604 |
| 1 | MX Mod (2.25u) | Keyswitch:SW_Hotswap_Kailh_MX_2.25u | SW608 |
| 1 | MX N (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW506 |
| 1 | MX O (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW309 |
| 1 | MX P (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW310 |
| 1 | MX Q (1.00u) | Keyswitch:SW_Hotswap_Kailh_MX_1.00u | SW301 |
The 175 most common of 217 parts.

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.

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.

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.

samp38/varioSmooth
Energy self-sufficient helmet embedded variometer for free flight

cjheath/jlcbasic
JLC Basic parts library for Kicad fetched and converted from EasyEDA

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


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…

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…

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…

Prototype-Fund-Hardware/MYND-Hardware
Inofficial hardware repository for the Teufel MYND loudspeaker: https://teufel.de/mynd-107002004
It measures 318.5 × 121.1 mm and has 2 copper layers, 1.6 mm thick.
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.
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.
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).