added example page, instructions on getting keycaps

This commit is contained in:
Alex Ren 2025-01-16 12:06:33 -05:00
parent b3680575ba
commit d6c8853452
13 changed files with 227 additions and 44 deletions

View file

@ -10,6 +10,7 @@
"opacity": { "opacity": {
"images": 0.6, "images": 0.6,
"pads": 1.0, "pads": 1.0,
"shapes": 1.0,
"tracks": 1.0, "tracks": 1.0,
"vias": 1.0, "vias": 1.0,
"zones": 0.6 "zones": 0.6
@ -62,9 +63,10 @@
35, 35,
36, 36,
39, 39,
40 40,
41
], ],
"visible_layers": "fffffff_ffffffff", "visible_layers": "ffffffff_ffffffff",
"zone_display_mode": 0 "zone_display_mode": 0
}, },
"git": { "git": {
@ -75,9 +77,71 @@
}, },
"meta": { "meta": {
"filename": "orpheuspad_pcb.kicad_prl", "filename": "orpheuspad_pcb.kicad_prl",
"version": 3 "version": 4
},
"net_inspector_panel": {
"col_hidden": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false
],
"col_order": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
],
"col_widths": [
156,
141,
103,
71,
103,
103,
103,
74,
103,
103
],
"custom_group_rules": [],
"expanded_rows": [],
"filter_by_net_name": true,
"filter_by_netclass": true,
"filter_text": "",
"group_by_constraint": false,
"group_by_netclass": false,
"show_unconnected_nets": false,
"show_zero_pad_nets": false,
"sort_ascending": true,
"sorting_column": 0
}, },
"project": { "project": {
"files": [] "files": []
},
"schematic": {
"selection_filter": {
"graphics": true,
"images": true,
"labels": true,
"lockedItems": false,
"otherItems": true,
"pins": true,
"symbols": true,
"text": true,
"wires": true
}
} }
} }

View file

