mirror of
https://github.com/System-End/hackpad.git
synced 2026-04-19 22:15:14 +00:00
Initial and hopefully final commit
This commit is contained in:
parent
455ef8e868
commit
c078342572
13 changed files with 305752 additions and 0 deletions
16
hackpads/daalbupad/README.md
Normal file
16
hackpads/daalbupad/README.md
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
# Daalbupad
|
||||
|
||||
I've taken up this project because I wanted to help myself with writing code and this seemed like a nice opportunity to solve my problem of programming on a laptop with 60% keyboard. I've also added several different layers for different uses. The default layer has some common shortcuts for browsing. The programming layers has some useful keys for writing code. The gaming layer has mainly discord shortcuts for now but I want to have Microsoft Flight Simulator specific functions and maybe figure out the rotary encoders with autopilot. There is also a numpad layer. The swap layer together with the display ties the layers together by allowing you to easily swap layers by holding swap key and pressing the specific layer.
|
||||
|
||||
The biggest hurdle to overcome was definitely PCB design. I've previously never tried such a thing. I had to redo the traces like 5 times throughout the iterations of the desing. But I think it has improved during this. The next thing was QMK. It just wasn't accepting my json keymap. I switched to KMK and I hope that will work on the final design.
|
||||
|
||||
# BOM:
|
||||
|
||||
- 16x Cherry MX switches
|
||||
- 4x EC11 Clickable Encoders
|
||||
- 1x PCB
|
||||
- 1x MCP23017_SP
|
||||
- 1x Seeed XIAO RP2040
|
||||
- 20x 1N4148 THT Diodes
|
||||
- 1x SSD1306 0.91' OLED 128x32
|
||||
- 2x 4.7kΩ Vertical THT Resistors
|
||||
BIN
hackpads/daalbupad/cad/Daalbupad.3mf
Normal file
BIN
hackpads/daalbupad/cad/Daalbupad.3mf
Normal file
Binary file not shown.
277367
hackpads/daalbupad/cad/Daalbupad.step
Normal file
277367
hackpads/daalbupad/cad/Daalbupad.step
Normal file
File diff suppressed because it is too large
Load diff
4
hackpads/daalbupad/firmware/README.md
Normal file
4
hackpads/daalbupad/firmware/README.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
# Firmware
|
||||
|
||||
This is the firmware written in KMK. It should support the matrix, rotary encoders and an OLED display which shows the status of the layers.
|
||||
If you want to use it first install circuitpython on the board and then install KMK. After that you can copy the code.py file to the root of the board.
|
||||
154
hackpads/daalbupad/firmware/code.py
Normal file
154
hackpads/daalbupad/firmware/code.py
Normal file
|
|
@ -0,0 +1,154 @@
|
|||
from kmk.kmk_keyboard import KMKKeyboard
|
||||
from kmk.scanners.key_matrix import KeyMatrix
|
||||
from kmk.extensions.ioexpander import MCP23017
|
||||
import board
|
||||
import busio
|
||||
from kmk.extensions.display import Display, TextEntry, ImageEntry
|
||||
from kmk.extensions.display.ssd1306 import SSD1306
|
||||
from kmk.scanners import DiodeOrientation
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.modules.encoder import EncoderHandler
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.mouse_keys import MouseKeys
|
||||
|
||||
# Create the KMKKeyboard object
|
||||
keyboard = KMKKeyboard()
|
||||
keyboard.modules.append(Layers())
|
||||
# Initialize MCP23017 connected over I2C
|
||||
i2c_bus = busio.I2C(board.D5, board.D4)
|
||||
mcp = MCP23017(i2c_bus)
|
||||
|
||||
keyboard.modules.append(EncoderHandler())
|
||||
encoder_handler = EncoderHandler()
|
||||
|
||||
keyboard.extensions.append(MediaKeys())
|
||||
keyboard.modules.append(MouseKeys())
|
||||
|
||||
driver = SSD1306(
|
||||
i2c=i2c_bus,
|
||||
device_address=0x3C,
|
||||
)
|
||||
|
||||
display = Display(
|
||||
# Mandatory:
|
||||
display=driver,
|
||||
entries=[
|
||||
TextEntry(text="Layer: ", x=0, y=32, y_anchor="B"),
|
||||
TextEntry(text="SWAP", x=40, y=32, y_anchor="B", layer=0),
|
||||
TextEntry(text="DEFAULT", x=40, y=32, y_anchor="B", layer=1),
|
||||
TextEntry(text="PROGRAMMING", x=40, y=32, y_anchor="B", layer=2),
|
||||
TextEntry(text="GAMING", x=40, y=32, y_anchor="B", layer=3),
|
||||
TextEntry(text="NUMPAD", x=40, y=32, y_anchor="B", layer=4),
|
||||
],
|
||||
# Optional:
|
||||
width=128, # screen size
|
||||
height=32, # screen size
|
||||
flip=False, # flips your display content
|
||||
flip_left=False, # flips your display content on left side split
|
||||
flip_right=False, # flips your display content on right side split
|
||||
brightness=0.8, # initial screen brightness level
|
||||
brightness_step=0.1, # used for brightness increase/decrease keycodes
|
||||
# dim_time=20, # time in seconds to reduce screen brightness
|
||||
# dim_target=0.1, # set level for brightness decrease
|
||||
# off_time=60, # time in seconds to turn off screen
|
||||
# powersave_dim_time=10, # time in seconds to reduce screen brightness
|
||||
# powersave_dim_target=0.1, # set level for brightness decrease
|
||||
# powersave_off_time=30, # time in seconds to turn off screen
|
||||
)
|
||||
keyboard.extensions.append(display)
|
||||
|
||||
keyboard.row_pins = (mcp.GPB0, mcp.GPB1, mcp.GPB2, mcp.GPB3)
|
||||
keyboard.col_pins = (mcp.GPB4, mcp.GPB5, mcp.GPB6, mcp.GPA0, mcp.GPA1)
|
||||
diode_orientation = DiodeOrientation.ROW2COL
|
||||
|
||||
encoder_handler.pins = (
|
||||
(board.D0, board.D1, None), # Encoder 1
|
||||
(board.D2, mcp.GPA6, None), # Encoder 2 (GPA6)
|
||||
(mcp.GPA5, mcp.GPA4, None), # Encoder 3 (GPA5, GPA4)
|
||||
(mcp.GPA3, mcp.GPA2, None), # Encoder 4 (GPA3, GPA2)
|
||||
)
|
||||
|
||||
LYR_SWP, LYR_DEF, LYR_PRG, LYR_GAM, LYR_NUM = 0, 1, 2, 3, 4
|
||||
xxxxxxx = KC.NO
|
||||
|
||||
# fmt: off
|
||||
keyboard.keymap = [
|
||||
# SWP LAYER
|
||||
[
|
||||
KC.DF(LYR_DEF), KC.DF(LYR_PRG), KC.DF(LYR_GAM), KC.DF(LYR_NUM), xxxxxxx, # DEFAULT PROGRAMMING GAMING NUMPAD
|
||||
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, #
|
||||
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, #
|
||||
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, #
|
||||
],
|
||||
# DEF LAYER
|
||||
[
|
||||
KC.ESC, KC.LGUI(KC.LSFT(KC.T)), KC.LGUI(KC.LCTL(KC.T)), KC.PSCR, KC.MUTE, # ESC GUI+SHIFT+T GUI+CTRL+T PRINTSCR MUTE
|
||||
KC.LALT(KC.N1), KC.LALT(KC.N2), KC.LALT(KC.N3), KC.LALT(KC.N4), KC.MPLY, # ALT+1 ALT+2 ALT+3 ALT+4 PLAY/PAUSE
|
||||
KC.LCTL(KC.F), KC.F5, KC.LCTL(KC.W), KC.LCTL(KC.T), xxxxxxx, # CTRL+F F5 CTRL+L CTRL+W
|
||||
KC.LT(LYR_SWP,KC.LALT(KC.SPC)), KC.MB_BTN5, KC.MB_BTN4, KC.LCTL(KC.T), KC.RALT, # ALT+SPACE LT BACK FORWARD CTRL+T RIGHT_ALT
|
||||
],
|
||||
|
||||
# PRG LAYER
|
||||
[
|
||||
KC.UNDS, KC.MINS, KC.PLUS, KC.EQL, KC.MUTE, # _ - + = MUTE
|
||||
KC.LABK, KC.RABK, KC.LPRN, KC.RPRN, KC.MPLY, # < > ( ) PLAY/PAUSE
|
||||
KC.SLSH, KC.HASH, KC.SCLN, KC.DQT, KC.LALT(KC.LSFT), # / # ; " ALT+SHIFT
|
||||
KC.LT(LYR_SWP,KC.LCBR), KC.RCBR, KC.LBRC, KC.RBRC, KC.LALT(KC.SPC), # { LT } [ ] ALT+SPACE
|
||||
],
|
||||
|
||||
# GAM LAYER
|
||||
[
|
||||
KC.ESC, KC.F11, KC.LALT(KC.ENT), KC.F3, KC.MUTE, # ESC F11 ALT+ENTER F3 MUTE
|
||||
KC.LCTL(KC.LSFT(KC.M)), KC.LCTL(KC.LSFT(KC.D)), KC.LSFT(KC.SLSH), xxxxxxx, KC.MPLY, # DISCORD MUTE DISCORD DEAFEN DISCORD TOGGLE PLAY/PAUSE
|
||||
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, #
|
||||
KC.LT(LYR_SWP, xxxxxxx), xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, # LT
|
||||
],
|
||||
|
||||
# NUM LAYER
|
||||
[
|
||||
KC.PSLS, KC.P7, KC.P8, KC.P9, KC.MUTE, # / 7 8 9 MUTE
|
||||
KC.PAST, KC.P4, KC.P5, KC.P6, KC.MPLY, # * 4 5 6 PLAY/PAUSE
|
||||
KC.PMNS, KC.P1, KC.P2, KC.P3, xxxxxxx, # - 1 2 3
|
||||
KC.LT(LYR_SWP, KC.PPLS), KC.EQL, KC.P0, KC.PENT, xxxxxxx, # "+ LT" = 0 ENTER
|
||||
],
|
||||
]
|
||||
|
||||
|
||||
# fmt: on
|
||||
encoder_handler.divisor = 2
|
||||
encoder_handler.map = [
|
||||
# SWP LAYER
|
||||
((), (), (), ()),
|
||||
# DEF LAYER
|
||||
(
|
||||
(KC.VOLD, KC.VOLU), # VOL_DOWN VOL_UP
|
||||
(KC.MPRV, KC.MNXT), # PREVIOUS NEXT
|
||||
(KC.BRID, KC.BRIU), # BRIGHT_DOWN BRIGHT_UP
|
||||
(KC.MW_DN, KC.MW_UP), # SCROLL DOWN SCROLL UP
|
||||
),
|
||||
# PRG LAYER
|
||||
(
|
||||
(KC.VOLD, KC.VOLU), # VOL_DOWN VOL_UP
|
||||
(KC.MPRV, KC.MNXT), # PREVIOUS NEXT
|
||||
(KC.DOWN, KC.UP), # DOWN UP
|
||||
(KC.LEFT, KC.RGHT), # LEFT RIGHT
|
||||
),
|
||||
# GAM LAYER
|
||||
(
|
||||
(KC.VOLD, KC.VOLU), # VOL_DOWN VOL_UP
|
||||
(KC.MPRV, KC.MNXT), # PREVIOUS NEXT
|
||||
(), #
|
||||
(), #
|
||||
),
|
||||
# NUM LAYER
|
||||
(
|
||||
(KC.VOLD, KC.VOLU), # VOL_DOWN VOL_UP
|
||||
(KC.MPRV, KC.MNXT), # PREVIOUS NEXT
|
||||
(KC.DOWN, KC.UP), # DOWN UP
|
||||
(KC.LEFT, KC.RGHT), # LEFT RIGHT
|
||||
),
|
||||
]
|
||||
|
||||
if __name__ == "__main__":
|
||||
keyboard.go()
|
||||
18944
hackpads/daalbupad/pcb/HackPad.kicad_pcb
Normal file
18944
hackpads/daalbupad/pcb/HackPad.kicad_pcb
Normal file
File diff suppressed because it is too large
Load diff
96
hackpads/daalbupad/pcb/HackPad.kicad_prl
Normal file
96
hackpads/daalbupad/pcb/HackPad.kicad_prl
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
{
|
||||
"board": {
|
||||
"active_layer": 44,
|
||||
"active_layer_preset": "All Copper Layers",
|
||||
"auto_track_width": true,
|
||||
"hidden_netclasses": [],
|
||||
"hidden_nets": [],
|
||||
"high_contrast_mode": 0,
|
||||
"net_color_mode": 1,
|
||||
"opacity": {
|
||||
"images": 0.6,
|
||||
"pads": 1.0,
|
||||
"tracks": 1.0,
|
||||
"vias": 1.0,
|
||||
"zones": 0.6
|
||||
},
|
||||
"selection_filter": {
|
||||
"dimensions": false,
|
||||
"footprints": false,
|
||||
"graphics": false,
|
||||
"keepouts": false,
|
||||
"lockedItems": false,
|
||||
"otherItems": false,
|
||||
"pads": false,
|
||||
"text": false,
|
||||
"tracks": false,
|
||||
"vias": false,
|
||||
"zones": false
|
||||
},
|
||||
"visible_items": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
8,
|
||||
9,
|
||||
10,
|
||||
11,
|
||||
12,
|
||||
13,
|
||||
15,
|
||||
16,
|
||||
17,
|
||||
18,
|
||||
19,
|
||||
20,
|
||||
21,
|
||||
22,
|
||||
23,
|
||||
24,
|
||||
25,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
30,
|
||||
32,
|
||||
33,
|
||||
34,
|
||||
35,
|
||||
36,
|
||||
39,
|
||||
40
|
||||
],
|
||||
"visible_layers": "fffffff_ffffffff",
|
||||
"zone_display_mode": 0
|
||||
},
|
||||
"git": {
|
||||
"repo_password": "",
|
||||
"repo_type": "",
|
||||
"repo_username": "",
|
||||
"ssh_key": ""
|
||||
},
|
||||
"meta": {
|
||||
"filename": "HackPad.kicad_prl",
|
||||
"version": 3
|
||||
},
|
||||
"project": {
|
||||
"files": [
|
||||
{
|
||||
"name": "HackPad.kicad_pcb",
|
||||
"open": true,
|
||||
"window": {
|
||||
"display": 0,
|
||||
"maximized": true,
|
||||
"pos_x": -8,
|
||||
"pos_y": -8,
|
||||
"size_x": 1616,
|
||||
"size_y": 868
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
584
hackpads/daalbupad/pcb/HackPad.kicad_pro
Normal file
584
hackpads/daalbupad/pcb/HackPad.kicad_pro
Normal file
|
|
@ -0,0 +1,584 @@
|
|||
{
|
||||
"board": {
|
||||
"3dviewports": [],
|
||||
"design_settings": {
|
||||
"defaults": {
|
||||
"apply_defaults_to_fp_fields": false,
|
||||
"apply_defaults_to_fp_shapes": false,
|
||||
"apply_defaults_to_fp_text": false,
|
||||
"board_outline_line_width": 0.05,
|
||||
"copper_line_width": 0.2,
|
||||
"copper_text_italic": false,
|
||||
"copper_text_size_h": 1.5,
|
||||
"copper_text_size_v": 1.5,
|
||||
"copper_text_thickness": 0.3,
|
||||
"copper_text_upright": false,
|
||||
"courtyard_line_width": 0.05,
|
||||
"dimension_precision": 4,
|
||||
"dimension_units": 3,
|
||||
"dimensions": {
|
||||
"arrow_length": 1270000,
|
||||
"extension_offset": 500000,
|
||||
"keep_text_aligned": true,
|
||||
"suppress_zeroes": false,
|
||||
"text_position": 0,
|
||||
"units_format": 1
|
||||
},
|
||||
"fab_line_width": 0.1,
|
||||
"fab_text_italic": false,
|
||||
"fab_text_size_h": 1.0,
|
||||
"fab_text_size_v": 1.0,
|
||||
"fab_text_thickness": 0.15,
|
||||
"fab_text_upright": false,
|
||||
"other_line_width": 0.1,
|
||||
"other_text_italic": false,
|
||||
"other_text_size_h": 1.0,
|
||||
"other_text_size_v": 1.0,
|
||||
"other_text_thickness": 0.15,
|
||||
"other_text_upright": false,
|
||||
"pads": {
|
||||
"drill": 0.762,
|
||||
"height": 1.524,
|
||||
"width": 1.524
|
||||
},
|
||||
"silk_line_width": 0.1,
|
||||
"silk_text_italic": false,
|
||||
"silk_text_size_h": 1.0,
|
||||
"silk_text_size_v": 1.0,
|
||||
"silk_text_thickness": 0.1,
|
||||
"silk_text_upright": false,
|
||||
"zones": {
|
||||
"min_clearance": 0.5
|
||||
}
|
||||
},
|
||||
"diff_pair_dimensions": [],
|
||||
"drc_exclusions": [],
|
||||
"meta": {
|
||||
"version": 2
|
||||
},
|
||||
"rule_severities": {
|
||||
"annular_width": "error",
|
||||
"clearance": "error",
|
||||
"connection_width": "warning",
|
||||
"copper_edge_clearance": "error",
|
||||
"copper_sliver": "warning",
|
||||
"courtyards_overlap": "error",
|
||||
"diff_pair_gap_out_of_range": "error",
|
||||
"diff_pair_uncoupled_length_too_long": "error",
|
||||
"drill_out_of_range": "error",
|
||||
"duplicate_footprints": "warning",
|
||||
"extra_footprint": "warning",
|
||||
"footprint": "error",
|
||||
"footprint_symbol_mismatch": "warning",
|
||||
"footprint_type_mismatch": "ignore",
|
||||
"hole_clearance": "error",
|
||||
"hole_near_hole": "error",
|
||||
"holes_co_located": "warning",
|
||||
"invalid_outline": "error",
|
||||
"isolated_copper": "warning",
|
||||
"item_on_disabled_layer": "error",
|
||||
"items_not_allowed": "error",
|
||||
"length_out_of_range": "error",
|
||||
"lib_footprint_issues": "warning",
|
||||
"lib_footprint_mismatch": "warning",
|
||||
"malformed_courtyard": "error",
|
||||
"microvia_drill_out_of_range": "error",
|
||||
"missing_courtyard": "ignore",
|
||||
"missing_footprint": "warning",
|
||||
"net_conflict": "warning",
|
||||
"npth_inside_courtyard": "ignore",
|
||||
"padstack": "warning",
|
||||
"pth_inside_courtyard": "ignore",
|
||||
"shorting_items": "error",
|
||||
"silk_edge_clearance": "warning",
|
||||
"silk_over_copper": "warning",
|
||||
"silk_overlap": "warning",
|
||||
"skew_out_of_range": "error",
|
||||
"solder_mask_bridge": "error",
|
||||
"starved_thermal": "error",
|
||||
"text_height": "warning",
|
||||
"text_thickness": "warning",
|
||||
"through_hole_pad_without_hole": "error",
|
||||
"too_many_vias": "error",
|
||||
"track_dangling": "warning",
|
||||
"track_width": "error",
|
||||
"tracks_crossing": "error",
|
||||
"unconnected_items": "error",
|
||||
"unresolved_variable": "error",
|
||||
"via_dangling": "warning",
|
||||
"zones_intersect": "error"
|
||||
},
|
||||
"rules": {
|
||||
"max_error": 0.005,
|
||||
"min_clearance": 0.0,
|
||||
"min_connection": 0.0,
|
||||
"min_copper_edge_clearance": 0.5,
|
||||
"min_hole_clearance": 0.25,
|
||||
"min_hole_to_hole": 0.25,
|
||||
"min_microvia_diameter": 0.2,
|
||||
"min_microvia_drill": 0.1,
|
||||
"min_resolved_spokes": 2,
|
||||
"min_silk_clearance": 0.0,
|
||||
"min_text_height": 0.8,
|
||||
"min_text_thickness": 0.08,
|
||||
"min_through_hole_diameter": 0.3,
|
||||
"min_track_width": 0.0,
|
||||
"min_via_annular_width": 0.1,
|
||||
"min_via_diameter": 0.5,
|
||||
"solder_mask_to_copper_clearance": 0.0,
|
||||
"use_height_for_length_calcs": true
|
||||
},
|
||||
"teardrop_options": [
|
||||
{
|
||||
"td_onpadsmd": true,
|
||||
"td_onroundshapesonly": false,
|
||||
"td_ontrackend": false,
|
||||
"td_onviapad": true
|
||||
}
|
||||
],
|
||||
"teardrop_parameters": [
|
||||
{
|
||||
"td_allow_use_two_tracks": true,
|
||||
"td_curve_segcount": 0,
|
||||
"td_height_ratio": 1.0,
|
||||
"td_length_ratio": 0.5,
|
||||
"td_maxheight": 2.0,
|
||||
"td_maxlen": 1.0,
|
||||
"td_on_pad_in_zone": false,
|
||||
"td_target_name": "td_round_shape",
|
||||
"td_width_to_size_filter_ratio": 0.9
|
||||
},
|
||||
{
|
||||
"td_allow_use_two_tracks": true,
|
||||
"td_curve_segcount": 0,
|
||||
"td_height_ratio": 1.0,
|
||||
"td_length_ratio": 0.5,
|
||||
"td_maxheight": 2.0,
|
||||
"td_maxlen": 1.0,
|
||||
"td_on_pad_in_zone": false,
|
||||
"td_target_name": "td_rect_shape",
|
||||
"td_width_to_size_filter_ratio": 0.9
|
||||
},
|
||||
{
|
||||
"td_allow_use_two_tracks": true,
|
||||
"td_curve_segcount": 0,
|
||||
"td_height_ratio": 1.0,
|
||||
"td_length_ratio": 0.5,
|
||||
"td_maxheight": 2.0,
|
||||
"td_maxlen": 1.0,
|
||||
"td_on_pad_in_zone": false,
|
||||
"td_target_name": "td_track_end",
|
||||
"td_width_to_size_filter_ratio": 0.9
|
||||
}
|
||||
],
|
||||
"track_widths": [],
|
||||
"tuning_pattern_settings": {
|
||||
"diff_pair_defaults": {
|
||||
"corner_radius_percentage": 80,
|
||||
"corner_style": 1,
|
||||
"max_amplitude": 1.0,
|
||||
"min_amplitude": 0.2,
|
||||
"single_sided": false,
|
||||
"spacing": 1.0
|
||||
},
|
||||
"diff_pair_skew_defaults": {
|
||||
"corner_radius_percentage": 80,
|
||||
"corner_style": 1,
|
||||
"max_amplitude": 1.0,
|
||||
"min_amplitude": 0.2,
|
||||
"single_sided": false,
|
||||
"spacing": 0.6
|
||||
},
|
||||
"single_track_defaults": {
|
||||
"corner_radius_percentage": 80,
|
||||
"corner_style": 1,
|
||||
"max_amplitude": 1.0,
|
||||
"min_amplitude": 0.2,
|
||||
"single_sided": false,
|
||||
"spacing": 0.6
|
||||
}
|
||||
},
|
||||
"via_dimensions": [],
|
||||
"zones_allow_external_fillets": false
|
||||
},
|
||||
"ipc2581": {
|
||||
"dist": "",
|
||||
"distpn": "",
|
||||
"internal_id": "",
|
||||
"mfg": "",
|
||||
"mpn": ""
|
||||
},
|
||||
"layer_presets": [],
|
||||
"viewports": []
|
||||
},
|
||||
"boards": [],
|
||||
"cvpcb": {
|
||||
"equivalence_files": []
|
||||
},
|
||||
"erc": {
|
||||
"erc_exclusions": [],
|
||||
"meta": {
|
||||
"version": 0
|
||||
},
|
||||
"pin_map": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
2,
|
||||
1,
|
||||
1,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
1,
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2
|
||||
]
|
||||
],
|
||||
"rule_severities": {
|
||||
"bus_definition_conflict": "error",
|
||||
"bus_entry_needed": "error",
|
||||
"bus_to_bus_conflict": "error",
|
||||
"bus_to_net_conflict": "error",
|
||||
"conflicting_netclasses": "error",
|
||||
"different_unit_footprint": "error",
|
||||
"different_unit_net": "error",
|
||||
"duplicate_reference": "error",
|
||||
"duplicate_sheet_names": "error",
|
||||
"endpoint_off_grid": "warning",
|
||||
"extra_units": "error",
|
||||
"global_label_dangling": "warning",
|
||||
"hier_label_mismatch": "error",
|
||||
"label_dangling": "error",
|
||||
"lib_symbol_issues": "warning",
|
||||
"missing_bidi_pin": "warning",
|
||||
"missing_input_pin": "warning",
|
||||
"missing_power_pin": "error",
|
||||
"missing_unit": "warning",
|
||||
"multiple_net_names": "warning",
|
||||
"net_not_bus_member": "warning",
|
||||
"no_connect_connected": "warning",
|
||||
"no_connect_dangling": "warning",
|
||||
"pin_not_connected": "error",
|
||||
"pin_not_driven": "error",
|
||||
"pin_to_pin": "warning",
|
||||
"power_pin_not_driven": "error",
|
||||
"similar_labels": "warning",
|
||||
"simulation_model_issue": "ignore",
|
||||
"unannotated": "error",
|
||||
"unit_value_mismatch": "error",
|
||||
"unresolved_variable": "error",
|
||||
"wire_dangling": "error"
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"pinned_footprint_libs": [],
|
||||
"pinned_symbol_libs": []
|
||||
},
|
||||
"meta": {
|
||||
"filename": "HackPad.kicad_pro",
|
||||
"version": 1
|
||||
},
|
||||
"net_settings": {
|
||||
"classes": [
|
||||
{
|
||||
"bus_width": 12,
|
||||
"clearance": 0.2,
|
||||
"diff_pair_gap": 0.25,
|
||||
"diff_pair_via_gap": 0.25,
|
||||
"diff_pair_width": 0.2,
|
||||
"line_style": 0,
|
||||
"microvia_diameter": 0.3,
|
||||
"microvia_drill": 0.1,
|
||||
"name": "Default",
|
||||
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
||||
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
||||
"track_width": 0.2,
|
||||
"via_diameter": 0.6,
|
||||
"via_drill": 0.3,
|
||||
"wire_width": 6
|
||||
}
|
||||
],
|
||||
"meta": {
|
||||
"version": 3
|
||||
},
|
||||
"net_colors": null,
|
||||
"netclass_assignments": null,
|
||||
"netclass_patterns": []
|
||||
},
|
||||
"pcbnew": {
|
||||
"last_paths": {
|
||||
"gencad": "",
|
||||
"idf": "",
|
||||
"netlist": "",
|
||||
"plot": "",
|
||||
"pos_files": "",
|
||||
"specctra_dsn": "",
|
||||
"step": "HackPad.step",
|
||||
"svg": "",
|
||||
"vrml": ""
|
||||
},
|
||||
"page_layout_descr_file": ""
|
||||
},
|
||||
"schematic": {
|
||||
"annotate_start_num": 0,
|
||||
"bom_export_filename": "",
|
||||
"bom_fmt_presets": [],
|
||||
"bom_fmt_settings": {
|
||||
"field_delimiter": ",",
|
||||
"keep_line_breaks": false,
|
||||
"keep_tabs": false,
|
||||
"name": "CSV",
|
||||
"ref_delimiter": ",",
|
||||
"ref_range_delimiter": "",
|
||||
"string_delimiter": "\""
|
||||
},
|
||||
"bom_presets": [],
|
||||
"bom_settings": {
|
||||
"exclude_dnp": false,
|
||||
"fields_ordered": [
|
||||
{
|
||||
"group_by": false,
|
||||
"label": "Reference",
|
||||
"name": "Reference",
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"group_by": true,
|
||||
"label": "Value",
|
||||
"name": "Value",
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"group_by": false,
|
||||
"label": "Datasheet",
|
||||
"name": "Datasheet",
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"group_by": false,
|
||||
"label": "Footprint",
|
||||
"name": "Footprint",
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"group_by": false,
|
||||
"label": "Qty",
|
||||
"name": "${QUANTITY}",
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"group_by": true,
|
||||
"label": "DNP",
|
||||
"name": "${DNP}",
|
||||
"show": true
|
||||
}
|
||||
],
|
||||
"filter_string": "",
|
||||
"group_symbols": true,
|
||||
"name": "Grouped By Value",
|
||||
"sort_asc": true,
|
||||
"sort_field": "Reference"
|
||||
},
|
||||
"connection_grid_size": 50.0,
|
||||
"drawing": {
|
||||
"dashed_lines_dash_length_ratio": 12.0,
|
||||
"dashed_lines_gap_length_ratio": 3.0,
|
||||
"default_line_thickness": 6.0,
|
||||
"default_text_size": 50.0,
|
||||
"field_names": [],
|
||||
"intersheets_ref_own_page": false,
|
||||
"intersheets_ref_prefix": "",
|
||||
"intersheets_ref_short": false,
|
||||
"intersheets_ref_show": false,
|
||||
"intersheets_ref_suffix": "",
|
||||
"junction_size_choice": 3,
|
||||
"label_size_ratio": 0.375,
|
||||
"operating_point_overlay_i_precision": 3,
|
||||
"operating_point_overlay_i_range": "~A",
|
||||
"operating_point_overlay_v_precision": 3,
|
||||
"operating_point_overlay_v_range": "~V",
|
||||
"overbar_offset_ratio": 1.23,
|
||||
"pin_symbol_size": 25.0,
|
||||
"text_offset_ratio": 0.15
|
||||
},
|
||||
"legacy_lib_dir": "",
|
||||
"legacy_lib_list": [],
|
||||
"meta": {
|
||||
"version": 1
|
||||
},
|
||||
"net_format_name": "",
|
||||
"page_layout_descr_file": "",
|
||||
"plot_directory": "",
|
||||
"spice_current_sheet_as_root": false,
|
||||
"spice_external_command": "spice \"%I\"",
|
||||
"spice_model_current_sheet_as_root": true,
|
||||
"spice_save_all_currents": false,
|
||||
"spice_save_all_dissipations": false,
|
||||
"spice_save_all_voltages": false,
|
||||
"subpart_first_id": 65,
|
||||
"subpart_id_separator": 0
|
||||
},
|
||||
"sheets": [
|
||||
[
|
||||
"27d0ec12-c91c-4de9-aa88-f63251e574b7",
|
||||
"Root"
|
||||
]
|
||||
],
|
||||
"text_variables": {}
|
||||
}
|
||||
8433
hackpads/daalbupad/pcb/HackPad.kicad_sch
Normal file
8433
hackpads/daalbupad/pcb/HackPad.kicad_sch
Normal file
File diff suppressed because it is too large
Load diff
BIN
hackpads/daalbupad/production/case/DaalbupadCase.stl
Normal file
BIN
hackpads/daalbupad/production/case/DaalbupadCase.stl
Normal file
Binary file not shown.
BIN
hackpads/daalbupad/production/case/DaalbupadPlate.stl
Normal file
BIN
hackpads/daalbupad/production/case/DaalbupadPlate.stl
Normal file
Binary file not shown.
154
hackpads/daalbupad/production/code.py
Normal file
154
hackpads/daalbupad/production/code.py
Normal file
|
|
@ -0,0 +1,154 @@
|
|||
from kmk.kmk_keyboard import KMKKeyboard
|
||||
from kmk.scanners.key_matrix import KeyMatrix
|
||||
from kmk.extensions.ioexpander import MCP23017
|
||||
import board
|
||||
import busio
|
||||
from kmk.extensions.display import Display, TextEntry, ImageEntry
|
||||
from kmk.extensions.display.ssd1306 import SSD1306
|
||||
from kmk.scanners import DiodeOrientation
|
||||
from kmk.extensions.media_keys import MediaKeys
|
||||
from kmk.modules.encoder import EncoderHandler
|
||||
from kmk.modules.layers import Layers
|
||||
from kmk.keys import KC
|
||||
from kmk.modules.mouse_keys import MouseKeys
|
||||
|
||||
# Create the KMKKeyboard object
|
||||
keyboard = KMKKeyboard()
|
||||
keyboard.modules.append(Layers())
|
||||
# Initialize MCP23017 connected over I2C
|
||||
i2c_bus = busio.I2C(board.D5, board.D4)
|
||||
mcp = MCP23017(i2c_bus)
|
||||
|
||||
keyboard.modules.append(EncoderHandler())
|
||||
encoder_handler = EncoderHandler()
|
||||
|
||||
keyboard.extensions.append(MediaKeys())
|
||||
keyboard.modules.append(MouseKeys())
|
||||
|
||||
driver = SSD1306(
|
||||
i2c=i2c_bus,
|
||||
device_address=0x3C,
|
||||
)
|
||||
|
||||
display = Display(
|
||||
# Mandatory:
|
||||
display=driver,
|
||||
entries=[
|
||||
TextEntry(text="Layer: ", x=0, y=32, y_anchor="B"),
|
||||
TextEntry(text="SWAP", x=40, y=32, y_anchor="B", layer=0),
|
||||
TextEntry(text="DEFAULT", x=40, y=32, y_anchor="B", layer=1),
|
||||
TextEntry(text="PROGRAMMING", x=40, y=32, y_anchor="B", layer=2),
|
||||
TextEntry(text="GAMING", x=40, y=32, y_anchor="B", layer=3),
|
||||
TextEntry(text="NUMPAD", x=40, y=32, y_anchor="B", layer=4),
|
||||
],
|
||||
# Optional:
|
||||
width=128, # screen size
|
||||
height=32, # screen size
|
||||
flip=False, # flips your display content
|
||||
flip_left=False, # flips your display content on left side split
|
||||
flip_right=False, # flips your display content on right side split
|
||||
brightness=0.8, # initial screen brightness level
|
||||
brightness_step=0.1, # used for brightness increase/decrease keycodes
|
||||
# dim_time=20, # time in seconds to reduce screen brightness
|
||||
# dim_target=0.1, # set level for brightness decrease
|
||||
# off_time=60, # time in seconds to turn off screen
|
||||
# powersave_dim_time=10, # time in seconds to reduce screen brightness
|
||||
# powersave_dim_target=0.1, # set level for brightness decrease
|
||||
# powersave_off_time=30, # time in seconds to turn off screen
|
||||
)
|
||||
keyboard.extensions.append(display)
|
||||
|
||||
keyboard.row_pins = (mcp.GPB0, mcp.GPB1, mcp.GPB2, mcp.GPB3)
|
||||
keyboard.col_pins = (mcp.GPB4, mcp.GPB5, mcp.GPB6, mcp.GPA0, mcp.GPA1)
|
||||
diode_orientation = DiodeOrientation.ROW2COL
|
||||
|
||||
encoder_handler.pins = (
|
||||
(board.D0, board.D1, None), # Encoder 1
|
||||
(board.D2, mcp.GPA6, None), # Encoder 2 (GPA6)
|
||||
(mcp.GPA5, mcp.GPA4, None), # Encoder 3 (GPA5, GPA4)
|
||||
(mcp.GPA3, mcp.GPA2, None), # Encoder 4 (GPA3, GPA2)
|
||||
)
|
||||
|
||||
LYR_SWP, LYR_DEF, LYR_PRG, LYR_GAM, LYR_NUM = 0, 1, 2, 3, 4
|
||||
xxxxxxx = KC.NO
|
||||
|
||||
# fmt: off
|
||||
keyboard.keymap = [
|
||||
# SWP LAYER
|
||||
[
|
||||
KC.DF(LYR_DEF), KC.DF(LYR_PRG), KC.DF(LYR_GAM), KC.DF(LYR_NUM), xxxxxxx, # DEFAULT PROGRAMMING GAMING NUMPAD
|
||||
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, #
|
||||
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, #
|
||||
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, #
|
||||
],
|
||||
# DEF LAYER
|
||||
[
|
||||
KC.ESC, KC.LGUI(KC.LSFT(KC.T)), KC.LGUI(KC.LCTL(KC.T)), KC.PSCR, KC.MUTE, # ESC GUI+SHIFT+T GUI+CTRL+T PRINTSCR MUTE
|
||||
KC.LALT(KC.N1), KC.LALT(KC.N2), KC.LALT(KC.N3), KC.LALT(KC.N4), KC.MPLY, # ALT+1 ALT+2 ALT+3 ALT+4 PLAY/PAUSE
|
||||
KC.LCTL(KC.F), KC.F5, KC.LCTL(KC.W), KC.LCTL(KC.T), xxxxxxx, # CTRL+F F5 CTRL+L CTRL+W
|
||||
KC.LT(LYR_SWP,KC.LALT(KC.SPC)), KC.MB_BTN5, KC.MB_BTN4, KC.LCTL(KC.T), KC.RALT, # ALT+SPACE LT BACK FORWARD CTRL+T RIGHT_ALT
|
||||
],
|
||||
|
||||
# PRG LAYER
|
||||
[
|
||||
KC.UNDS, KC.MINS, KC.PLUS, KC.EQL, KC.MUTE, # _ - + = MUTE
|
||||
KC.LABK, KC.RABK, KC.LPRN, KC.RPRN, KC.MPLY, # < > ( ) PLAY/PAUSE
|
||||
KC.SLSH, KC.HASH, KC.SCLN, KC.DQT, KC.LALT(KC.LSFT), # / # ; " ALT+SHIFT
|
||||
KC.LT(LYR_SWP,KC.LCBR), KC.RCBR, KC.LBRC, KC.RBRC, KC.LALT(KC.SPC), # { LT } [ ] ALT+SPACE
|
||||
],
|
||||
|
||||
# GAM LAYER
|
||||
[
|
||||
KC.ESC, KC.F11, KC.LALT(KC.ENT), KC.F3, KC.MUTE, # ESC F11 ALT+ENTER F3 MUTE
|
||||
KC.LCTL(KC.LSFT(KC.M)), KC.LCTL(KC.LSFT(KC.D)), KC.LSFT(KC.SLSH), xxxxxxx, KC.MPLY, # DISCORD MUTE DISCORD DEAFEN DISCORD TOGGLE PLAY/PAUSE
|
||||
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, #
|
||||
KC.LT(LYR_SWP, xxxxxxx), xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, # LT
|
||||
],
|
||||
|
||||
# NUM LAYER
|
||||
[
|
||||
KC.PSLS, KC.P7, KC.P8, KC.P9, KC.MUTE, # / 7 8 9 MUTE
|
||||
KC.PAST, KC.P4, KC.P5, KC.P6, KC.MPLY, # * 4 5 6 PLAY/PAUSE
|
||||
KC.PMNS, KC.P1, KC.P2, KC.P3, xxxxxxx, # - 1 2 3
|
||||
KC.LT(LYR_SWP, KC.PPLS), KC.EQL, KC.P0, KC.PENT, xxxxxxx, # "+ LT" = 0 ENTER
|
||||
],
|
||||
]
|
||||
|
||||
|
||||
# fmt: on
|
||||
encoder_handler.divisor = 2
|
||||
encoder_handler.map = [
|
||||
# SWP LAYER
|
||||
((), (), (), ()),
|
||||
# DEF LAYER
|
||||
(
|
||||
(KC.VOLD, KC.VOLU), # VOL_DOWN VOL_UP
|
||||
(KC.MPRV, KC.MNXT), # PREVIOUS NEXT
|
||||
(KC.BRID, KC.BRIU), # BRIGHT_DOWN BRIGHT_UP
|
||||
(KC.MW_DN, KC.MW_UP), # SCROLL DOWN SCROLL UP
|
||||
),
|
||||
# PRG LAYER
|
||||
(
|
||||
(KC.VOLD, KC.VOLU), # VOL_DOWN VOL_UP
|
||||
(KC.MPRV, KC.MNXT), # PREVIOUS NEXT
|
||||
(KC.DOWN, KC.UP), # DOWN UP
|
||||
(KC.LEFT, KC.RGHT), # LEFT RIGHT
|
||||
),
|
||||
# GAM LAYER
|
||||
(
|
||||
(KC.VOLD, KC.VOLU), # VOL_DOWN VOL_UP
|
||||
(KC.MPRV, KC.MNXT), # PREVIOUS NEXT
|
||||
(), #
|
||||
(), #
|
||||
),
|
||||
# NUM LAYER
|
||||
(
|
||||
(KC.VOLD, KC.VOLU), # VOL_DOWN VOL_UP
|
||||
(KC.MPRV, KC.MNXT), # PREVIOUS NEXT
|
||||
(KC.DOWN, KC.UP), # DOWN UP
|
||||
(KC.LEFT, KC.RGHT), # LEFT RIGHT
|
||||
),
|
||||
]
|
||||
|
||||
if __name__ == "__main__":
|
||||
keyboard.go()
|
||||
BIN
hackpads/daalbupad/production/gerbers.zip
Normal file
BIN
hackpads/daalbupad/production/gerbers.zip
Normal file
Binary file not shown.
Loading…
Add table
Reference in a new issue