Initial and hopefully final commit

This commit is contained in:
DaalbuCZ 2024-10-19 22:09:30 +02:00
parent 455ef8e868
commit c078342572
13 changed files with 305752 additions and 0 deletions

View 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

Binary file not shown.

File diff suppressed because it is too large Load diff

View 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.

View 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()

File diff suppressed because it is too large Load diff

View 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
}
}
]
}
}

View 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": {}
}

File diff suppressed because it is too large Load diff

Binary file not shown.

Binary file not shown.

View 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()

Binary file not shown.