@ -6,14 +6,14 @@
"apply_defaults_to_fp_fields": false, "apply_defaults_to_fp_fields": false,
"apply_defaults_to_fp_shapes": false, "apply_defaults_to_fp_shapes": false,
"apply_defaults_to_fp_text": false, "apply_defaults_to_fp_text": false,
"board_outline_line_width": 0.049999999999999996, "board_outline_line_width": 0.05,
"copper_line_width": 0.19999999999999998, "copper_line_width": 0.2,
"copper_text_italic": false, "copper_text_italic": false,
"copper_text_size_h": 1.5, "copper_text_size_h": 1.5,
"copper_text_size_v": 1.5, "copper_text_size_v": 1.5,
"copper_text_thickness": 0.3, "copper_text_thickness": 0.3,
"copper_text_upright": false, "copper_text_upright": false,
"courtyard_line_width": 0.049999999999999996, "courtyard_line_width": 0.05,
"dimension_precision": 4, "dimension_precision": 4,
"dimension_units": 3, "dimension_units": 3,
"dimensions": { "dimensions": {
@ -24,13 +24,13 @@
"text_position": 0, "text_position": 0,
"units_format": 1 "units_format": 1
}, },
"fab_line_width": 0.09999999999999999, "fab_line_width": 0.1,
"fab_text_italic": false, "fab_text_italic": false,
"fab_text_size_h": 1.0, "fab_text_size_h": 1.0,
"fab_text_size_v": 1.0, "fab_text_size_v": 1.0,
"fab_text_thickness": 0.15, "fab_text_thickness": 0.15,
"fab_text_upright": false, "fab_text_upright": false,
"other_line_width": 0.09999999999999999, "other_line_width": 0.1,
"other_text_italic": false, "other_text_italic": false,
"other_text_size_h": 1.0, "other_text_size_h": 1.0,
"other_text_size_v": 1.0, "other_text_size_v": 1.0,
@ -41,11 +41,11 @@
"height": 1.524, "height": 1.524,
"width": 1.524 "width": 1.524
}, },
"silk_line_width": 0.09999999999999999, "silk_line_width": 0.1,
"silk_text_italic": false, "silk_text_italic": false,
"silk_text_size_h": 1.0, "silk_text_size_h": 1.0,
"silk_text_size_v": 1.0, "silk_text_size_v": 1.0,
"silk_text_thickness": 0.09999999999999999, "silk_text_thickness": 0.1,
"silk_text_upright": false, "silk_text_upright": false,
"zones": { "zones": {
"min_clearance": 0.5 "min_clearance": 0.5
@ -63,16 +63,19 @@
"copper_edge_clearance": "error", "copper_edge_clearance": "error",
"copper_sliver": "warning", "copper_sliver": "warning",
"courtyards_overlap": "error", "courtyards_overlap": "error",
"creepage": "error",
"diff_pair_gap_out_of_range": "error", "diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error", "diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error", "drill_out_of_range": "error",
"duplicate_footprints": "warning", "duplicate_footprints": "warning",
"extra_footprint": "warning", "extra_footprint": "warning",
"footprint": "error", "footprint": "error",
"footprint_filters_mismatch": "ignore",
"footprint_symbol_mismatch": "warning", "footprint_symbol_mismatch": "warning",
"footprint_type_mismatch": "ignore", "footprint_type_mismatch": "ignore",
"hole_clearance": "error", "hole_clearance": "error",
"hole_near_hole": "error", "hole_near_hole": "error",
"hole_to_hole": "warning",
"holes_co_located": "warning", "holes_co_located": "warning",
"invalid_outline": "error", "invalid_outline": "error",
"isolated_copper": "warning", "isolated_copper": "warning",
@ -83,9 +86,11 @@
"lib_footprint_mismatch": "warning", "lib_footprint_mismatch": "warning",
"malformed_courtyard": "error", "malformed_courtyard": "error",
"microvia_drill_out_of_range": "error", "microvia_drill_out_of_range": "error",
"mirrored_text_on_front_layer": "warning",
"missing_courtyard": "ignore", "missing_courtyard": "ignore",
"missing_footprint": "warning", "missing_footprint": "warning",
"net_conflict": "warning", "net_conflict": "warning",
"nonmirrored_text_on_back_layer": "warning",
"npth_inside_courtyard": "ignore", "npth_inside_courtyard": "ignore",
"padstack": "warning", "padstack": "warning",
"pth_inside_courtyard": "ignore", "pth_inside_courtyard": "ignore",
@ -100,7 +105,9 @@
"text_thickness": "warning", "text_thickness": "warning",
"through_hole_pad_without_hole": "error", "through_hole_pad_without_hole": "error",
"too_many_vias": "error", "too_many_vias": "error",
"track_angle": "error",
"track_dangling": "warning", "track_dangling": "warning",
"track_segment_length": "error",
"track_width": "error", "track_width": "error",
"tracks_crossing": "error", "tracks_crossing": "error",
"unconnected_items": "error", "unconnected_items": "error",
@ -113,27 +120,29 @@
"min_clearance": 0.0, "min_clearance": 0.0,
"min_connection": 0.0, "min_connection": 0.0,
"min_copper_edge_clearance": 0.5, "min_copper_edge_clearance": 0.5,
"min_groove_width": 0.0,
"min_hole_clearance": 0.25, "min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25, "min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.19999999999999998, "min_microvia_diameter": 0.2,
"min_microvia_drill": 0.09999999999999999, "min_microvia_drill": 0.1,
"min_resolved_spokes": 2, "min_resolved_spokes": 2,
"min_silk_clearance": 0.0, "min_silk_clearance": 0.0,
"min_text_height": 0.7999999999999999, "min_text_height": 0.8,
"min_text_thickness": 0.08, "min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3, "min_through_hole_diameter": 0.3,
"min_track_width": 0.0, "min_track_width": 0.0,
"min_via_annular_width": 0.09999999999999999, "min_via_annular_width": 0.1,
"min_via_diameter": 0.5, "min_via_diameter": 0.5,
"solder_mask_to_copper_clearance": 0.0, "solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true "use_height_for_length_calcs": true
}, },
"teardrop_options": [ "teardrop_options": [
{ {
"td_onpadsmd": true, "td_onpthpad": true,
"td_onroundshapesonly": false, "td_onroundshapesonly": false,
"td_onsmdpad": true,
"td_ontrackend": false, "td_ontrackend": false,
"td_onviapad": true "td_onvia": true
} }
], ],
"teardrop_parameters": [ "teardrop_parameters": [
@ -208,6 +217,7 @@
"mfg": "", "mfg": "",
"mpn": "" "mpn": ""
}, },
"layer_pairs": [],
"layer_presets": [], "layer_presets": [],
"viewports": [] "viewports": []
}, },
@ -402,10 +412,15 @@
"duplicate_sheet_names": "error", "duplicate_sheet_names": "error",
"endpoint_off_grid": "warning", "endpoint_off_grid": "warning",
"extra_units": "error", "extra_units": "error",
"footprint_filter": "ignore",
"footprint_link_issues": "warning",
"four_way_junction": "ignore",
"global_label_dangling": "warning", "global_label_dangling": "warning",
"hier_label_mismatch": "error", "hier_label_mismatch": "error",
"label_dangling": "error", "label_dangling": "error",
"label_multiple_wires": "warning",
"lib_symbol_issues": "warning", "lib_symbol_issues": "warning",
"lib_symbol_mismatch": "warning",
"missing_bidi_pin": "warning", "missing_bidi_pin": "warning",
"missing_input_pin": "warning", "missing_input_pin": "warning",
"missing_power_pin": "error", "missing_power_pin": "error",
@ -418,9 +433,14 @@
"pin_not_driven": "error", "pin_not_driven": "error",
"pin_to_pin": "warning", "pin_to_pin": "warning",
"power_pin_not_driven": "error", "power_pin_not_driven": "error",
"same_local_global_label": "warning",
"similar_label_and_power": "warning",
"similar_labels": "warning", "similar_labels": "warning",
"similar_power": "warning",
"simulation_model_issue": "ignore", "simulation_model_issue": "ignore",
"single_global_label": "ignore",
"unannotated": "error", "unannotated": "error",
"unconnected_wire_endpoint": "warning",
"unit_value_mismatch": "error", "unit_value_mismatch": "error",
"unresolved_variable": "error", "unresolved_variable": "error",
"wire_dangling": "error" "wire_dangling": "error"
@ -432,7 +452,7 @@
}, },
"meta": { "meta": {
"filename": "orpheuspad_pcb.kicad_pro", "filename": "orpheuspad_pcb.kicad_pro",
"version": 1 "version": 2
}, },
"net_settings": { "net_settings": {
"classes": [ "classes": [
@ -447,6 +467,7 @@
"microvia_drill": 0.1, "microvia_drill": 0.1,
"name": "Default", "name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)", "pcb_color": "rgba(0, 0, 0, 0.000)",
"priority": 2147483647,
"schematic_color": "rgba(0, 0, 0, 0.000)", "schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.2, "track_width": 0.2,
"via_diameter": 0.6, "via_diameter": 0.6,
@ -455,7 +476,7 @@
} }
], ],
"meta": { "meta": {
"version": 3 "version": 4
}, },
"net_colors": null, "net_colors": null,
"netclass_assignments": null, "netclass_assignments": null,
@ -531,6 +552,7 @@
], ],
"filter_string": "", "filter_string": "",
"group_symbols": true, "group_symbols": true,
"include_excluded_from_bom": false,
"name": "Grouped By Value", "name": "Grouped By Value",
"sort_asc": true, "sort_asc": true,
"sort_field": "Reference" "sort_field": "Reference"
@ -565,6 +587,7 @@
"net_format_name": "", "net_format_name": "",
"page_layout_descr_file": "", "page_layout_descr_file": "",
"plot_directory": "", "plot_directory": "",
"space_save_all_events": true,
"spice_current_sheet_as_root": false, "spice_current_sheet_as_root": false,
"spice_external_command": "spice \"%I\"", "spice_external_command": "spice \"%I\"",
"spice_model_current_sheet_as_root": true, "spice_model_current_sheet_as_root": true,

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

