Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions hackpads/wirepad/BOM.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# BOM

- 1x Seeed XIAO - RP2040 (THT)
- 1x 0.96" 4-pin I2C OLED display
- 12x 1N4148 THT diodes
- 12x MX-style switches (15x15 mm from the approved parts)
48 changes: 48 additions & 0 deletions hackpads/wirepad/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Wirepad

![wirepad screenshot](./imgs/wirepad-screenshot.png)

This is a macropad made for [Hackpad v2](https://hackpad.hackclub.com/). The requirements were such that the PCB must not be bigger than 100x100 mm, and that the case should not exceed 200x200x100 mm, when printed.

Because I sometimes like to challenge myself, I decided to make a modular design, that would span over the 100x100 mm PCB limit: 70 + 70 + 70 = 210 mm! The PCB is a panelized PCB (using mousebites) consisting of 3 other PCBs. They will be _wired_ together using normal thin electric wires, hence the name **Wire**pad.

## Schematic

I have an OLED display, 12 keys (4 columns times 3 row), and 12 diodes.

![schematic screenshot](./imgs/schematic-screenshot.png)

## PCB

![PCB screenshot](imgs/pcb-screenshot.png)

Dimensions: **99x90 mm**

3 total PCBs are to be manufactured as 1. Panelized using mousebites.

### DRC

The DRC doesn't pass all tests and there are some errors, however, **all the errors reported have to do with the fact that some connections remain unconnected**. **This is done on purpose** because of the manual wiring to be done later on.

## Case

Designing the case was a bit tricky. First and foremost: it's _long_. So I had to split it into 5 pieces.

![case parts](imgs/case-parts.png)

Parts 1-3 are assembled together using a sort of zig-zag pattern, there is also some clearance left (because the case is 3D printed):

![zig-zag-interlock](imgs/zig-zag.png)

They also have round holes through which the wires go.

Then there is the case cover (4 and 5), which is split into two parts: one that covers the main PCB (where the XIAO is, head) and the middle part, and one that covers the other smaller PCB (tail). I, again, made sure to have some clearance between the walls of the cover and the actual case. The case cover will be held in place using glue.

The PCB will be held in place using paper and glue (I'm not kidding, I'm an origamist): I decided to go with this approach because I wanted the assembly to be as interesting and as simple as possible, while having a more personal touch.

## BOM

- 1x Seeed XIAO - RP2040 (THT)
- 1x 0.96" 4-pin I2C OLED display
- 12x 1N4148 THT diodes
- 12x MX-style switches (15x15 mm from the approved parts)
Binary file not shown.
Binary file added hackpads/wirepad/cad/assembled.3mf
Binary file not shown.
Binary file added hackpads/wirepad/cad/assembled.FCStd
Binary file not shown.
Binary file added hackpads/wirepad/cad/case.20250217-101650.FCBak
Binary file not shown.
Binary file added hackpads/wirepad/cad/case.3mf
Binary file not shown.
Binary file added hackpads/wirepad/cad/case.FCStd
Binary file not shown.
36 changes: 36 additions & 0 deletions hackpads/wirepad/firmware/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import board

from kmk.kmk_keyboard import KMKKeyboard
from kmk.scanners.keypad import KeysScanner
from kmk.keys import KC, key
from kmk.modules.macros import Macros, UnicodeModeIBus, UnicodeModeMacOS, UnicodeModeWinC
from kmk.scanners import DiodeOrientation

keyboard = KMKKeyboard()

col_pins = (board.GP26, board.GP27, board.GP28, board.GP29)
row_pins = (board.GP3, board.GP4, board.GP2)

diode_orientation = DiodeOrientation.COL2ROW

macros = Macros(unicode_mode=UnicodeModeMacOS)
keyboard.modules.append(macros)

def switch_um(keyboard):
if macros.unicode_mode == UnicodeModeIBus:
macros.unicode_mode = UnicodeModeMacOS
elif macros.unicode_mode == UnicodeModeMacOS:
macros.unicode_mode = UnicodeModeWinC
else:
macros.Unicode_mode = UnicodeModeIBus

UCCYCLE = Key(code=None, on_press=switch_um)

keyboard.keymap = [
[KC.MACRO("Hello World!"), KC.MACRO("¯\_(ツ)_/¯"), KC.MACRO("◉︵◉"), KC.MACRO("\(^o^)/"),
KC.MACRO("😁"), KC.F, KC.L, KC.W,
KC.MACRO("❤️"), KC.MACRO("👍"), KC.A, KC.B]
]

if __name__ == '__main__':
keyboard.go()
Binary file added hackpads/wirepad/imgs/case-parts.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added hackpads/wirepad/imgs/pcb-screenshot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added hackpads/wirepad/imgs/schematic-screenshot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added hackpads/wirepad/imgs/wirepad-screenshot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added hackpads/wirepad/imgs/zig-zag.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading