Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions hackpads/the_cost_effective/BOM.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
| Part Name | EAN | Product Nr. | Description | Quantity | Unit of Measurement | Price per Unit | Manufacturer | Comment |
|-----------------------------------|---------------|----------------|-----------------------------------------------------------------------------------------|----------|---------------------|----------------|--------------|--------------------|
| Seeed XIAO RP2040 Microcontroller | 4060137071744 | SE-102010428 | MCU | 1 | pcs | 6.30€ | Seeed Studio | |
| SK6805-2427 | 4060137044472 | SK6805MICRO-10 | 2.4X2.7X1.1mm Top SMD Type 0.1Watt Power tegrated light source Intelligent control LED | 20 | pcs | 0.21€ | OPSCO | or equivalent part |
| CHERRY MX2A-81NN | 4025112108327 | MX2A-81NN | CHERRY MX Silent Black | 20 | pcs | 0.55€ | Cherry | |
| 0402:1005 Diode | - | - | UR > 3.3V | 20 | pcs | - | any | match footprint |
| 0402:1005 Resistor | - | - | 10k resistor | 4 | pcs | - | any | match footprint |
Binary file not shown.
106,606 changes: 106,606 additions & 0 deletions hackpads/the_cost_effective/cad/hackpad-source.step

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#define RGBLIGHT_LED_COUNT 20
131 changes: 131 additions & 0 deletions hackpads/the_cost_effective/firmware/the_cost_effective/keyboard.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
{
"keyboard_name": "The Cost Effective",
"manufacturer": "KES",
"url": "https://github.com/snaeker58/Karls-Hackpad",
"maintainer": "snaeker58",
"usb": {
"device_version": "1.0.0",
"pid": "0x04E5",
"vid": "0x4B45"
},
"features": {
"bootmagic": true,
"rgblight": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"rgb_matrix": {
"animations": {
"alphas_mods": true,
"gradient_up_down": true,
"gradient_left_right": true,
"breathing": true,
"band_sat": true,
"band_val": true,
"band_pinwheel_sat": true,
"band_pinwheel_val": true,
"band_spiral_sat": true,
"band_spiral_val": true,
"cycle_all": true,
"cycle_left_right": true,
"cycle_up_down": true,
"rainbow_moving_chevron": true,
"cycle_out_in": true,
"cycle_out_in_dual": true,
"cycle_pinwheel": true,
"cycle_spiral": true,
"dual_beacon": true,
"rainbow_beacon": true,
"rainbow_pinwheels": true,
"raindrops": true,
"jellybean_raindrops": true,
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
"pixel_rain": true,
"pixel_flow": true,
"pixel_fractal": true,
"typing_heatmap": true,
"digital_rain": true,
"solid_reactive_simple": true,
"solid_reactive": true,
"solid_reactive_wide": true,
"solid_reactive_multiwide": true,
"solid_reactive_cross": true,
"solid_reactive_multicross": true,
"solid_reactive_nexus": true,
"solid_reactive_multinexus": true,
"splash": true,
"multisplash": true,
"solid_splash": true,
"solid_multisplash": true
},
"driver": "ws2812",
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0, "flags": 4},
{"matrix": [0, 1], "x": 20, "y": 0, "flags": 4},
{"matrix": [0, 2], "x": 40, "y": 0, "flags": 4},
{"matrix": [0, 3], "x": 60, "y": 0, "flags": 4},
{"matrix": [1, 0], "x": 0, "y": 20, "flags": 4},
{"matrix": [1, 1], "x": 20, "y": 20, "flags": 4},
{"matrix": [1, 2], "x": 40, "y": 20, "flags": 4},
{"matrix": [1, 3], "x": 60, "y": 40, "flags": 4},
{"matrix": [2, 0], "x": 0, "y": 40, "flags": 4},
{"matrix": [2, 1], "x": 20, "y": 40, "flags": 4},
{"matrix": [2, 2], "x": 40, "y": 40, "flags": 4},
{"matrix": [2, 3], "x": 60, "y": 60, "flags": 4},
{"matrix": [3, 0], "x": 0, "y": 60, "flags": 4},
{"matrix": [3, 1], "x": 20, "y": 60, "flags": 4},
{"matrix": [3, 2], "x": 40, "y": 60, "flags": 4},
{"matrix": [3, 3], "x": 60, "y": 80, "flags": 4},
{"matrix": [4, 0], "x": 0, "y": 80, "flags": 4},
{"matrix": [4, 1], "x": 20, "y": 80, "flags": 4},
{"matrix": [4, 2], "x": 40, "y": 80, "flags": 4},
{"matrix": [4, 3], "x": 60, "y": 80, "flags": 4}
]
},
"ws2812": {
"pin": "GP6",
"driver": "vendor"
},
"processor": "RP2040",
"bootloader": "rp2040",
"matrix_size": {
"rows": 5,
"cols": 4
},
"matrix_pins": {
"cols": ["GP11", "GP10", "GP9", "GP8"],
"rows": ["GP1", "GP2", "GP3", "GP4", "GP5"]
},
"diode_direction": "COL2ROW",
"layouts": {
"LAYOUT_ortho_5x4": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1},
{"matrix": [1, 1], "x": 1, "y": 1},
{"matrix": [1, 2], "x": 2, "y": 1},
{"matrix": [1, 3], "x": 3, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1, "y": 2},
{"matrix": [2, 2], "x": 2, "y": 2},
{"matrix": [2, 3], "x": 3, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3},
{"matrix": [3, 1], "x": 1, "y": 3},
{"matrix": [3, 2], "x": 2, "y": 3},
{"matrix": [3, 3], "x": 3, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4},
{"matrix": [4, 1], "x": 1, "y": 4},
{"matrix": [4, 2], "x": 2, "y": 4},
{"matrix": [4, 3], "x": 3, "y": 4}
]
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_ortho_5x4( // Replace 'LAYOUT_all' with the correct macro
KC_ESC, KC_KB_MUTE, KC_DELETE, KC_BSPC,
KC_KP_PLUS, KC_KP_MINUS, KC_KP_ASTERISK, KC_KP_SLASH,
KC_7, KC_8, KC_9, KC_KB_MUTE,
KC_4, KC_5, KC_6, KC_KB_VOLUME_UP,
KC_1, KC_2, KC_3, KC_KB_VOLUME_DOWN
),
[1] = LAYOUT_ortho_5x4(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[2] = LAYOUT_ortho_5x4(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[3] = LAYOUT_ortho_5x4(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
)
};
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
VIA_ENABLE = yes
27 changes: 27 additions & 0 deletions hackpads/the_cost_effective/firmware/the_cost_effective/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# the_cost_effective

![the_cost_effective](https://github.com/snaeker58/Karls-Hackpad/blob/main/images/layout.jpg)

*A 4x5 ortholinear macro keyboard made by Karl.*

* Keyboard Maintainer: [Karl](https://github.com/snaeker58)
* Hardware Supported: *[Custom PCB and case](https://github.com/snaeker58/Karls-Hackpad)*
* Hardware Availability: *DIY build, not sold or distributed*

Make example for this keyboard (after setting up your build environment):

make the_cost_effective:default

Flashing example for this keyboard:

make the_cost_effective:default:flash

See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).

## Bootloader

Enter the bootloader in 3 ways:

* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
Empty file.
Binary file not shown.
129 changes: 129 additions & 0 deletions hackpads/the_cost_effective/pcb/Hackpad.kicad_dru
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
(version 1)
# Custom Design Rules (DRC) for KiCAD 8.0 (Stored in '<project>.kicad_dru' file).
#
# Matching JLCPCB capabilities: https://jlcpcb.com/capabilities/pcb-capabilities
#
# KiCad documentation: https://docs.kicad.org/master/id/pcbnew/pcbnew_advanced.html#custom_design_rules
#
# Inspiration
# - https://gist.github.com/darkxst/f713268e5469645425eed40115fb8b49 (with comments)
# - https://gist.github.com/denniskupec/e163d13b0a64c2044bd259f64659485e (with comments)

# TODO new rule: NPTH pads.
# Inner diameter of pad should be 0.4-0.5 mm larger than NPTH drill diameter.
# JLCPCB: "We make NPTH via dry sealing film process, if customer would like a NPTH but around with pad/copper, our engineer will dig out around pad/copper about 0.2mm-0.25mm, otherwise the metal potion will be flowed into the hole and it becomes a PTH. (there will be no copper dig out optimization for single board)."

# TODO: new rule for plated slots: min diameter/width 0.5mm
# JLCPCB: "The minimum plated slot width is 0.5mm, which is drawn with a pad."

# TODO new rule: non-plated slots: min diameter/width 1.0mm
# JLCPCB: "The minimum Non-Plated Slot Width is 1.0mm, please draw the slot outline in the mechanical layer(GML or GKO)""


(rule "Track width, outer layer (1oz copper)"
(layer outer)
(condition "A.Type == 'track'")
(constraint track_width (min 0.1mm))
)

(rule "Track spacing, outer layer (1oz copper)"
(layer outer)
(condition "A.Type == 'track' && B.Type == A.Type")
(constraint clearance (min 0.1mm))
)

(rule "Track width, inner layer"
(layer inner)
(condition "A.Type == 'track'")
(constraint track_width (min 0.1mm))
)

(rule "Track spacing, inner layer"
(layer inner)
(condition "A.Type == 'track' && B.Type == A.Type")
(constraint clearance (min 0.1mm))
)

(rule "Silkscreen text"
(layer "?.Silkscreen")
(condition "A.Type == 'Text' || A.Type == 'Text Box'")
(constraint text_thickness (min 0.153mm))
(constraint text_height (min 1mm))
)

(rule "Pad to Silkscreen"
(layer outer)
(condition "A.Type == 'pad' && B.Layer == '?.Silkscreen'")
(constraint silk_clearance (min 0.15mm))
)

(rule "Edge (routed) to track clearance"
(condition "A.Type == 'track'")
(constraint edge_clearance (min 0.2mm))
)

#(rule "Edge (v-cut) to track clearance"
# (condition "A.Type == 'track'")
# (constraint edge_clearance (min 0.4mm))
#)

# This rule handles diameter minimum and maximum for ALL holes.
# Other specialized rules handle restrictions (e.g. Via, PTH, NPTH)
(rule "Hole diameter"
(constraint hole_size (min 0.3mm) (max 6.3mm))
)

(rule "Hole (NPTH) diameter"
(layer outer)
(condition "!A.isPlated()")
(constraint hole_size (min 0.3mm))
)

# TODO: Hole to board edge ≥ 1 mm. Min. board size 10 × 10 mm
(rule "Hole (castellated) diameter"
(layer outer)
(condition "A.Type == 'pad' && A.Fabrication_Property == 'Castellated pad'")
(constraint hole_size (min 0.6mm))
)

(rule "Annular ring width (via and PTH)"
(layer outer)
(condition "A.isPlated()")
(constraint annular_width (min 0.18mm))
)

(rule "Clearance: hole to hole (perimeter), different nets"
(layer outer)
(condition "A.Net != B.Net")
(constraint hole_to_hole (min 0.45mm))
)

(rule "Clearance: hole to hole (perimeter), same net"
(layer outer)
(condition "A.Net == B.Net")
(constraint hole_to_hole (min 0.2mm))
)

(rule "Clearance: track to NPTH hole (perimeter)"
# (condition "A.Pad_Type == 'NPTH, mechanical' && B.Type == 'track' && A.Net != B.Net")
(condition "!A.isPlated() && B.Type == 'track' && A.Net != B.Net")
(constraint hole_clearance (min 0.2mm))
)

(rule "Clearance: track to PTH hole perimeter"
(condition "A.isPlated() && B.Type == 'track' && A.Net != B.Net")
(constraint hole_clearance (min 0.275mm))
)

(rule "Clearance: track to pad"
(condition "A.Type == 'pad' && B.Type == 'track' && A.Net != B.Net")
(constraint clearance (min 0.1mm))
)

(rule "Clearance: pad/via to pad/via"
(layer outer)
# (condition "(A.Type == 'Pad' || A.Type == 'Via') && (B.Type == 'Pad' || B.Type == 'Via') && A.Net != B.Net")
(condition "A.isPlated() && B.isPlated() && A.Net != B.Net")
(constraint clearance (min 0.2mm))
)

Loading