View file

@ -17,7 +17,7 @@ import "./index.css";
// IMPORT YOUR PROJECTS HERE // IMPORT YOUR PROJECTS HERE
import OrpheusPad from "./pages/submissions/OrpheusPad.mdx" import OrpheusPad from "./pages/submissions/Orpheuspad/OrpheusPad.mdx"
const router = createBrowserRouter([ const router = createBrowserRouter([
{ {
@ -55,7 +55,7 @@ const router = createBrowserRouter([
element: <DocPage Content={ ResearchNote } />, element: <DocPage Content={ ResearchNote } />,
}, },
{ {
path: "/get-keycaps", path: "/get-keycap",
element: <DocPage Content={ GetKeycap } />, element: <DocPage Content={ GetKeycap } />,
}, },

View file

@ -1,6 +1,6 @@
# Get your Hack Club keycaps! # Get your Hack Club keycaps!
Finally got your hackpad, eager to get your new custom hc keycap? Read on to find out how! Finally got your hackpad, eager to get your new custom HACK CLUB BRANDED keycap? Read on to find out how!
## Assemble your hackpad ## Assemble your hackpad
@ -12,26 +12,66 @@ As always, if you ever need help, ask in #hackpad!
## Get the firmware working ## Get the firmware working
Once that works, send a video in #hackpad! Let the world see. When you initially flash your firmware, there's a good chance that it won't actually work. That's okay! It's pretty hard to develop firmware without the physical device. Now's your chance to fix it, edit it, and add whatever features you may want.
Eventually, it should work! Send a video in #hackpad and let everyone see what you've made. Now it's time to add it to the hackpad website!
## Write your page! ## Update the website to add your page
Now you have an awesome working macropad, that you designed yourself. Time to write it!
Make sure to add each section! It really goes a long way to document your project. Imagine if I didn't docuemnt any of this Now you have an awesome working macropad, that you designed yourself. Time to add it to the hackpad website! We're now going to edit the website.
First, clone the repository. Navigate over to the "website" folder. Run the command "pnpm install", then run "pnpm dev". It should show up on port 5173. That can be pretty confusing, so if you have any issues make sure to ask in #hackpad!
(side note: node v23.0 and up breaks the site, so try downgrading if you're running into issues)
Navigate over to `website/src/pages/submissions`. Make a new folder with the title of your hackpad, then create a new MDX file with the same name. It should look something like this:
<img src="/docs/newpage.png" alt="New Page" width="500"/>
(there's some additional assets in there. Note the OrpheusPad.mdx file)
Now you're ready to start writing your page! Let's get to it
#### Write your page!
Now that you have the website set up locally, you can now edit it to add a page on your hackpad. Edit the MDX file
Make sure to add each section. It really goes a long way to document your project. Imagine if I didn't docuemnt any of this!!
- Overview - Overview
- CAD model - CAD model
- PCB - PCB
- Firmware - Firmware
- BOM - BOM
- Any fun facts!!! - Any fun facts / random stuff you wanna share
Check the [OrpheusPad](https://hackpad.hackclub.com/projects/orpheuspad) page as a reference Check the [OrpheusPad](https://hackpad.hackclub.com/projects/orpheuspad) page as a reference. Doesn't need to be as fancy, but this is your chance to get on an OFFICIAL hack club page. Use it wisely
#### Add the route
Once you're done writing the page, you need to add the route so that people can actually see it! Head over to main.tsx, then you're going to do 2 things.
## Update the website to add your page First, at the top of the file, import your page. In the case of orpheuspad:
Here's your final part! ```javascript
import OrpheusPad from "./pages/submissions/Orpheuspad/OrpheusPad.mdx"
```
It should look something like this:
<img src="docs/importpage.png" alt="Import Page" width="500"/>
Next, we need to add a route to your page. Otherwise, people wouldn't be able to find it! The route is basiaclly where your page will be located.
Head over to main.tsx. You should see a bunch of routes. Add a new route to your page at the bottom. Each route follows the same syntax. To add OrpheusPad:
```javascript
// Submitting? Great! Do something like this:
{
path: "/projects/orpheuspad",
element: <DocPage Content={ OrpheusPad } />
}
```
After, it should look something like this:
<img src="docs/routepage.png" alt="Add Route" width="500"/>
You should be done! Make sure to test these changes locally by going to `http://localhost:5173/projects/yourprojectname`. If it works, you're ready to make a PR! Head on over to the repository and make a PR with your changes.
## Fill out the form! ## Fill out the form!
If all goes well, your PR will be merged and you'll be sent a form to get your keycap. Have fun!!

View file

@ -1,15 +0,0 @@
# Orpheuspad
Orpheuspad is a 4 key macropad with a rotary encoder, an OLED Display. It also has 2 WS2812B Leds, and uses QMK firmware
I made it because hack club needed a tutorial macropad and there weren't any good options....
## Fun facts
- This project took 20+ hours!!
- I redesigned it like 15 times...
- It glows underneath. Isn't that sick!!!
## What I learned
Something. hopefully...

View file

@ -0,0 +1,71 @@
import schematicImage from './schematic.png';
import pcbImage from './pcb.png';
import cadImage from './cad.png';
import bongoCat from './bongocat.png';
# Orpheuspad
Orpheuspad is a 4 key macropad with a rotary encoder, an OLED Display. It also has 2 WS2812B Leds, and uses QMK firmware
It serves as an example piece/reference for the hackpad YSWS, since it contains an implementation of every common part.
## Features:
- Dual layer acrylic case. looks looks awesome doesn't it??
- 128x32 OLED Display
- EC11 Rotary encoder for whatever you want
- 2 WS2812B RGB LEDs. One for underglow, and one that diffuses throughout the case
- 4 Keys
- [VIA](https://www.caniusevia.com/) support!
## CAD Model:
Everything fits together using 5 M3 Bolts and heatset inserts. 4 for the case, one for the PCB. Also, it has a 5 degree tilt
It has 3 separate printed pieces. The angle, the base where the PCB sits, and the top cover. it also has 2 acrylic plates. One to cover the electronics, the other to hold the switches
<img src={cadImage} alt="Schematic" width="500"/>
Made in Fusion360. Nifty
## PCB
Here's my PCB! It was made in KiCad. The silkscreen was imported from a Figma image.
Schematic
<img src={schematicImage} alt="Schematic" width="300"/>
PCB
<img src={pcbImage} alt="Schematic" width="300"/>
I used MX_V2 for the keyswitch footprints. I think in retrospect, I should've added a ground plane
## Firmware Overview
This hackpad uses [QMK](https://qmk.fm/) firmware for everything.
- the rotary encoder changes volume. press to mute
- The 4 keys currently act as macros I dynamically change in VIA.
- The OLED is a cat!! Bongocat!! :3
<img src={bongoCat} alt="Bongo Cat" width="300"/>
I might add more in the future! That's it for now
## BOM:
Here should be everything you need to make this hackpad
- 4x Cherry MX Switches
- 4x DSA Keycaps
- 5x M3x5x4 Heatset inserts
- 3x M3x16mm SHCS Bolts
- 2X M3x12mm SHCS Bolts
- 5x 1N4148 DO-35 Diodes.
- 2x WS2812B LEDs
- 1x 0.91" 128x32 OLED Display
- 1x EC11 Rotary Encoder
- 1x XIAO RP2040
- 1x Case (3 printed parts, 2 laser cut parts)
## Extra stuff
Honestly I'm not quite too sure what to add here. Favourite meme? a joke?? Uhhh you can imagine it
Oh fun fact: I built mine in SF the day before github universe LOL

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB