Merge branch 'main' into main

This commit is contained in:
DJ_Laser 2025-03-11 13:24:46 -04:00 committed by GitHub
commit d8906165d6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
1304 changed files with 10953685 additions and 121183 deletions

5
.gitmodules vendored
View file

@ -14,4 +14,7 @@
branch = ambrylight
[submodule "hackpads/n16-remote"]
path = hackpads/n16-remote
url = https://github.com/DJ-Laser/n16-remote
url = https://github.com/DJ-Laser/n16-remot
[submodule "hackpads/shrekpad"]
path = hackpads/shrekpad
url = https://github.com/daamin909/shrekpad

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,81 @@
import board
import time
from kmk.kmk_keyboard import KMKKeyboard
from kmk.scanners.keypad import MatrixScanner
from kmk.keys import KC
from kmk.modules.rotary_encoder import RotaryEncoderHandler
from kmk.extensions.peg_rgb_matrix import Rgb_matrix
keyboard = KMKKeyboard()
rgb = Rgb_matrix()
keyboard.extensions.append(rgb)
keyboard.matrix = MatrixScanner(
column_pins=[board.GP3, board.GP4, board.GP2, board.GP1],
row_pins=[board.GP27, board.GP28, board.G29],
value_when_pressed=False,
)
keyboard.keymap = [
#layer0
[
[KC.F13, KC.F14, KC.F15, KC.F16,],
[KC.F17, KC.F18, KC.F19, KC.F20,],
[KC.F21, KC.F22, KC.F23, KC.F24,],
],
#layer1
[
[KC.F25, KC.F26, KC.F27, KC.F28,],
[KC.F29, KC.F30, KC.F31, KC.F32,],
[KC.F33, KC.F34, KC.F35, KC.F36,],
],
#layer2
[
[KC.F37, KC.F38, KC.F39, KC.F40,],
[KC.F41, KC.F42, KC.F43, KC.F44,],
[KC.F45, KC.F46, KC.F47, KC.F48,],
],
]
def switch_layer(layer):
keyboard.active_layers = [layer]
if layer == 0:
keyboard.set_pixel(0, 255, 0, 0)
keyboard.set_pixel(1, 255, 1, 1)
keyboard.set_pixel(2, 255, 2, 2)
keyboard.set_pixel(3, 255, 3, 3)
elif layer == 1:
keyboard.set_pixel(0, 0, 255, 0)
keyboard.set_pixel(1, 1, 255, 1)
keyboard.set_pixel(2, 2, 255, 2)
keyboard.set_pixel(3, 3, 255, 3)
elif layer == 2:
keyboard.set_pixel(0, 0, 0, 255)
keyboard.set_pixel(1, 1, 1, 255)
keyboard.set_pixel(2, 2, 2, 255)
keyboard.set_pixel(3, 3, 3, 255)
rgb.write()
current_layer = 0
switch_layer(current_layer)
encoder = RotaryEncoderHandler(pin_a=board.GP7, pin_b=board.GP6,pin_S1=board.GP1)
encoder.rotation_cw = KC.VOLU
encoder.rotation_ccw = KC.VOLD
keyboard.modules.append(encoder)
while True:
keyboard.update()
if keyboard.matrix.is_pressed(0, 0):
current_layer = (current_layer + 1) % 3
switch_layer(current_layer)
time.sleep(0.3)
if __name__ == '__main__':
keyboard.go()

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,579 @@
{
"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": "kubas fake calculator.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": "../../gerbers/",
"pos_files": "",
"specctra_dsn": "",
"step": "kubas fake calculator final.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": [],
"text_variables": {}
}

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

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,81 @@
import board
import time
from kmk.kmk_keyboard import KMKKeyboard
from kmk.scanners.keypad import MatrixScanner
from kmk.keys import KC
from kmk.modules.rotary_encoder import RotaryEncoderHandler
from kmk.extensions.peg_rgb_matrix import Rgb_matrix
keyboard = KMKKeyboard()
rgb = Rgb_matrix()
keyboard.extensions.append(rgb)
keyboard.matrix = MatrixScanner(
column_pins=[board.GP3, board.GP4, board.GP2, board.GP1],
row_pins=[board.GP27, board.GP28, board.G29],
value_when_pressed=False,
)
keyboard.keymap = [
#layer0
[
[KC.F13, KC.F14, KC.F15, KC.F16,],
[KC.F17, KC.F18, KC.F19, KC.F20,],
[KC.F21, KC.F22, KC.F23, KC.F24,],
],
#layer1
[
[KC.F25, KC.F26, KC.F27, KC.F28,],
[KC.F29, KC.F30, KC.F31, KC.F32,],
[KC.F33, KC.F34, KC.F35, KC.F36,],
],
#layer2
[
[KC.F37, KC.F38, KC.F39, KC.F40,],
[KC.F41, KC.F42, KC.F43, KC.F44,],
[KC.F45, KC.F46, KC.F47, KC.F48,],
],
]
def switch_layer(layer):
keyboard.active_layers = [layer]
if layer == 0:
keyboard.set_pixel(0, 255, 0, 0)
keyboard.set_pixel(1, 255, 1, 1)
keyboard.set_pixel(2, 255, 2, 2)
keyboard.set_pixel(3, 255, 3, 3)
elif layer == 1:
keyboard.set_pixel(0, 0, 255, 0)
keyboard.set_pixel(1, 1, 255, 1)
keyboard.set_pixel(2, 2, 255, 2)
keyboard.set_pixel(3, 3, 255, 3)
elif layer == 2:
keyboard.set_pixel(0, 0, 0, 255)
keyboard.set_pixel(1, 1, 1, 255)
keyboard.set_pixel(2, 2, 2, 255)
keyboard.set_pixel(3, 3, 3, 255)
rgb.write()
current_layer = 0
switch_layer(current_layer)
encoder = RotaryEncoderHandler(pin_a=board.GP7, pin_b=board.GP6,pin_S1=board.GP1)
encoder.rotation_cw = KC.VOLU
encoder.rotation_ccw = KC.VOLD
keyboard.modules.append(encoder)
while True:
keyboard.update()
if keyboard.matrix.is_pressed(0, 0):
current_layer = (current_layer + 1) % 3
switch_layer(current_layer)
time.sleep(0.3)
if __name__ == '__main__':
keyboard.go()

