Add files via upload

This commit is contained in:
jonhabba 2025-02-17 09:52:31 +01:00 committed by GitHub
parent ffa6d605c9
commit ea5efa2295
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
26 changed files with 221914 additions and 0 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,61 @@
import board
import busio
import displayio
import terminalio
import neopixel
from kmk.kmk_keyboard import KMKKeyboard
from kmk.keys import KC
from kmk.modules.encoder import EncoderHandler
from adafruit_display_text import label
from adafruit_displayio_ssd1306 import SSD1306
# D0: Switch@Rotary encoder
# D1: Rotary-Encoder output A
# D3: Rotary-Encoder output B
# D4: Display SDA
# D5: Display SCL
# D7: Switch 1
# D8: Switch 2
# D9: Switch 3
# D10: Switch 4
keyboard = KMKKeyboard()
keyboard.col_pins = (board.D7, board.D8, board.D9, board.D10) # SW1-SW4
keyboard.row_pins = ()
pixels = neopixel.NeoPixel(board.D6)
pixels.fill(255,255,255)
pixels.show()
encoder_handler = EncoderHandler()
keyboard.modules.append(encoder_handler)
encoder_handler.pins = ((board.D1, board.D2, board.D0),) # A, B, Switch
encoder_handler.map = [
((KC.VOLU, KC.VOLD), KC.MUTE)
]
keyboard.keymap = [
[KC.N1, KC.N2, KC.N3, KC.N4]
]
displayio.release_displays()
i2c = busio.I2C(board.D5, board.D4)
display_bus = displayio.I2CDisplay(i2c, device_address=0x3C)
display = SSD1306(display_bus, width=128, height=64)
splash = displayio.Group()
text_area = label.Label(terminalio.FONT, text="Keyboard", color=0xFFFFFF, x=10, y=10)
splash.append(text_area)
display.show(splash)
def update_display(message):
text_area.text = message
display.show(splash)
def on_keypress(key):
update_display(f"Pressed: {key.name}")
keyboard.pressed_callbacks.append(on_keypress)
if __name__ == '__main__':
keyboard.go()

View file

@ -0,0 +1 @@
C:\Users\timka\Desktop\Programmieren_Priv\Hackpad\PCB-Design\_autosave-PCB-Design.kicad_sch

View file

@ -0,0 +1,37 @@
M48
; DRILL file {KiCad 8.0.8} date 2025-02-14T01:40:04+0100
; FORMAT={-:-/ absolute / metric / decimal}
; #@! TF.CreationDate,2025-02-14T01:40:04+01:00
; #@! TF.GenerationSoftware,Kicad,Pcbnew,8.0.8
; #@! TF.FileFunction,NonPlated,1,2,NPTH
FMAT,2
METRIC
; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill
T1C1.700
; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill
T2C2.100
; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill
T3C4.000
%
G90
G05
T1
X140.42Y-102.0
X150.58Y-102.0
X160.92Y-102.0
X171.08Y-102.0
X181.0Y-102.0
X191.16Y-102.0
X201.42Y-102.0
X211.58Y-102.0
T2
X139.0Y-51.0
X139.0Y-112.0
X213.0Y-51.0
X213.0Y-112.0
T3
X145.5Y-102.0
X166.0Y-102.0
X186.08Y-102.0
X206.5Y-102.0
M30

View file

@ -0,0 +1,88 @@
M48
; DRILL file {KiCad 8.0.8} date 2025-02-14T01:40:04+0100
; FORMAT={-:-/ absolute / metric / decimal}
; #@! TF.CreationDate,2025-02-14T01:40:04+01:00
; #@! TF.GenerationSoftware,Kicad,Pcbnew,8.0.8
; #@! TF.FileFunction,Plated,1,2,PTH
FMAT,2
METRIC
; #@! TA.AperFunction,Plated,PTH,ViaDrill
T1C0.300
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
T2C0.889
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
T3C1.000
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
T4C1.500
%
G90
G05
T1
X148.0Y-109.0
X155.0Y-83.0
X163.0Y-82.0
X168.0Y-110.0
X169.0Y-85.0
X179.0Y-71.0
X180.0Y-51.0
X181.0Y-71.0
X182.0Y-75.0
X183.0Y-71.0
X185.0Y-71.0
X186.039Y-81.961
X187.039Y-82.961
X188.0Y-71.0
X188.0Y-110.0
X191.0Y-68.0
X192.0Y-51.0
X192.0Y-62.0
X192.0Y-65.0
X193.0Y-84.0
X209.0Y-109.0
X212.0Y-59.0
T2
X178.38Y-50.88
X178.38Y-53.42
X178.38Y-55.96
X178.38Y-58.5
X178.38Y-61.04
X178.38Y-63.58
X178.38Y-66.12
X193.62Y-50.88
X193.62Y-53.42
X193.62Y-55.96
X193.62Y-58.5
X193.62Y-61.04
X193.62Y-63.58
X193.62Y-66.12
T3
X157.08Y-51.05
X159.62Y-51.05
X162.16Y-51.05
X164.7Y-51.05
X197.75Y-65.0
X197.75Y-67.5
X197.75Y-70.0
X212.25Y-65.0
X212.25Y-70.0
T4
X141.69Y-99.46
X148.04Y-96.92
X162.19Y-99.46
X168.54Y-96.92
X182.27Y-99.46
X188.62Y-96.92
X202.69Y-99.46
X209.04Y-96.92
T4
G00X204.6Y-61.9
M15
G01X205.9Y-61.9
M16
G05
G00X204.6Y-73.1
M15
G01X205.9Y-73.1
M16
G05
M30

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,83 @@
{
"board": {
"active_layer": 0,
"active_layer_preset": "All 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": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": false,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"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": "PCB-Design.kicad_prl",
"version": 3
},
"project": {
"files": []
}
}

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": "ignore",
"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": "PCB-Design.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": "PCB-Design.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": "Referenz"
},
"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": [
[
"57f54316-b327-454d-b09a-b37c94030011",
"Root"
]
],
"text_variables": {}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,5 @@
(kicad_sch (version 20231120) (generator "eeschema") (generator_version "8.0")
(paper "A4")
(lib_symbols)
(symbol_instances)
)

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,6 @@
(fp_lib_table
(version 7)
(lib (name "OPL")(type "KiCad")(uri "${KIPRJMOD}/OPL_Kicad_Library-master/Seeed Studio XIAO Series Library")(options "")(descr ""))
(lib (name "RP2040")(type "KiCad")(uri "${KIPRJMOD}/Seeeduino-xiao-rp2040-KiCAD-Library/XIAO_PCB.pretty")(options "")(descr ""))
(lib (name "0.96_OLED_Display")(type "KiCad")(uri "${KIPRJMOD}/0,96inch_oled_display/library/SSD1306.pretty")(options "")(descr ""))
)

View file

@ -0,0 +1,6 @@
(sym_lib_table
(version 7)
(lib (name "OPL")(type "KiCad")(uri "${KIPRJMOD}/OPL_Kicad_Library-master/Seeed Studio XIAO Series Library/Seeed_Studio_XIAO_Series.kicad_sym")(options "")(descr ""))
(lib (name "rp2040")(type "KiCad")(uri "${KIPRJMOD}/Seeeduino-xiao-rp2040-KiCAD-Library/MOUDLE-SEEEDUINO-XIAO.kicad_sym")(options "")(descr ""))
(lib (name "0.96_OLED_Display")(type "KiCad")(uri "${KIPRJMOD}/0,96inch_oled_display/library/SSD1306-128x64_OLED.kicad_sym")(options "")(descr ""))
)

View file

@ -0,0 +1 @@
{"hostname":"LAPTOP-TIK","username":"timka"}

View file

