my second attempt at an analog hall effect keypad. built for osu! but can be configured to use as a general-purpose macro keypad.
4x HE switches + rotary encoder knob + dpad + screen
uses the waveshare rp2040 zero
fully assembled: ~110 mm x 80 mm x 40 mm (including height of feet & knob)
- rapid trigger w configurable actuation
- fully configurable edge leds & per key leds, comes with multiple animations built in
- can configure all inputs to press any number of keys
- rotary encoder knob, configured by default to scroll up and down
- can do media controls (brightness, volume, next/prev track, play/pause)
- can act as a gamepad
- controllable via serial (including the WebSerial API)
- everything configurable on device via the oled display
- price: ~$20-30? (if you buy parts / pcbs for 10 keypads)
- 1x 3d printed case (see strellpad2-top.stl and strellpad2-bottom.stl)
- 1x 3d printed dpad (see dpad.stl)
- 4x hall effect switches (geon raptor HE) + 4x 1u keycaps
- 11 rgb leds (ws2812b-5050) (4 key leds, 7 edge leds)
- 1x PEC16-4015F-S0024 (rotary encoder, switch variant)
- 4x BRIGHT TSA063G60-250 (dpad switches)
- 1x waveshare rp2040-zero (buy the one with headers included)
- 1x ssd1306 oled lcd display (128x32px)
- 4x hall effect sensors (sot23, either SLSS49E or AH49ENTR-G1 are good)
- various resistors + capacitors, check BOM for details
here's some example WebSerial code if you want to interact with the device using JavaScript:
async function connect() {
if (window.strellpad) return window.serialPort;
window.strellpad = await navigator.serial.requestPort({ filters: [{ usbVendorId: 0x727 }] });
await window.strellpad.open({ baudRate: 115200 });
return window.strellpad;
}
async function run(command) {
if (!window.strellpad) throw new Error("strellpad not connected");
const id = Math.random().toString(36).slice(2,7);
const encoder = new TextEncoder();
const writer = window.strellpad.writable.getWriter();
writer.write(encoder.encode(JSON.stringify({...command, id}) + "\n"));
writer.releaseLock();
let data = "";
const reader = window.strellpad.readable.getReader();
while (data.split(id).length !== 3) {
const result = await reader.read();
if (!result) continue;
const decoder = new TextDecoder();
const decoded = decoder.decode(result.value);
data += decoded;
await new Promise(r => setTimeout(r, 25));
}
reader.releaseLock();
return JSON.parse(data.split(id)[1]);
}
written using circuitpython and the adafruit hid gamepad libraries. make sure to install the required libraries.
use dpad to navigate menus, knob to change options / press to select. no program required on computer, everything is configurable from the device itself
took inspiration from Project Minipad