View file

@ -0,0 +1,51 @@
## Project - Kuba's fake calculator
When I heard about this chalange I knew I had to try to build my own macropad. I had never create a electronic thing like this, so it was absolutely new experience to me. I learned a lot about designing a pcb and I hope this knowlege will be uesfull in the future. Overall it was a really good time but I struggled a litlle with fusion 360 program but i managed to use it.
## Design
my hackpad uses 9 switches and 4 rgb diodes and 1 rotary encoder switch
![alt text](./assets/design.png)
## Speciications
### BOM
12x Cherry MX switches
1x EC11 Rotary Encoder
4x SK6812 MINI LED
4x M3x16mm screws
1x XIAO-RP2040-DIP
1x case (2 printed parts)
1x custom pcb
12x DSA keycaps (black if possible)
12x 1N4148 diodes
Firmware
case top part
case bottom part
## Here are imagesof my pcb in KiCad
### Schematic
![alt text](./assets/schematic.png)
### Pcb
![alt text](./assets/pcb.png)
## Here are images of my case
(im sorry for having do diodes in case but my fusion skils arent that good)
![alt text](./assets/bottom.png)
![alt text](./assets/casetop.png)
![alt text](./assets/all.png)
## Firmware
by macropad is desugned for having 3 layers and with this I have 36 keybinds instead of 12. User know which layer is he on because of diodes that tell him which layer is he using
### Others
It was nicely spent time and if I would able to I would take part in that project again

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View file

@ -1,3 +1,21 @@
# hackboard, genesis
This is the repo for hackboard!
This is the repo for hackboard!
Has 2-USB A ports at the top, facing vertically.
USB A connectors:
USB
BOM:
- EC11 x1
- SL2.1A USB 2.0 HUB
- 2 vertical USB-A ports w/ LED indicators - transistors detect currenta flowing
LED filament: https://www.aliexpress.us/item/3256807786837402.html
Pogo pins for a USB device:
ESD Protection diodes on D+ and D- for pogo pins
neopixels?? idfk - might throw a couple in
OLED status indicator would be cool

Binary file not shown.

