This commit is contained in:
dari-studios 2025-02-06 00:38:34 -05:00
commit 28c2fa3a69
67 changed files with 351180 additions and 121 deletions

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,11 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
keyboard.col_pins = (board.GP5, board.GP6)
keyboard.row_pins = (board.GP7, board.GP8)
keyboard.diode_orientation = DiodeOrientation.COL2ROW

View file

@ -0,0 +1,40 @@
import board
import digitalio
from kmk import KMKKeyboard
from kmk.keys import KC
from kmk.modules import Layer
keyboard = KMKKeyboard()
switch1 = digitalio.DigitalInOut(board.D5)
switch1.switch_to_input(pull=digitalio.Pull.UP)
switch2 = digitalio.DigitalInOut(board.D6)
switch2.switch_to_input(pull=digitalio.Pull.UP)
switch3 = digitalio.DigitalInOut(board.D7)
switch3.switch_to_input(pull=digitalio.Pull.UP)
switch4 = digitalio.DigitalInOut(board.D8)
switch4.switch_to_input(pull=digitalio.Pull.UP)
keyboard.pins = {
board.D5: KC.A, # Switch 1 mapped to KC.A
board.D6: KC.B, # Switch 2 mapped to KC.B
board.D7: KC.C, # Switch 3 mapped to KC.C
board.D8: KC.D, # Switch 4 mapped to KC.D
}
layer1 = Layer([KC.LSFT, KC.LCTL, KC.LALT])
keyboard.modules.append(layer1)
if __name__ == "__main__":
while True:
keyboard.poll()

View file

@ -0,0 +1 @@
Firmware runs on KMK!

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -0,0 +1,11 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
keyboard.col_pins = (board.GP5, board.GP6)
keyboard.row_pins = (board.GP7, board.GP8)
keyboard.diode_orientation = DiodeOrientation.COL2ROW

View file

@ -0,0 +1,40 @@
import board
import digitalio
from kmk import KMKKeyboard
from kmk.keys import KC
from kmk.modules import Layer
keyboard = KMKKeyboard()
switch1 = digitalio.DigitalInOut(board.D5)
switch1.switch_to_input(pull=digitalio.Pull.UP)
switch2 = digitalio.DigitalInOut(board.D6)
switch2.switch_to_input(pull=digitalio.Pull.UP)
switch3 = digitalio.DigitalInOut(board.D7)
switch3.switch_to_input(pull=digitalio.Pull.UP)
switch4 = digitalio.DigitalInOut(board.D8)
switch4.switch_to_input(pull=digitalio.Pull.UP)
keyboard.pins = {
board.D5: KC.A, # Switch 1 mapped to KC.A
board.D6: KC.B, # Switch 2 mapped to KC.B
board.D7: KC.C, # Switch 3 mapped to KC.C
board.D8: KC.D, # Switch 4 mapped to KC.D
}
layer1 = Layer([KC.LSFT, KC.LCTL, KC.LALT])
keyboard.modules.append(layer1)
if __name__ == "__main__":
while True:
keyboard.poll()

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,35 @@
# Ducc's Fidget Toy
Done your hackpad? Congrats! This is an example submission for a hackpad.
![Duccpad_2025-Jan-29_11-21-00PM-000_CustomizedView41037845089](https://github.com/user-attachments/assets/21300858-fc34-466f-8b79-2abc2fd9e564)
### Inspiration
I wanted to create a macropad that allowed me to fidget. I created a macropad using 4 switches, 1 rp2040, and 2 leds.
### Challenges
Believe it or not, this was my first time using Fusion 360! I watched numerous tutorials and guides and did a TON of googling, but in the end, I'm pretty proud of the final product. I had the most struggle figuring out how to make sketches, and with the new mouse controls, it definitely took me a while to get the hang of it.
### Specifications
BOM:
- 4x Cherry MX Switches
- 2x SK6812 MINI Leds
- 1x XIAO RP2040
- 4x Blank DSA Keycaps
- 4x M3x16 Bolt
- 4x M3 Heatset
Others:
- KMK Firmware
- Top Case.stl
- Bottom Case.stl
Schematic | PCB | Case
:-------------------------:|:-------------------------:|:-------------------------:|
![image](https://github.com/user-attachments/assets/8ce0ab16-e0b0-42d0-b748-d4ee08ce5972) | ![image](https://github.com/user-attachments/assets/556275d9-b148-4d51-b6e8-0c6bf95b5a16) | ![image](https://github.com/user-attachments/assets/bcfd98e1-e562-48c3-b617-4d55031ebec4)

View file

@ -0,0 +1,12 @@
### BOM for SebDaBaBoPad
PCBs
3-part case
20 Gateron Jupiter Banana Switches
Mill-Max 0305s for switches
Set of DSA keycaps
23 1N4148 Diodes (through hole)
2 WS2812B
Screws & heatsets for 2.9mm hole
ESP8266 module for WiFi
IO/Port expander

Binary file not shown.

After

Width:  |  Height:  |  Size: 920 KiB

Binary file not shown.

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": "SebDaBaBo_Hackpad.kicad_prl",
"version": 3
},
"project": {
"files": []
}
}

