Skip to the content
2 layers93.5 × 36 mmInput hub, the printed circuit board in 3D

Accessible mouse implemented with ZMK.

Size
93.5 × 36 mm
Copper layers
2
Thickness
1.6 mm
Parts
35
Nets
41
Pads
140
Tracks, vias
256, 129
Pours
1
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
29 Apr 2026
Updated
16 Jun 2026

Overview

Input hub is an open-source printed circuit board by Mazzorella, from the Mazzorella/ClickTapToe repository on GitHub. It is a 2-layer board of 93.5 × 36 mm with 35 parts on 41 nets, routed with 256 tracks and 129 vias.

It is built around the TPD4E05U06DQAR, PJ-307 and 1206L012WR, with the 54602-908LF, B2B-PH-SM4-TB and BM04B-SRSS-TB(LF)(SN)(P) among its other parts. Its parts include 11 connectors, 9 resistors, 3 capacitors, 3 ICs and 1 fuse.

Main components

6

README

README.md

ClickTapToe

ClickTapToe is a custom foot-operated mouse for people who need to reduce repetitive hand and arm movement. The goal is to move common mouse actions away from the hands by using foot pedals for clicking, a large foot-driven scroll wheel, and a separate mouse pointer module.

This repository contains the firmware, hardware notes, and project documentation for ClickTapToe. The current firmware target is a Seeed Studio XIAO nRF52840 / XIAO BLE running as a USB HID mouse with ZMK. Bluetooth is disabled for the ClickTapToe firmware build.

Current Status

The current firmware supports USB mouse clicks from external pedals, USB vertical scrolling from the input hub scroll wheel, and pointer movement from the mouse pointer module:

  • Left click on the first pedal input
  • Right click on the second pedal input
  • Vertical scroll from the AS5600 magnetic angle sensor connected to the input hub scroll wheel
  • Pointer movement from the PMW3610 sensor in the mouse pointer module
  • D2 and D3 remain spare/test inputs and are not exposed as production pedal jacks on the current input hub PCB

PMW3610 pointing support is active for the current firmware target.

Hardware Overview

ClickTapToe is built from two custom electronics modules plus external pedals:

  • The input hub contains the XIAO nRF52840 controller, USB connection, external pedal TS jacks, RJ45 pointer connection, and a large foot-operated scroll wheel coupled to an AS5600 magnetic angle sensor.
  • The mouse pointer module is shaped like a slipper, houses a PMW3610 pointing sensor, and connects to the input hub over RJ45 with a short Ethernet cable.
  • The pedals are premade external pedals connected to the input hub so higher-quality parts can be used and the project is easier to reproduce.

See HARDWARE.md for the current pin map and hardware notes. For a public-facing hardware overview with embedded board previews, open the ClickTapToe Hardware Viewer.

BoardSourceKiCanvas preview
Input hubhardware/input-hub/Open preview
Mouse pointerhardware/mouse-pointer/Open preview

Repository Layout

  • .github/workflows/build.yml runs the upstream ZMK user-config build workflow.
  • build.yaml defines the firmware build matrix.
  • config/west.yml tracks upstream ZMK and imports ZMK's west manifest.
  • zephyr/module.yml declares this repository as the zmk-keyboard-clicktaptoe module and exposes its board, devicetree binding, Kconfig, and driver files.
  • boards/shields/clicktaptoe/ contains the ClickTapToe shield definition, overlay, metadata, and default keymap.
  • Makefile wraps the local west build command for Docker/devcontainer use.
  • hardware/ contains the input hub and mouse pointer KiCad source files.
  • docs/ is reserved for assembly, usage, and release documentation.

Build Target

The active firmware target is:

yaml
board: xiao_ble//zmk
shield: clicktaptoe
artifact-name: clicktaptoe_xiao_usb_zmk

Flashing

  1. Build the firmware with GitHub Actions or a local ZMK toolchain.
  2. Put the XIAO BLE into bootloader mode so it mounts as a UF2 drive.
  3. Copy the generated clicktaptoe_xiao_usb_zmk.uf2 file onto the mounted drive.
  4. After the board reboots, connect it to the host over USB.