Binary file not shown.

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,68 @@
import board
import busio
import time
from kmk.kmk_keyboard import KMKKeyboard
from kmk.scanners.keypad import MatrixScanner
from kmk.keys import KC
from kmk.modules.rotary_encoder import RotaryEncoderHandler
from kmk.modules.layers import Layers
from kmk.extensions.display import Display, SSD1306, TextEntry, ImageEntry
keyboard = KMKKeyboard()
keyboard.matrix = MatrixScanner(
column_pins=[board.GP26, board.GP27, board.GP28, board.GP29], # Columns
row_pins=[board.GP2, board.GP4, board.GP3], # Rows
value_when_pressed=False,
)
# Define Keymap
keyboard.keymap = [
[
KC.ENTER, KC.NO, KC.NO, KC.PSSCREEN,
KC.F1, KC.F2, KC.F3, KC.F4,
KC.F5, KC.F6, KC.F7, KC.F8,
]
]
encoder = RotaryEncoderHandler(pin_a=board.GP0, pin_b=board.GP1)
encoder.rotation_cw = KC.VOLU # Volume Up
encoder.rotation_ccw = KC.VOLD # Volume Down
keyboard.modules.append(encoder)
# Display
layers = Layers()
keyboard.modules.append(layers)
i2c_bus = busio.I2C(board.GP6, board.GP7)
display_driver = SSD1306(
i2c=i2c_bus,
# Optional device_addres argument. Default is 0x3C.
# device_address=0x3C,
)
display = Display(
display=display_driver,
entries=[
TextEntry(text='Layer: ', x=0, y=32, y_anchor='B'),
TextEntry(text='BASE', x=40, y=32, y_anchor='B', layer=0),
TextEntry(text='NUM', x=40, y=32, y_anchor='B', layer=1),
TextEntry(text='NAV', x=40, y=32, y_anchor='B', layer=2),
TextEntry(text='0 1 2', x=0, y=4),
TextEntry(text='0', x=0, y=4, inverted=True, layer=0),
TextEntry(text='1', x=12, y=4, inverted=True, layer=1),
TextEntry(text='2', x=24, y=4, inverted=True, layer=2),
],
# Optional width argument. Default is 128.
# width=128,
height=64,
dim_time=10,
dim_target=0.2,
off_time=1200,
brightness=1,
)
keyboard.extensions.append(display)
if __name__ == '__main__':
keyboard.go()

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": "Air75.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": "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.005,
"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": "Air75.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": "Air75.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": [
[
"bce8e358-5f96-4db5-80a5-39c099add008",
"Root"
]
],
"text_variables": {}
}

File diff suppressed because it is too large Load diff

160708
hackpads/AIR75/PCB/Air75.step Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1 @@
{"EXTRA_LAYERS": "", "ALL_ACTIVE_LAYERS": false, "EXTEND_EDGE_CUT": false, "ALTERNATIVE_EDGE_CUT": false, "AUTO TRANSLATE": true, "AUTO FILL": true, "EXCLUDE DNP": false}

View file

@ -0,0 +1,15 @@
3472245298083
Audio_Module
Reverb_BTDR-1H
Digital Reverberation Unit, http://www.belton.co.kr/inc/downfile.php?seq=17&file=pdf (footprint from http://www.uk-electronic.de/PDF/BTDR-1.pdf)
audio belton reverb
0
7
7
Audio_Module
Reverb_BTDR-1V
Digital Reverberation Unit, http://www.belton.co.kr/inc/downfile.php?seq=17&file=pdf (footprint from http://www.uk-electronic.de/PDF/BTDR-1.pdf)
audio belton reverb
0
7
7

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,68 @@
import board
import busio
import time
from kmk.kmk_keyboard import KMKKeyboard
from kmk.scanners.keypad import MatrixScanner
from kmk.keys import KC
from kmk.modules.rotary_encoder import RotaryEncoderHandler
from kmk.modules.layers import Layers
from kmk.extensions.display import Display, SSD1306, TextEntry, ImageEntry
keyboard = KMKKeyboard()
keyboard.matrix = MatrixScanner(
column_pins=[board.GP26, board.GP27, board.GP28, board.GP29], # Columns
row_pins=[board.GP2, board.GP4, board.GP3], # Rows
value_when_pressed=False,
)
# Define Keymap
keyboard.keymap = [
[
KC.ENTER, KC.NO, KC.NO, KC.PSSCREEN,
KC.F1, KC.F2, KC.F3, KC.F4,
KC.F5, KC.F6, KC.F7, KC.F8,
]
]
encoder = RotaryEncoderHandler(pin_a=board.GP0, pin_b=board.GP1)
encoder.rotation_cw = KC.VOLU # Volume Up
encoder.rotation_ccw = KC.VOLD # Volume Down
keyboard.modules.append(encoder)
# Display
layers = Layers()
keyboard.modules.append(layers)
i2c_bus = busio.I2C(board.GP6, board.GP7)
display_driver = SSD1306(
i2c=i2c_bus,
# Optional device_addres argument. Default is 0x3C.
# device_address=0x3C,
)
display = Display(
display=display_driver,
entries=[
TextEntry(text='Layer: ', x=0, y=32, y_anchor='B'),
TextEntry(text='BASE', x=40, y=32, y_anchor='B', layer=0),
TextEntry(text='NUM', x=40, y=32, y_anchor='B', layer=1),
TextEntry(text='NAV', x=40, y=32, y_anchor='B', layer=2),
TextEntry(text='0 1 2', x=0, y=4),
TextEntry(text='0', x=0, y=4, inverted=True, layer=0),
TextEntry(text='1', x=12, y=4, inverted=True, layer=1),
TextEntry(text='2', x=24, y=4, inverted=True, layer=2),
],
# Optional width argument. Default is 128.
# width=128,
height=64,
dim_time=10,
dim_target=0.2,
off_time=1200,
brightness=1,
)
keyboard.extensions.append(display)
if __name__ == '__main__':
keyboard.go()