@ -0,0 +1 @@
{"hostname":"LAPTOP-TIK","username":"timka"}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,61 @@
import board
import busio
import displayio
import terminalio
import neopixel
from kmk.kmk_keyboard import KMKKeyboard
from kmk.keys import KC
from kmk.modules.encoder import EncoderHandler
from adafruit_display_text import label
from adafruit_displayio_ssd1306 import SSD1306
# D0: Switch@Rotary encoder
# D1: Rotary-Encoder output A
# D3: Rotary-Encoder output B
# D4: Display SDA
# D5: Display SCL
# D7: Switch 1
# D8: Switch 2
# D9: Switch 3
# D10: Switch 4
keyboard = KMKKeyboard()
keyboard.col_pins = (board.D7, board.D8, board.D9, board.D10) # SW1-SW4
keyboard.row_pins = ()
pixels = neopixel.NeoPixel(board.D6)
pixels.fill(255,255,255)
pixels.show()
encoder_handler = EncoderHandler()
keyboard.modules.append(encoder_handler)
encoder_handler.pins = ((board.D1, board.D2, board.D0),) # A, B, Switch
encoder_handler.map = [
((KC.VOLU, KC.VOLD), KC.MUTE)
]
keyboard.keymap = [
[KC.N1, KC.N2, KC.N3, KC.N4]
]
displayio.release_displays()
i2c = busio.I2C(board.D5, board.D4)
display_bus = displayio.I2CDisplay(i2c, device_address=0x3C)
display = SSD1306(display_bus, width=128, height=64)
splash = displayio.Group()
text_area = label.Label(terminalio.FONT, text="Keyboard", color=0xFFFFFF, x=10, y=10)
splash.append(text_area)
display.show(splash)
def update_display(message):
text_area.text = message
display.show(splash)
def on_keypress(key):
update_display(f"Pressed: {key.name}")
keyboard.pressed_callbacks.append(on_keypress)
if __name__ == '__main__':
keyboard.go()

View file

@ -0,0 +1,9 @@
# Parts
- 1x Seeed XIAO RP2040
- 4x MX-Style switches
- 1x 0.96 inch OLED display
- 4x Blank DSA keycaps (in white please :^) )
- 1x EC11E Rotary Encoder
- 7x SK6812 MINI-E LEDs
- red case if possible ^^

View file

@ -0,0 +1,35 @@
# T_UNSERHackpad
This is my submission for Hackcklub Hackpad. It should provide music data later in the process of writing the firmware, and then also skipping, pausing and starting songs. The rotary encoder will be responsible for changing volume.
## Design
![grafik](https://github.com/user-attachments/assets/03582040-9d45-4e0c-af8f-10559018bc58)
## Inspiration
Because I like to listen to music a lot and don't always want to look up spotify or some similar apps, I want to have my data on the oled screen directly.
This makes it way easier to shuffle through different songs and will definitely very practical for me.
## Challenges
My biggest challenge in this project was definitely designing the pcb, beacuse I have never done something like this before. Luckily I have already wired up microcontrollers on breadboards, so I had some similar experience before.
Nevertheless, it was very interesting to learn that too, because I lilke learning various new things very much!
## Specifications
BOM:
- 1x Seeed XIAO RP2040
- 4x MX-Style switches
- 1x 0.96 inch OLED display
- 4x Blank DSA keycaps (white)
- 1x EC11E Rotary Encoder
- 7x SK6812 MINI-E LEDs
- 1x Case (if possible in acrylic red)
Other:
- KMK Firmware
- Top.stl
- Bottom.stl
| Schematics | PCB | Case |
|------------|-----|------|
| ![grafik](https://github.com/user-attachments/assets/5e568cde-e135-49bb-99c7-88ec5ef33ba9) | ![grafik](https://github.com/user-attachments/assets/a89f3408-92a4-4832-9892-441fddb1ad76) | ![grafik](https://github.com/user-attachments/assets/2faf2411-25c6-46cb-bae9-0f421d96d4ef) <br> ![grafik](https://github.com/user-attachments/assets/61c139e2-50dc-4b81-bbdb-00e8d18e70e9) |