Hardware Test

Use a safe desktop target for click testing, such as an empty Finder window or browser page.

  • Short physical D0 to GND; the host should receive a left click.
  • Short physical D1 to GND; the host should receive a right click.
  • Rotate the AS5600 scroll wheel; the host should receive vertical scroll events.
  • Move the mouse pointer module over a surface; the host pointer should move smoothly in the same direction.
  • Test the PMW3610 once through the RJ45 cable path; pointer response should match the direct breadboard wiring test.
  • Leave the AS5600 magnet away from the sensor once as a negative test; the host should not scroll continuously.
  • Verify D2 and D3 only as spare/test GPIOs if they are wired for bring-up.

If macOS does not immediately recognize the updated HID device, unplug and reconnect the XIAO BLE. If an old Bluetooth name appears after flashing, remove the cached Bluetooth entry from the host. This firmware build disables ZMK BLE. If the PMW3610 does not move the pointer after flashing, power-cycle the XIAO once. The input hub physically routes PMW3610 nRESET on XIAO D6 / RJ45 pin 8, but the current firmware still relies on SPI/software reset and does not drive that reset line yet.

Local Build Notes

This repository is both a ZMK config repository and a ZMK module. Local builds should make the repository visible to ZMK as the config path and as an extra module so the custom clicktaptoe shield can be discovered.

The preferred local workflow is to build from a ZMK Docker/devcontainer environment and use this repository's Makefile.

One common local layout is to keep this repository next to a ZMK firmware checkout:

text
projects/
  zmk/
  zmk-pmw3610-driver/
  ClickTapToe/

Open the ZMK firmware checkout in VS Code:

sh
code /path/to/projects/zmk

Then use Dev Containers: Reopen in Container. If using a devcontainer, bind mount this repository into the container and run the build commands from the ClickTapToe repository directory.

On the first devcontainer launch, initialize the Zephyr workspace from the ZMK checkout:

sh
west init -l app/
west update

Restart the devcontainer after west update completes.

Clone the PMW3610 driver module where the Makefile can find it. In the default devcontainer layout:

sh
git clone https://github.com/badjeff/zmk-pmw3610-driver /workspaces/zmk-pmw3610-driver

After that, run the build commands from this repository:

sh
make build

To build and copy the generated UF2 into this repository's firmware/ directory:

sh
make uf2

The copied firmware path is:

sh
firmware/clicktaptoe_xiao_usb_zmk.uf2

Build outputs are written under this repository's ignored build/ directory, not under ZMK's app/ tree.

By default, the Makefile expects ZMK's app directory to be available at ../zmk/app, which matches the sibling directory layout shown above. Override ZMK_APP if your checkout path differs:

sh
make uf2 ZMK_APP=/path/to/zmk/app

The wrapped west command has this shape:

sh
west build -d "/path/to/this-repo/build/clicktaptoe" -b "xiao_ble//zmk" -- \
  -DSHIELD=clicktaptoe \
  -DZMK_CONFIG="/path/to/this-repo/config" \
  -DZMK_EXTRA_MODULES="/path/to/this-repo;/path/to/zmk-pmw3610-driver"

By default, the Makefile expects the PMW3610 driver module at ../zmk-pmw3610-driver. Override PMW3610_MODULE if your checkout path differs:

sh
make uf2 PMW3610_MODULE=/path/to/zmk-pmw3610-driver

Parts