Binary file not shown.

25
hackpads/AIR75/README.md Normal file
View file

@ -0,0 +1,25 @@
# Air 75 (mini)
A Macro Pad with rotary encoders and OLED display.
## Specifications
### BOM
- 9x Cherry MX Switches
- 9x Blank DSA Keycaps (1x Red, 4x White, 4x Black)
- 1x Rotary Encoder
- 1x 128x32 OLED Display
- 10x 1N4148 Diodes
- 1x XIAO RP2040
- 4x M3x16 Bolt
### Other Resources
- [PCB](PCB)
- [Images](images)
| Schematic | PCB | Case |
| :--------------------------------: | :--------------------: | :----------------------: |
| ![schematic](images/schematics.png) | ![pcb](images/pcb.png) | ![case](images/case.png) |
## Author
- [Krish](https://github.com/ikrishagarwal)

Binary file not shown.

After

Width:  |  Height:  |  Size: 417 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

File diff suppressed because it is too large Load diff

View file

@ -46,10 +46,11 @@ The biggest challenge I faced was getting used to KiCad, as my transition from e
## BOM
- 1x XIAO RP2040 (Wihout header pins)
- 12x Generic Red Switch (With clear case)
- 12x Generic White DSA Keycaps (I won't mind HC keycaps :3)
- 12x Red Linear MX-Style Switches (The ones that allow leds to shine through)
- 12x Generic White DSA Keycaps
- 1x SSD1306 128x32 0.91" OLED
- 12x 1N4148 Diodes
- 12x SK6812 MINI-E LED
- 2x 4.7k resistor
- 4x M3x16mm SHCS Bolts
- 4x M3x5x4 Heatset inserts

View file

@ -11,8 +11,8 @@ cturing Information (PMI)---4.0---2014-10-13'),
/* implementation_level */ '2;1');
FILE_NAME(
/* name */ 'LowerCase.step',
/* time_stamp */ '2025-02-16T23:00:59+08:00',
/* name */ 'Anson''s HackPad v27.step',
/* time_stamp */ '2025-02-19T18:11:29+08:00',
/* author */ (''),
/* organization */ (''),
/* preprocessor_version */ 'ST-DEVELOPER v20',
@ -17257,16 +17257,16 @@ SOLID_ANGLE_UNIT()
#14253=PRODUCT_DEFINITION_SHAPE('',$,#14256);
#14254=SHAPE_REPRESENTATION('',(#7164),#14246);
#14255=PRODUCT_DEFINITION_CONTEXT('part definition',#14260,'design');
#14256=PRODUCT_DEFINITION('Anson''s HackPad','Anson''s HackPad v26',#14257,
#14256=PRODUCT_DEFINITION('Anson''s HackPad','Anson''s HackPad v27',#14257,
#14255);
#14257=PRODUCT_DEFINITION_FORMATION('',$,#14262);
#14258=PRODUCT_RELATED_PRODUCT_CATEGORY('Anson''s HackPad v26',
'Anson''s HackPad v26',(#14262));
#14258=PRODUCT_RELATED_PRODUCT_CATEGORY('Anson''s HackPad v27',
'Anson''s HackPad v27',(#14262));
#14259=APPLICATION_PROTOCOL_DEFINITION('international standard',
'ap242_managed_model_based_3d_engineering',2011,#14260);
#14260=APPLICATION_CONTEXT('Managed model based 3d engineering');
#14261=PRODUCT_CONTEXT('part definition',#14260,'mechanical');
#14262=PRODUCT('Anson''s HackPad','Anson''s HackPad v26',$,(#14261));
#14262=PRODUCT('Anson''s HackPad','Anson''s HackPad v27',$,(#14261));
#14263=PRESENTATION_STYLE_ASSIGNMENT((#14264));
#14264=SURFACE_STYLE_USAGE(.BOTH.,#14265);
#14265=SURFACE_SIDE_STYLE('',(#14266));

File diff suppressed because it is too large Load diff

25
hackpads/Bat-Board/BOM.md Normal file
View file

@ -0,0 +1,25 @@
## BOM
- 13x Cherry MX Switches
- 4x SK6812 MINI Leds
- 1x XIAO RP2040
- 4x Blank DSA Keycaps
- 9x M3x16 Bolt
- 9x M3 Heatset
- 1x 0.91" 128x32 OLED Display
- 13x Through-hole 1N4148 Diodes
- 1x Red Blank DSA keycaps
- 4x White Blank DSA keycaps
- 9x Black Blank DSA keycaps
- 9x M3 hex nuts
Extras:-
- Few Jump Wires
- Breadboard
- A soldering iron and its required materials
For testing before placing
- a sd card
Others:
- KMK Firmware
- Top Case.stl
- Bottom Case.stl

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

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,8 @@
#define I2C1_SDA_PIN GP6
#define I2C1_SCL_PIN GP7 // Define which pins are SDA and SCL on your microcontroller model. Remember to change GP to your pin indicator if you aren't using the RP2040
#define OLED_DRIVER_ENABLE
// You may need to add these if the OLED doesn't work at first.
#define OLED_I2C_ADDRESS 0x3C // or 0x3D, depending on your OLED
#define OLED_DISPLAY_ON 1

View file

@ -0,0 +1 @@
#define LAYOUT_ortho_5x3(k0A, k1A, k1B, k1C, k2A, k2B, k2C, k3A, k3B, k3C, k4A, k4B, k4C) { \

View file

@ -0,0 +1,11 @@
"layouts": {
"LAYOUT_ortho_5x3": {
"layout": [
{ "x":0, "y":0 }, { "x":1, "y":0 }, { "x":2, "y":0 },
{ "x":0, "y":1 }, { "x":1, "y":1 }, { "x":2, "y":1 },
{ "x":0, "y":2 }, { "x":1, "y":2 }, { "x":2, "y":2 },
{ "x":0, "y":3 }, { "x":1, "y":3 }, { "x":2, "y":3 },
{ "x":1, "y":4 }
]
}
}

View file

@ -0,0 +1,45 @@
{
"manufacturer": "Bhavya",
"keyboard_name": "Bat-Boaad",
"maintainer": "Bhavya",
"bootloader": "rp2040",
"diode_direction": "ROW2COL",
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": false,
"nkro": true
},
"matrix_pins": {
"cols": ["GP4", "GP2", "GP1"],
"rows": ["GP0", "GP29","GP27", "GP28","GP26"]
},
"processor": "RP2040",
"url": "(optional, leave blank otherwise)URL to an info page, i.e https://github.com/exampleuser/example, https://example.com.",
"usb": {
"device_version": "1.0.0",
"pid": "0x0000",
"vid": "0xFEED"
},
"layouts": {
"LAYOUT_ortho_5x3": {
"layout": [
{"matrix":[0,0],"x":0,"y":0},
{"matrix":[1,0],"x":0,"y":1},
{"matrix":[1,1],"x":1,"y":1},
{"matrix":[1,2],"x":2,"y":1},
{"matrix":[2,0],"x":0,"y":2},
{"matrix":[2,1],"x":1,"y":2},
{"matrix":[2,2],"x":2,"y":2},
{"matrix":[3,0],"x":0,"y":3},
{"matrix":[3,1],"x":1,"y":3},
{"matrix":[3,2],"x":2,"y":3},
{"matrix":[4,0],"x":0,"y":4},
{"matrix":[4,1],"x":1,"y":4},
{"matrix":[4,2],"x":2,"y":4}
]
}
}
}

View file

@ -0,0 +1,22 @@
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_ortho_5x3(
KC_LEFT_CTRL,
KC_ESCAPE, KC_LEFT_GUI, KC_BACKSPACE,
KC_TAB, KC_NUM_LOCK, KC_RIGHT_ALT,
KC_LEFT_CTRL, KC_A, KC_ENTER,
KC_B, KC_C, KC_D
)
};
#ifdef OLED_ENABLE
bool oled_task_user() {
oled_clear();
oled_write_P(PSTR("Testing OLED!"), false); // Replace THIS line with whatever you'd like the OLED to display.
// There are more details in the OLED page!
return false;
}
#endif

View file

@ -0,0 +1,2 @@
# VIA Support
Not complete.

View file

@ -0,0 +1,56 @@
// Copyright 2023 QMK
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
enum layer_names {
_BASE,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
*
* 2
*
* 3 5 6
*
*/
/*
The wiring is a little convoluted - refer to the diagram below:
*/
[_BASE] = LAYOUT(
KC_P7, KC_P8, KC_P4,
KC_P5, KC_P6
)
};
const uint16_t PROGMEM encoder_map[][1][2] = {
[0] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD) },
};
#ifdef OLED_ENABLE
bool oled_task_user(void) {
// Host Keyboard Layer Status
oled_write_P(PSTR("Layer: "), false);
switch (get_highest_layer(layer_state)) {
case _BASE:
oled_write_P(PSTR("Default\n"), false);
break;
default:
// Or use the write_ln shortcut over adding '\n' to the end of your string
oled_write_ln_P(PSTR("Undefined"), false);
}
// Host Keyboard LED Status
led_t led_state = host_keyboard_led_state();
oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false);
oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false);
oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false);
return false;
}
#endif