View file

@ -0,0 +1,597 @@
{
"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": [
{
"gap": 0.0,
"via_gap": 0.0,
"width": 0.0
}
],
"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": [
0.0
],
"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": [
{
"diameter": 0.0,
"drill": 0.0
}
],
"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": "SebDaBaBo_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": "pcb/",
"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": [
[
"d6632e90-0565-4975-94f3-c5b32f739812",
"Root"
]
],
"text_variables": {}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,4 @@
(sym_lib_table
(version 7)
(lib (name "Seeed_Studio_XIAO_Series")(type "KiCad")(uri "/Users/seb.a.rein/Documents/OPL_Kicad_Library/Seeed Studio XIAO Series Library/Seeed_Studio_XIAO_Series.kicad_sym")(options "")(descr ""))
)

File diff suppressed because it is too large Load diff

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,11 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
keyboard.col_pins = (board.GP5, board.GP6)
keyboard.row_pins = (board.GP7, board.GP8)
keyboard.diode_orientation = DiodeOrientation.COL2ROW

View file

@ -0,0 +1,40 @@
import board
import digitalio
from kmk import KMKKeyboard
from kmk.keys import KC
from kmk.modules import Layer
keyboard = KMKKeyboard()
switch1 = digitalio.DigitalInOut(board.D5)
switch1.switch_to_input(pull=digitalio.Pull.UP)
switch2 = digitalio.DigitalInOut(board.D6)
switch2.switch_to_input(pull=digitalio.Pull.UP)
switch3 = digitalio.DigitalInOut(board.D7)
switch3.switch_to_input(pull=digitalio.Pull.UP)
switch4 = digitalio.DigitalInOut(board.D8)
switch4.switch_to_input(pull=digitalio.Pull.UP)
keyboard.pins = {
board.D5: KC.A, # Switch 1 mapped to KC.A
board.D6: KC.B, # Switch 2 mapped to KC.B
board.D7: KC.C, # Switch 3 mapped to KC.C
board.D8: KC.D, # Switch 4 mapped to KC.D
}
layer1 = Layer([KC.LSFT, KC.LCTL, KC.LALT])
keyboard.modules.append(layer1)
if __name__ == "__main__":
while True:
keyboard.poll()

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,11 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.scanners import DiodeOrientation
class KMKKeyboard(_KMKKeyboard):
keyboard.col_pins = (board.GP5, board.GP6)
keyboard.row_pins = (board.GP7, board.GP8)
keyboard.diode_orientation = DiodeOrientation.COL2ROW

View file

@ -0,0 +1,40 @@
import board
import digitalio
from kmk import KMKKeyboard
from kmk.keys import KC
from kmk.modules import Layer
keyboard = KMKKeyboard()
switch1 = digitalio.DigitalInOut(board.D5)
switch1.switch_to_input(pull=digitalio.Pull.UP)
switch2 = digitalio.DigitalInOut(board.D6)
switch2.switch_to_input(pull=digitalio.Pull.UP)
switch3 = digitalio.DigitalInOut(board.D7)
switch3.switch_to_input(pull=digitalio.Pull.UP)
switch4 = digitalio.DigitalInOut(board.D8)
switch4.switch_to_input(pull=digitalio.Pull.UP)
keyboard.pins = {
board.D5: KC.A, # Switch 1 mapped to KC.A
board.D6: KC.B, # Switch 2 mapped to KC.B
board.D7: KC.C, # Switch 3 mapped to KC.C
board.D8: KC.D, # Switch 4 mapped to KC.D
}
layer1 = Layer([KC.LSFT, KC.LCTL, KC.LALT])
keyboard.modules.append(layer1)
if __name__ == "__main__":
while True:
keyboard.poll()

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 436 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

View file

@ -15,7 +15,7 @@ const SideBar = () => {
</li>
<li>
<a href="/resources" className="block py-2 px-4 rounded hover:bg-slate-200 transition-all text-slate-900 hover:text-cyan-800">
Resources
Resources & Tips
</a>
</li>
<li>

View file

@ -1,3 +1,12 @@
# Frequently asked questions, keyboard edition
Welcome to the FAQ of the keyboard section! This part is pretty emtpy for now - drop your questions in the slack and I'll answer them here
Welcome to the FAQ of the keyboard section! This part is pretty emtpy for now - drop your questions in the slack and I'll answer them here
**Can I use metal for my case?** \
NO!!!
**Can I use a generator like Ergogen?** \
You're free to use it to experiment with layouts and make design decisions, but the actual placement of the footprints and schematic has to be done manually by you.
**Can I get PCBA?** \
NO!!!!

View file

@ -2,16 +2,20 @@
Here is the list of approved parts! If there's anything you think should be here, please send it in #hackpad and let me know!
## The list:
- Seeed XIAO RP2040 - make sure you're designing with a through-hole footprint.
- Seeed XIAO RP2040 - since you're soldering, you can mount it SMD style! Please note it is significantly harder than doing it through-hole, so if it's your first time soldering I would avoid it.
- Through-hole 1N4148 Diodes
- MX-Style switches (Max 16x)
- Choc V2 switches (Max 16x)
- EC11 Rotary encoders (Max 2x)
- 0.91 inch or 0.96 inch OLED displays (Max 1x)
- Blank DSA keycaps (Red, Black, White)
- SK6812 MINI-E LEDs (Max 16x)
- M3x16mm screws
- M3 hex nuts
- M3x5mx4mm heatsets
- [M3x5mx4mm heatset inserts](https://www.aliexpress.us/item/2255800046543591.html)
- 3D PRINTED CASE ONLY. NO ACRYLIC.
## Custom parts
Put this in your $20 grant!

View file

@ -1,8 +1,25 @@
# Frequently Asked Questions
**What gets shipped to me?**
- a soldering iron!
- a 3D printed case
- An unsoldered Seeed XIAO RP2040 with headers
- Any of the components requested from the [approved parts list](/parts)
- a $20 HCB grant. This will be used to cover **both** your **PCB** as well as any additional parts you may want! I/O expanders, random sensors, etc. It MUST be used for your hackpad. You will need to upload receipts
**When is the deadline?** \
February 16th, 2025. This is the deadline for the macropad. The deadline for the keyboard is March 16th, 2025.
**Where can I find KiCAD footprints / what's the measurement for this thing / etc** \
A lot of these questions can be answered by checking out the [resources and tips section](/resources)! You can find **KiCAD footprints**, 3D models, etc
**Can I use a microcontroller other than the XIAO RP2040?** \
You can, however the following conditions apply:
- You need to fit all the parts for the MCU of choice + PCB in your $20 grant
- Your schematic + PCB is not going to be checked over - design at your own risk
The XIAO is a great primer and I recommend using it, but it's totally understandable if you want to do something more advanced! We won't stop you :)
**What's new with v2?** \
Lots of stuff! Updated list of requirements, more content, and other goodies - the big thing is that after making a macropad, you can design and submit an entire ***keyboard*** to be made!
@ -13,19 +30,22 @@ Absolutely! A keyboard is *significantly* harder to design, and so its a prerequ
Unfortunately not! Not to fear though - we'll send you a soldering iron, straight from HQ if you don't have one already.
**Can I use acrylic/cnc metal/etc for the case/plate?** \
NO!!! Only 3D prints are supported for the macropad. Keyboards don't have this limit though!
NO!!! Only 3D prints are supported for the macropad. Keyboards are allowed to use acrylic, but CNC metal is still banned.
**Where are the parts shipped from?** \
Vermont, USA!
**Can I use parts outside of the approved list?** \
You can, but you'll most likely have to source it yourself. You may request a grant from HQ to get them, and we'll approve it on a case-by-case basis. Not guaranteed.
Yup! Put it in your $20 grant
**What colours are the keycaps?** \
We have red, black, and white keycaps at HQ. You can request what color specifically, but it's not guaranteed it'll be fulfilled. Sorry!
**Can I use Choc switches?** \
You can! We'll have V2's at HQ. note: please use 19.05x19.05mm spacing, or else the keycaps won't fit
**I have more questions!!!** \
Join the #hackpad channel in the Hack Club slack!
Join the #hackpad channel in the Hack Club slack!

View file

@ -1,11 +1,17 @@
# Resources
# Resources & Tips
Here lies a collection of resources & tips I've amassed over the years; use them well.
With that in mind, there are *thousands* of other resources on the internet that I can't cover here. Use youtube, reddit, discord, whatever works for you!
If a guide doesn't seem to work, try it again. If it *really* doesn't work, try another guide! The magic of it is to keep at it, because if so many other teens can do it, you absolutely can too.
## KiCad Libraries
- [Keyswitch footprints](https://github.com/ai03-2725/MX_V2)
- [XIAO Footprints](https://github.com/Seeed-Studio/OPL_Kicad_Library)
- [Rotary Encoder footprint](https://kicad.github.io/footprints/Rotary_Encoder)
- [0.91" OLED Display](https://github.com/gorbachev/KiCad-SSD1306-0.91-OLED-4pin-128x32.pretty/blob/master/SSD1306-0.91-OLED-4pin-128x32.kicad_mod)
- You can almost always find the footprint/symbol you're looking for if you use [SnapEDA](https://www.snapeda.com/) or similar sites. Google is your best friend.
## Top Tier
- [The Keyboard Atelier Discord](https://kbatelier.org/) \<- THE community for keyboard design! PLEASE do not spam the discord though, your best shot is to lurk.
- [The Keyboard Designer Wiki](https://wiki.ai03.com/books) \<- this is insanely useful
@ -24,14 +30,13 @@ It has an OLED, a rotary encoder, 4 switches in a matrix, 2 addressable LEDs, an
- [Anatomy of a keyboard](https://matt3o.com/anatomy-of-a-keyboard/)
- [Keyboard Mounting Styles](https://www.keyboard.university/200-courses/keyboard-mounting-styles-4lpp7)
## KiCad Libraries
- [Keyswitch footprints](https://github.com/ai03-2725/MX_V2)
- [XIAO Footprints](https://github.com/Seeed-Studio/OPL_Kicad_Library)
- [Rotary Encoder footprint](https://kicad.github.io/footprints/Rotary_Encoder)
- [0.91" OLED Display](https://github.com/gorbachev/KiCad-SSD1306-0.91-OLED-4pin-128x32.pretty/blob/master/SSD1306-0.91-OLED-4pin-128x32.kicad_mod)
- You can almost always find the footprint/symbol you're looking for if you use [SnapEDA](https://www.snapeda.com/) or similar sites. Google is your best friend.
## Useful measurements
- Making holes for your PCB:
- KiCAD has specific footprints for mounting holes, don't use Edge.Cuts - use the M3 mounting holes
- Making holes for your case:
- if you're using [heatset inserts](https://www.aliexpress.us/item/2255800046543591.html), make a 4.7mm diameter hole, 4mm deep
- if you're screwing directly into the plastic, use a 2.9mm diameter hole
- if you just want the screw to pass through without threading, use a 3.4mm diameter hole.
- Use a 0.2mm gap between 3D printed parts
- There's 19.05mm gap between the center of each switch
- This image shows general height measurements

View file

@ -83,9 +83,9 @@ Once everything is organized, you can make a PR to the repository [here](https:/
## After submitting
If everything went correctly, your PR will be reviewed (and hopefully approved!) by @alexren. If it's approved, then you'll get:
- All your electronic components
- A set of DSA keycaps
- 3 blank PCBs
- Your 3D printed/laser cut case
- All of your parts from the approved list
- A soldering iron
- A $20 grant for your PCB + custom components
- Your 3D printed case
For many of you, the firmware may not work the first try. That's okay! Keep working at it until it's fixed; if you send a video in #hackpad showing it working, I'll ship you a free custom hack-club keycap and sticker!

View file

@ -1,135 +1,175 @@
# Make your own macropad!
# Make your own Hackpad!
Hey! Want to make your own macropad but have absolutely no clue where to start? You found the right place! In this tutorial,
we're going to make a 3-key macropad as an example. For a full submission, you will have to edit it to be your own (add an extra key?? a knob?? new case? up to you!)
Hey! Want to make your own macropad but have absolutely no clue where to start? You found the right place! In this tutorial, we're going to make a 4-key macropad as an example. For a full submission, you will have to edit it to be your own (add an extra key?? a knob?? new case? up to you!)
**Read over the [FAQ](/faq) first so that you have an idea of what you're working with!**
This process is going to be broken into 3 parts, each with its own sub-parts:
1. PCB Design
1. Drawing the schematic
2. Routing the PCB
3. Defining the edges
2. Case Design
1. Creating the bottom
2. Creating the plate
3. Adding mounting holes
3. Firmware
1. code.
- PCB Design
- Drawing the schematic
- Routing the PCB
- Defining the edges
- Case Design
- Creating the bottom
- Creating the top
- Finishing touches
- Firmware
- Code!
If anything is unclear, 9 times out of 10 you can usually google it; that being said, PLEASE send what you're stuck on in #hackpad! Ping me @alexren
If you're unsure about anything, send a message in #hackpad! We have so many eager people to help.
There's also [this](/resources) giant wall of resources to reference!
**I also go through all these steps in [this YouTube video](https://youtu.be/IsD3lDX75ZI), so you can follow along if you're stuck!**
First, we're going to start with...
Lets start with:
## Designing your PCB
For this guide we're going to be using [KiCad](https://www.kicad.org/), which is an open source PCB designer tool.
To start, we're going to have to import the necessary footprints. For this guide, I made a special care package
- [XIAO RP2040 footprint](https://github.com/Seeed-Studio/OPL_Kicad_Library) (use the SAMD21 footprint for now, it's identical in pinout)
Once you have the footprints, you can google to figure out how to install them!
For this guide we're going to be using [KiCad](https://www.kicad.org/), which is an open source PCB designer tool.
To start, we're going to have to import the necessary footprints. For this guide, download this footprint:
- [XIAO RP2040 footprint](https://wiki.seeedstudio.com/XIAO-RP2040/)
### Drawing the schematic
There are many tutorials on how to install footprints! Google is your best friend here :)
The schematic of a PCB is what defines all the different connections of your PCB, so we're going to start with that!
First, open KiCad up KiCad and create a new project, then click on the "Schematic Editor" button:
![Screenshot of button](docs/schematicbutton.png)
This should open up the schematic editor. Once you're in, press the A key on your keyboard. This should open up a menu where you can add add components. Search for the following and add them:
- Seeed XIAO SAMD21 (Seeed does not have an official RP2040 footprint, so we're using the SAMD21 footprint as a placeholder instead)
- SW_Push (this will be our switch! copy this 3 times)
After, your schematic should look something like this:
<img src="docs/schematiclayoutnowire.png" className="max-w-96 justify-center" />
Next, press the W key on your keyboard. This should make a green wire start to appear. Connect your components like so:
<img src="/docs/routedschematic.png" className="max-w-96" />
(to get the GND symbol, press P and search for it!)
Once all the components are connected, we can start assigning *footprints* to the symbols we have here. Footprints are what gets physically drawn on the PCB. To do this, click the "run footprint assignment tool"
in the top right.
<img src="docs/footprintassign.png" style={{ maxWidth: '200px' }} />
This should open up a window where you can assign different footprints to your components! Assign them based on the image below:
<img src="docs/assignedfootprints.png" />
Once you're done, you can hit apply & save schematic. We're now officially done with the schematic! Onto making the pcb itself:
### Route the PCB
Go back to KiCad project page, and hit the "PCB editor" button. Once the PCB editor is open, hit the "Update PCB from schematic" button in the top right:
<img src="docs/updatepcb.png" />
Ignore any errors with the XIAO footprint, it's kind of bugged atm.
It should have dumped all the components on the page. Right click the XIAO, and click "flip side". This should flip the footprint to the other side.
After that, arrange all the components like so:
<img src="docs/pcblayout.png" style={{ maxHeight: '400px'}}/>
Now it's time to route the PCB! Hit X on your keyboard and hit any golden pad with a blue line. It should dim the entire screen and show you where to go. Route the PCB like so:
<img src="docs/routedpcb.png" style={{ maxHeight: '400px'}}/>
(to get the blue lines, change the layer on the right from F.cu to B.cu)
Our PCB is almost done, but we need one final step; we need to actually define the size of the board! Head on over to Edge.cuts, and draw a rectangle outline our board:
<img src="docs/edgecuts.png" style={{ maxHeight: '400px'}} />
(PS: You can hit the 3D viewer button in the top right for a cool view of your pcb!)
If everything was done correctly, you are now officially done the PCB! Onto case design:
@Cyao in the slack did make an awesome tutorial though! Here it is:
<video width="100%" controls>
<source src="https://cloud-547suu6q6-hack-club-bot.vercel.app/0r.mp4" type="video/mp4" />
Your browser does not support the video tag.
</video>
## Create your case
### Drawing the Schematic
Start by opening up KiCad, a window will pop up, create a new project then click on the "Schematic Editor" button:
<img src="/docs/v2/schematicbutton.png" className="max-w-96" />
This should open up a new window with your schematic editor! Once you're in, press the A key on your keyboard. This should open up a menu where you can add components. Search for the following to add them:
- Seeed XIAO RP2040
- SW_Push (This will be our keyboard switch! Copy and paste this 4 times)
- SK6812 MINI LED (I will be using 2 of these!)
Start by placing these components down, they don't have to be in any order, but placing them close to eachother allows for more tidyness.
<img src="/docs/v2/placedcomponents.png" className="max-w-96" />
Now, press the W key to start wiring! Again, this is just a guide and you should do this to add your own pizzazz in it! After wiring, I'm left with something like this:
<img src="/docs/v2/wiredcomponents.png" className="max-w-96" />
Next, lets assign footprints. Press this button in the top naviagation bar to assign footprints to your components.
<img src="/docs/v2/assignfootprints.png" className="max-w-96" />
Assign them based on the image below:
<img src="/docs/v2/assignedfootprints.png" className="max-w-200" />
Thats all for the schematic! Once you're done, hit save.
### Routing the PCB
Great job on finishing the schematic! Hit this button to open the PCB editor:
<img src="/docs/v2/switchtopcb.png" className="max-w-96" />
This will open a new window, once here, press this button to bring over your schematic:
<img src="/docs/v2/updatefromschematic.png" className="max-w-96" />
Click anywhere on your screen to place your components down, it should look something like this:
<img src="/docs/v2/pcbstart.png" className="max-w-96" />
Lay out the components as you wish, and go over the the edge.cuts layer and create a rectangle. This will be your board size!
<img src="/docs/v2/edgecuts.png" className="max-w-96" />
Also, it is **VERY IMPORTANT** that you brand your hackpad! Put the name of your hackpad on any silkscreen of your PCB. Do this by using the text tool. Also, write "XIAO HERE" on the side you would like your XIAO to be placed on.
Good stuff! You're almost done the PCB. Let's run the DRC to make sure the PCB works. The silkscreen warnings you see are okay, make sure there are no more errors!
<img src="/docs/v2/drcbutton.png" className="max-w-96" />
Thats all for your PCB! Great job.
## Creating your case
This guide uses [Fusion360](https://www.autodesk.com/products/fusion-360/personal) for designing the case. You can use other software, but it may be harder to follow along!
Before we start designing, it's useful to familiarize yourself with the different types of [keyboard mounts](https://www.keyboard.university/200-courses/keyboard-mounting-styles-4lpp7).
For this guide, we'll be using a sandwich-mount style.
### Creating the bottom
Start by creating a new project, and a new component, this is better for organization.
To start, make a new sketch. Draw a rectangle with the same dimensions as our PCB from earlier:
<img src="docs/sketch1.png" className="max-w-96" />
<img src="/docs/v2/newcomponent.png" className="max-w-96" />
Next, draw a larger rectangle with a 10mm margin:
<img src="docs/sketchmarg.png" className="max-w-96" />
Next, create a sketch by by pressing the green + button. Create a rectangle that is 0.5mm bigger than your hackpad's PCB. For example, my PCB is 42mm x 61.5mm, I added 0.5mm to each on the sketch.
Next, we're going to draw the accomodating holes for it:
<img src="docs/sketchhole.png" className="max-w-96" />
<img src="/docs/v2/1sketch1.png" className="max-w-96" />
<img src="/docs/v2/1sketch2.png" className="max-w-96" />
Extrude the base of the case by 3mm:
<img src="docs/extrudebase.png" className="max-w-96" />
Create another rectangle with 10mm extra on each dimension! (5mm bigger on each side) Center this rectangle by pressing the dimension button and setting the values to 5mm.
Extrude the sides by 10mm (it should be 13mm tall in total!):
<img src="docs/extrudewall.png" className="max-w-96" />
<img src="/docs/v2/sketchdimension.png" className="max-w-96" />
<img src="/docs/v2/properdimension.png" className="max-w-96" />
That's the bottom half of the plate done. Next, we're going to make the plate. Head on over to [ai03's plate generator](https://kbplate.ai03.com/)
and paste in the following data:
It should look something like this when you're completed!
```
["","",""],
```
<img src="/docs/v2/finishsketch.png" className="max-w-96" />
That should generate a plate. Hit download DXF, and then import that into Fusion 360
<img src="docs/platesketch.png" className="max-w-96" />
Select the outer rectangle and press extrude, extrude the outer by 13mm, and then do the same with the inner rectangle by 3mm.
Extrude the plate by 3mm:
<img src="docs/extrudeplate.png" className="max-w-96" />
<img src="/docs/v2/halfextrude.png" className="max-w-96" />
Lastly, add a USB cutout:
<img src="docs/usbcutout.png" className="max-w-96" />
Thats the base of your case done! Next, lets create another sketch, this time creating circles with a diameter of 3.2mm, and 2.75mm from each edge. Extrude it to make it a hole!
Congrats!! You are now done with your case
<img src="/docs/v2/holesforcase.png" className="max-w-96" />
### Creating the top
Next, we will make the other half to our case. Start by creating yet another sketch, making it the same size as the bottom half of the case. Create the holes like before, and then create 4 14mm x 14mm squares. Follow these dimensions:
<img src="/docs/v2/topsketch.png" className="max-w-96" />
Almost done, create another rectangle 18mm x 21mm, 17mm away from both edges and 5mm from the top, and extrude that plate by 3mm.
<img src="/docs/v2/topextrude.png" className="max-w-96" />
Right now our case looks a little ugly, its so blocky! Lets round the corners, press the Fillet button found in the top, and click on each edge and make it 2mm. Select the top edge of the case and make that 1mm. Should look as such:
<img src="/docs/v2/fillet.png" className="max-w-96" />
<img src="/docs/v2/edgeround.png" className="max-w-96" />
Make sure to cut out a port hole for your xiao, the best method is to look for a 3d model online, and test fit everything. You can export your PCB as a .STEP file, and test fit everything. After I test fitted everything, I made a few modifications.
<img src="/docs/v2/casebottom.png" className="max-w-96" />
### Finishing Touches
Next, we will brand our case! This part will not be seen and is for us to be able to keep track of who's submission is whos. Go to the bottom of the case, or somewhere that won't be seen, and create a new sketch. Make a text box, and enter the name of your hackpad on it.
<img src="/docs/v2/createtext.png" className="max-w-96" />
Extrude this sketch 0.2mm INTO the case, don't worry about the overhang! If you are getting an error when extruding, keep the font as Arial.
<img src="/docs/v2/extrudedtext.png" className="max-w-96" />
Thats it! Your case is now done.
<img src="/docs/v2/finalcase.png" className="max-w-96" />
I would also recommend importing 3d models of all your components to test fit everything:
<img src="/docs/v2/testedcase.png" className="max-w-96" />
## Build your firmware
## Firmware
This tutorial uses the [QMK firmware](https://qmk.fm/) project as firmware! You can find out how to port your keyboard here: \
[QMK Porting Guide](https://docs.qmk.fm/porting_your_keyboard_to_qmk)
# Next steps
We just made a pretty cool macropad, but obviously there's a lot of cooler stuff out there - that's up to you to figure out!
We just made a pretty cool macropad, but obviously there's a lot of cooler stuff out there - that's up to you to figure out! Again, don't copy this guide 1:1, add your own design into it.
The biggest tip I have for that is to simply look at other PCB designs and reverse engineer it from there. For example, my own macropad design is actually in the repository
[here](https://github.com/hackclub/hackpad/tree/main/hackpads/orpheuspad)! It has:
- 2x neopixel/ws2812b LEDs
- 1 OLED
- 1 rotary encoder/knob
- 4 switches (5 if you include the rotary encoder!) - this is done in a [matrix](https://docs.qmk.fm/how_a_matrix_works), so it's a good point to check!
Everything is fully open source, so you can try and reverse engineer from there. This process applies to practically everything else