35
QtyValueFootprintReferences
4MountingHoleMountingHole:MountingHole_3.2mm_M3_ISO14580H1, H2, H3, H4
310kResistor_SMD:R_0603_1608MetricR7, R8, R9
347RResistor_SMD:R_0603_1608MetricR3, R4, R5
20RResistor_SMD:R_0603_1608MetricJP1, JP2
21uCapacitor_SMD:C_0603_1608MetricC1, C3
2330Resistor_SMD:R_0603_1608MetricR1, R2
2ACJMIHinput_hub:AMPHENOL_ACJMIHJ1, J2
2Conn_01x04Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ3, J6
2PJ-307input_hub:AUDIO-TH_PJ-307J9, J10
2TPD4E05U06DQARinput_hub:IC_TPD4E05U06DQARU2, U3
1100Resistor_SMD:R_0603_1608MetricR6
1102010448input_hub:MODULE_102010448U1
110uFCapacitor_SMD:C_0805_2012MetricC2
11206L012WRFuse:Fuse_1206_3216MetricF1
154602-908LFinput_hub:RJ45_Amphenol_54602-x08_HorizontalJ4
1B2B-PH-SM4-TBinput_hub:JST_PH_B2B-PH-SM4-TB_1x02-1MP_P2.00mm_VerticalJ11
1BM04B-SRSS-TB_LF__SN_input_hub:JST_BM04B-SRSS-TB_LF__SN_J5
1Conn_01x02Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ7
1EMPOWER_Hand_Line_Silkscreen_7mm_MildSmoothinput_hub:EMPOWER_Hand_Line_Silkscreen_7mm_MildSmoothG***
1EMPOWER_Hand_Line_Silkscreen_7mm_MildSmooth_Mirroredinput_hub:EMPOWER_Hand_Line_Silkscreen_7mm_MildSmooth_MirroredG***
1XIAO_BAT_SOLDER_ACCESSinput_hub:XIAO_BAT_SOLDER_ACCESSJ8

More from Mazzorella/ClickTapToe

1
  • 2 layers30.8 × 48.5 mmMouse pointer, the printed circuit board in 3D

    Mouse pointer

    Mazzorella/ClickTapToe

    Accessible mouse implemented with ZMK.

    32 parts

Similar boards

  • 6 layers34.7 × 43 mmMitsubishiSC, the printed circuit board in 3D

    MitsubishiSC

    loozhengyuan/MitsubishiSC

    Smart controller for Mitsubishi Electric HVAC systems.

    66 partsMIT
  • 4 layers100 × 100 mmLcr, the printed circuit board in 3D

    Lcr

    Owen-Ball/LCR_Meter

    A DIY LCR meter

    182 parts
  • 2 layers79 × 83 mmInterface module, the printed circuit board in 3D

    Interface module

    psas/mints-scada-hardware

    Minimal Test Stand Supervisory

    113 parts
  • 2 layers42.2 × 68.1 mmRT4K donut dongle, the printed circuit board in 3D

    RT4K donut dongle

    svirant/DonutDongle

    Arduino Nano based hub that connects your digital and analog console switching setup with the RetroTink 4K and/or RetroTink 5x/OSSC for Auto Profile switching

    49 parts17GPL-3.0
  • 4 layers100 × 64.8 mmMSX OPL4 Wozblaster, the printed circuit board in 3D

    MSX OPL4 Wozblaster

    cristianoag/wozblaster

    Repository to host source files for the Wozblaster Reloaded

    64 parts10
  • 2 layers100 × 100 mmAbx, the printed circuit board in 3D

    Abx

    cellularmitosis/abx-tayda

    A relay board for performing blind A/B testing of two audio sources.

    85 parts2MIT
  • 2 layers100 × 100 mmLT Eval board, the printed circuit board in 3D

    LT Eval board

    kprasadvnsi/LT_Eval_board

    Evaluation board for Lichee Tang

    98 partsCC-BY-SA-4.0
  • 2 layers100 × 22.5 mmBulkyMIDI-32 Internal Panel, the printed circuit board in 3D

    BulkyMIDI-32 Internal Panel

    tebl/BulkyMIDI-32

    A HW build of the MT32-PI project, allowing you to emulate a Roland MT-32 using a Raspberry Pi. Includes enough additional modules to build a MIDI-mountain as well as adapters for connecting to most things retro.

    19 parts80CC-BY-SA-4.0

Questions

How big is the Input hub PCB?

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

What parts does the Input hub use?

35 parts, built around the TPD4E05U06DQAR, PJ-307, 1206L012WR and 54602-908LF. 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 Input hub KiCad files?

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

Can I use the Input hub design in my own project?

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