View file

@ -0,0 +1 @@
VIA_ENABLE = yes

View file

@ -0,0 +1,4 @@
OLED_ENABLE = yes
LTO_ENABLE = yes
CONSOLE_ENABLE = yes
DEBUG_MATRIX_SCAN_RATE = yes

View file

@ -0,0 +1,6 @@
# Firmware
**QMK:** This is a port of Bat-Board to QMK firmware. Very primitive setup currently, but it works!

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,83 @@
{
"board": {
"active_layer": 31,
"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": "Macropad 2.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": "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": "Macropad 2.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": "../../../Kicad/",
"plot": "D:/Macropad/",
"pos_files": "",
"specctra_dsn": "",
"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": [
[
"78f51236-0545-46dd-bba1-14a80158c8bf",
"Root"
]
],
"text_variables": {}
}

File diff suppressed because it is too large Load diff

Binary file not shown.

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

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -0,0 +1,72 @@
# Bat-Board
Bat-Board is a 12 key macropad with an OLED Display. It uses QMK firmware, easy to use and customize macro
I tried to make a multipupose and multi layer macropad. 1 layer for 1 purpose. I tried to make somthing like adafruit or protodesigns macropad. It will work like them but need a better case more like acrylic. I have used all of this first time. It was fun somtimes and sometimes frustrating. If think i need to add a stand like system in the case but building it is a liitle hard for me.
## Features:
- Multilayer Functionality.
- 128x32 OLED Display
- First key for main controller or for whatever you want
- 12 Keys
## PCB
Here's my PCB! It was made in KiCad. I was thing of using a silkscreen but didn't like anything .
<img src=Images/pcb_f.png alt="Pcb" width="300"/>
<img src=Images/pcb_b.png alt="Pcb" width="300"/>
<img src=Images/pcb_3d_f.png alt="Pcb" width="300"/>
<img src=Images/pcb_3d_b.png alt="Pcb" width="300"/>
Schematic
- [Schematics](/PCB/Macropad_Schematics.pdf)
<img src=Images/schematics.png alt="schematics" width="300"/>
## Firmware Overview
This hackpad uses [QMK](https://qmk.fm/) firmware for everything.
- The main left button is for contol purpose works as togle and to switch between layers and more. More like ctrl button of keyboard
- Last 4 white keys will be the arrow keys of keyboard. Other keys are custom set macros and links.
- The OLED is Not decided yet but i am thing of something from naruto or demon slayer
I might add more in the future! That's it for now
## CAD:
<img src=Images/cad_3d.png alt="Cad" width="300"/>
<img src=Images/cad_3d_2.png alt="Cad" width="300"/>
<img src=Images/cad_3d_3.png alt="Cad" width="300"/>
## BOM:
Here should be everything you need to make this hackpad
- 13x Cherry MX Switches
- 4x SK6812 MINI Leds
- 1x XIAO RP2040
- 4x Blank DSA Keycaps
- 9x M3x16 Bolt
- 9x M3 Heatset
- 1x 0.91" 128x32 OLED Display
- 13x Through-hole 1N4148 Diodes
- 1x Red Blank DSA keycaps
- 4x White Blank DSA keycaps
- 9x Black Blank DSA keycaps
- 9x M3 hex nuts
Extras:-
- Few Jump Wires
- Breadboard
- A soldering iron and its required materials
For testing before placing
- a sd card
Others:
- KMK Firmware
- Top Case.stl
- Bottom Case.stl

View file

@ -0,0 +1,19 @@
{
"version": 1,
"notes": "",
"documentation": "This file is a QMK Configurator export. You can import this at <https://config.qmk.fm>. It can also be used directly with QMK's source code.\n\nTo setup your QMK environment check out the tutorial: <https://docs.qmk.fm/#/newbs>\n\nYou can convert this file to a keymap.c using this command: `qmk json2c {keymap}`\n\nYou can compile this keymap using this command: `qmk compile {keymap}`",
"keyboard": "my_custom_keyboard",
"keymap": "default",
"layout": "LAYOUT_custom",
"layers": [
[
"KC_ESC", // k0: Isolated key
"KC_Q", "KC_W", "KC_E", // Row 1
"KC_A", "KC_S", "KC_D", // Row 2
"KC_Z", "KC_X", "KC_C", // Row 3
"KC_1", "KC_2", "KC_3" // Row 4
],
],
"author": ""
}

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,608 @@
{
"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": "projekt.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": "../pcb gerbers/",
"pos_files": "",
"specctra_dsn": "",
"step": "projekt.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
},
{
"group_by": false,
"label": "#",
"name": "${ITEM_NUMBER}",
"show": false
},
{
"group_by": false,
"label": "Sim.Device",
"name": "Sim.Device",
"show": false
},
{
"group_by": false,
"label": "Sim.Pins",
"name": "Sim.Pins",
"show": false
},
{
"group_by": false,
"label": "Description",
"name": "Description",
"show": false
}
],
"filter_string": "",
"group_symbols": true,
"name": "",
"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": [
[
"75fff938-4637-4fc9-9588-e755eafbab70",
"Root"
]
],
"text_variables": {}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,49 @@
# BluePunia's hackpad
## INSPIRATION
I wanted to create something PCB-related for the first time in my life - wanted to learn something new.
I created a rather simple design, yet it was challenging for me cause I've never used KiCad or Fusion 360 before.
## Design:
My hackpad uses 9 switches and 3 RGB diodes, it's simple but also very useful for programmers or streamers.
![alt text](./assets/image.png)
## Schematic:
![alt text](./assets/image-1.png)
## PCB:
![alt text](./assets/image-2.png)
## Case:
![alt text](./assets/image-3.png)
![alt text](./assets/image-4.png)
(It's branded on the very bottom)
## BOM:
9x Cherry MX Switches
9x DSA keycaps (white if possible)
4x M3x16mm bolts
3x 1N4148 diodes
1x XIAO RP2040
1x case (2 printed parts)
1x custom PCB
## Firmware
The macropad is designed to have 3 layers, so basically instead of 9 binds I have 27. The user knows on which layer he is by looking at the RGB diodes, each one of them turned on tells the user on which layer he's on.
## Others:
It was an amazing journey making this hackpad, fortunately my friends helped me a bit.
(I couldn't import the 3d model of the 1N4148 diode into the 3D view of the entire hackpad, Sorry :33)

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

View file

@ -0,0 +1,71 @@
import board
import time
from kmk.kmk_keyboard import KMKKeyboard
from kmk.kmk.scanners.keypad import MatrixScanner
from kmk.keys import KC
from kmk.extensions.peg_rgb_matrix import Rgb_matrix
keyboard = KMKKeyboard()
# Initialize the RGB matrix
rgb = Rgb_matrix()
keyboard.extensions.append(rgb)
keyboard.matrix = MatrixScanner(
column_pins=[board.GP4, board.GP2, board.GP1],
row_pins=[board.GP6, board.GP7, board.GP0],
value_when_pressed=False,
)
keyboard.keymap = [
# Layer 0
[
[KC.F13, KC.F14, KC.F15],
[KC.F16, KC.F17, KC.F18],
[KC.F19, KC.F20, KC.F21],
],
# Layer 1
[
[KC.F13, KC.F23, KC.F24],
[KC.F25, KC.F26, KC.F27],
[KC.F28, KC.F29, KC.F30],
],
# Layer 2
[
[KC.F13, KC.F32, KC.F33],
[KC.F34, KC.F35, KC.F36],
[KC.F37, KC.F38, KC.F39],
],
]
# Function to switch layers and control LEDs
def switch_layer(layer):
keyboard.active_layers = [layer]
if layer == 0:
rgb.set_pixel(0, 255, 0, 0) # Red for layer 0
rgb.set_pixel(1, 0, 0, 0) # Off for other LEDs
rgb.set_pixel(2, 0, 0, 0)
elif layer == 1:
rgb.set_pixel(0, 0, 0, 0) # Off for other LEDs
rgb.set_pixel(1, 0, 255, 0) # Green for layer 1
rgb.set_pixel(2, 0, 0, 0)
elif layer == 2:
rgb.set_pixel(0, 0, 0, 0) # Off for other LEDs
rgb.set_pixel(1, 0, 0, 0)
rgb.set_pixel(2, 0, 0, 255) # Blue for layer 2
rgb.write()
# Set initial layer and LED state
current_layer = 0
switch_layer(current_layer)
# Main loop to handle key events
while True:
keyboard.update()
if keyboard.matrix.is_pressed(0, 0): # Check if the first key is pressed
current_layer = (current_layer + 1) % 3 # Cycle through layers 0, 1, 2
switch_layer(current_layer)
time.sleep(0.3) # Debounce delay
if __name__ == '__main__':
keyboard.go()

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,71 @@
import board
import time
from kmk.kmk_keyboard import KMKKeyboard
from kmk.kmk.scanners.keypad import MatrixScanner
from kmk.keys import KC
from kmk.extensions.peg_rgb_matrix import Rgb_matrix
keyboard = KMKKeyboard()
# Initialize the RGB matrix
rgb = Rgb_matrix()
keyboard.extensions.append(rgb)
keyboard.matrix = MatrixScanner(
column_pins=[board.GP4, board.GP2, board.GP1],
row_pins=[board.GP6, board.GP7, board.GP0],
value_when_pressed=False,
)
keyboard.keymap = [
# Layer 0
[
[KC.F13, KC.F14, KC.F15],
[KC.F16, KC.F17, KC.F18],
[KC.F19, KC.F20, KC.F21],
],
# Layer 1
[
[KC.F13, KC.F23, KC.F24],
[KC.F25, KC.F26, KC.F27],
[KC.F28, KC.F29, KC.F30],
],
# Layer 2
[
[KC.F13, KC.F32, KC.F33],
[KC.F34, KC.F35, KC.F36],
[KC.F37, KC.F38, KC.F39],
],
]
# Function to switch layers and control LEDs
def switch_layer(layer):
keyboard.active_layers = [layer]
if layer == 0:
rgb.set_pixel(0, 255, 0, 0) # Red for layer 0
rgb.set_pixel(1, 0, 0, 0) # Off for other LEDs
rgb.set_pixel(2, 0, 0, 0)
elif layer == 1:
rgb.set_pixel(0, 0, 0, 0) # Off for other LEDs
rgb.set_pixel(1, 0, 255, 0) # Green for layer 1
rgb.set_pixel(2, 0, 0, 0)
elif layer == 2:
rgb.set_pixel(0, 0, 0, 0) # Off for other LEDs
rgb.set_pixel(1, 0, 0, 0)
rgb.set_pixel(2, 0, 0, 255) # Blue for layer 2
rgb.write()
# Set initial layer and LED state
current_layer = 0
switch_layer(current_layer)
# Main loop to handle key events
while True:
keyboard.update()
if keyboard.matrix.is_pressed(0, 0): # Check if the first key is pressed
current_layer = (current_layer + 1) % 3 # Cycle through layers 0, 1, 2
switch_layer(current_layer)
time.sleep(0.3) # Debounce delay
if __name__ == '__main__':
keyboard.go()

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Some files were not shown because too many files have changed in this diff Show more