Compare commits

..

1 Commits
main ... rev0.2

Author SHA1 Message Date
Nico Stuhlmueller cba01e3e63 fixed bugs in rev0.2 2023-04-10 11:17:33 +02:00
23 changed files with 3 additions and 66846 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 KiB

View File

@ -3,7 +3,7 @@ outer_length = 102;
outer_height = 10;
inner_width = 72;
inner_length = 96;
inner_height = 6.5;
inner_height = 7;
mx = 19;
mx_top=14.6;
@ -20,12 +20,12 @@ difference(){
translate([0,4*mx-1.5]) cube([inner_width, outer_length-(outer_length-inner_length)/2 -4*mx-3, 1.2*outer_height]);
cube([inner_width, inner_length, inner_height]);
// usb hole
translate([inner_width,inner_length-11.5,2]) minkowski(1){ sphere(1); cube([2,18,8], true);}
translate([inner_width,inner_length-11,5]) minkowski(1){ sphere(1); cube([2,5,3], true);}
// drill holes
$fn=20;
for (i = [0:2:2]) {
for (j = [0:2:2]) {
translate([i*mx+17, j*mx+17]) cylinder(2*outer_height, 1.1, center=true);
translate([i*mx+17, j*mx+17]) cylinder(2*outer_height, 1, center=true);
}
}
translate([1*mx+17, 1*mx+17]) cylinder(2*outer_height, 1, center=true);

View File

@ -1,102 +0,0 @@
//=============================================================================
// iR Hackpad Demo Firmware
// Compile for Arduino Leonardo
//=============================================================================
// The Arduino Keyboard library creates a HID keyboard interface to send keyboard scancodes to the host.
// For convenience, the class takes ASCII characters via Keyboard::write(), which are automatically
// converted to the corresponding keboard scan-codes according to the keyboard layout passed to
// Keyboard::begin(). On the host side, the scan-codes are again converted to characters by the OS.
#include "Keyboard.h"
//=============================================================================
// Our key matrix (see schematics)
const int N_rows = 5;
const int N_cols = 4;
const int gpio_rows[N_rows] = { 6, 7, 8, 9, 5 };
const int gpio_cols[N_cols] = { 15, 14, 16, 10 };
// Key function assignment: ASCII characters or special function codes (see Keyboard.h)
const int key_matrix[N_rows][N_cols] = {
{'a', 'b', 'c', 'd'}, // 4x4 keypad
{'e', 'f', 'g', 'h'},
{'i', 'j', 'k', 'l'},
{'m', 'n', 'o', 'p'},
{'_', '_', '_', 'x'} // rotery encoder button
};
// Key state
struct {
bool last; // Last debounced state
bool inhibit; // State change inhibited during debounce period
uint32_t since_ms; // Inhibited since timestamp
} key_state[N_rows][N_cols];
const uint32_t KEY_DEBOUNCE_MS = 50; // Key Debounce period
const uint32_t KEY_SCAN_DELAY_US = 200; // Delay between row scans
//=============================================================================
void setup()
{
for (int col=0; col<N_cols; col++) {
pinMode(gpio_cols[col], INPUT_PULLUP); // Key matrix columns as inputs
}
for (int row=0; row<N_rows; row++) {
digitalWrite(gpio_rows[row], HIGH);
pinMode(gpio_rows[row], OUTPUT); // Key matrix rows as outputs
}
memset( &key_state, 0, sizeof(key_state) ); // Clear key state
Keyboard.begin(KeyboardLayout_de_DE);
Serial.begin(9600); // Open serial port to host, so the IDE can reset the device for reprogramming
}
//=============================================================================
// Key debouncing:
// React immediately to rising edge (pressed == 1 and last_pressed == 0)
// After that, inhibit further state changes for KEY_DEBOUNCE_MS milliseconds.
void eval_key( int row, int col, bool pressed )
{
// Remove inhibit after debounce period
if (key_state[row][col].inhibit &&
((millis() - key_state[row][col].since_ms) > KEY_DEBOUNCE_MS)) {
key_state[row][col].inhibit = 0;
}
if (pressed == true) { // Key is pressed?
if (key_state[row][col].last == false) { // Rising edge: Key has just been pressed?
key_state[row][col].last = true;
key_state[row][col].inhibit = true;
key_state[row][col].since_ms = millis();
Keyboard.press(key_matrix[row][col]);
}
// TODO: Repeat delay, repeat rate
}
else { // Pressed == false
if (!key_state[row][col].inhibit)
key_state[row][col].last = false;
Keyboard.release(key_matrix[row][col]);
}
}
//=============================================================================
void loop()
{
for (int row=0; row<N_rows; row++) {
digitalWrite(gpio_rows[row], LOW);
for (int col=0; col<N_cols; col++) {
const bool pressed = (digitalRead(gpio_cols[col]) == LOW); // Input level low: Key is pressed
eval_key( row, col, pressed );
}
digitalWrite(gpio_rows[row], HIGH);
delayMicroseconds(KEY_SCAN_DELAY_US); // Give the column inputs time to reach HIGH state (slow recharge via weak pullups)
}
}
//=============================================================================

View File

@ -1,66 +0,0 @@
//=============================================================================
// iR Hackpad Demo Firmware
// Compile for Arduino Leonardo
//=============================================================================
// The Arduino Keyboard library creates a HID keyboard interface to send keyboard scancodes to the host.
// For convenience, the class takes ASCII characters via Keyboard::write(), which are automatically
// converted to the corresponding keboard scan-codes according to the keyboard layout passed to
// Keyboard::begin(). On the host side, the scan-codes are again converted to characters by the OS.
#include "Keyboard.h"
//=============================================================================
// Our key matrix (see schematics)
const int N_rows = 5;
const int N_cols = 4;
const int gpio_rows[N_rows] = { 6, 7, 8, 9, 5 };
const int gpio_cols[N_cols] = { 15, 14, 16, 10 };
// Key function assignment: ASCII characters or special function codes (see Keyboard.h)
const int key_matrix[N_rows][N_cols] = {
{'a', 'b', 'c', 'd'}, // 4x4 keypad
{'e', 'f', 'g', 'h'},
{'i', 'j', 'k', 'l'},
{'m', 'n', 'o', 'p'},
{'_', '_', '_', 'x'} // rotery encoder button
};
int is_pressed[N_rows][N_cols] = { 0 };
const uint32_t KEY_SCAN_DELAY_US = 100; // Delay between row scans
//=============================================================================
void setup()
{
for (int col=0; col<N_cols; col++) {
pinMode(gpio_cols[col], INPUT_PULLUP); // Key matrix columns as inputs
}
for (int row=0; row<N_rows; row++) {
digitalWrite(gpio_rows[row], HIGH);
pinMode(gpio_rows[row], OUTPUT); // Key matrix rows as outputs
}
Keyboard.begin(KeyboardLayout_de_DE);
Serial.begin(9600); // Open serial port to host, so the IDE can reset the device for reprogramming
}
//=============================================================================
void loop()
{
for (int row=0; row<N_rows; row++) {
digitalWrite(gpio_rows[row], LOW);
for (int col=0; col<N_cols; col++) {
if (digitalRead(gpio_cols[col]) == LOW){
is_pressed[row][col] = true;
Keyboard.press(key_matrix[row][col]);
} else if (is_pressed[row][col]) {
Keyboard.release(key_matrix[row][col]);
is_pressed[row][col] = false;
}
delayMicroseconds(KEY_SCAN_DELAY_US); // Give the column inputs time to reach HIGH state (slow recharge via weak pullups)
}
digitalWrite(gpio_rows[row], HIGH);
}
}
//=============================================================================

View File

@ -1,75 +0,0 @@
{
"manufacturer": "Nico Stuhlmueller",
"keyboard_name": "hackpad",
"maintainer": "ThePurox",
"development_board": "promicro",
"diode_direction": "COL2ROW",
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true,
"rgblight": true,
"encoder" : true
},
"matrix_pins": {
"cols": ["B1", "B3", "B2", "B6"],
"rows": ["C6", "D7", "E6", "B4", "B5"]
},
"encoder" : {
"rotary" : [
{"pin_a" : "F5", "pin_b" : "F4"}
]
},
"url": "https://git.imaginaerraum.de/Purox/Hackpad",
"usb": {
"device_version": "1.0.0",
"pid": "0x0000",
"vid": "0xFEED"
},
"ws2812" : {
"pin": "D4"
},
"rgblight" : {
"pin": "D4",
"led_count" : 16,
"sleep" : true,
"animations": {
"breathing" : true,
"rainbow_mood" : true,
"rainbow_swirl" : true,
"snake" : true,
"knight" : true,
"christmas" : true,
"static_gradient" : true,
"rgb_test" : true,
"alternating" : true,
"twinkle" : true
},
},
"layouts": {
"LAYOUT": {
"layout": [
{ "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 }
]
}
}
}

View File

@ -1,39 +0,0 @@
// Copyright 2023 Nico Stuhlmueller (@ThePurox)
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
#include "keymap_german.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* ┌───┐
* MUT
*
* 7 8 9 +
*
* 4 5 6 -
*
* 1 2 3 *
*
* 0 . Ent /
*
*/
[0] = LAYOUT( LT(1, KC_MUTE),
KC_7, KC_8, KC_9, DE_PLUS,
KC_4, KC_5, KC_6, DE_MINS,
KC_1, KC_2, KC_3, DE_ASTR,
KC_0, KC_DOT, KC_ENT, DE_SLSH),
[1] = LAYOUT( XXXXXXX,
RGB_M_P, RGB_M_B, RGB_M_R, RGB_HUI,
RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_HUD,
RGB_M_X, RGB_M_G, RGB_M_TW, RGB_VAI,
RGB_TOG, RGB_SAI, RGB_SAD, RGB_VAD)};
bool encoder_update_user(uint8_t index, bool clockwise) {
if (clockwise) {
tap_code_delay(KC_VOLU, 10);
} else {
tap_code_delay(KC_VOLD, 10);
}
return false;
}

View File

@ -1,31 +0,0 @@
# hackpad
![hackpad](https://git.imaginaerraum.de/Purox/Hackpad/src/branch/main/pic.jpg)
The `Hackpad` is a 4x4 numpad/macropad designed for the Arduino Day 2023 in Bayreuth in cooperation with the hackspace [Imaginärraum e.V.](imaginaerraum.de) and [Fablab-Bayreuth e.V.](fablab-bayreuth.de).
It supports 16 MX-style switches, an EC-11 rotary encoder, and per key RGB LEDs based on SK6812.
In v0.2 all necessary components are through hole components (except for an optional reset switch and RGB-LEDs), but the ProMicro protrudes out of the case.
In v0.3 this is fixed by moving some diodes to the bottom side. The bottom diodes however are SMD only.
* Keyboard Maintainer: [Nico Stuhlmueller](https://github.com/ThePurox)
* Hardware Supported: ProMicro is supported in v0.2 and v0.3 of the PCBs
* Hardware Availability: PCBs can be found [here](https://git.imaginaerraum.de/Purox/Hackpad)
Make example for this keyboard (after setting up your build environment):
qmk compile -kb hackpad -km default
Flashing example for this keyboard:
qmk flash -kb hackpad -km default
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 2 ways:
* **Physical reset button**: Briefly press the button on the top 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

View File

@ -1 +0,0 @@
# this file is intentionally left blank

View File

@ -1,2 +0,0 @@
# QMK Firmware
Copy the folder `hackpad` into the `keyboards` folder of your qmk installation. Then follow the instructions in `hackpad/readme.md`.

View File

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,122 +0,0 @@
(footprint "LOGO" (version 20210606) (generator bitmap2component) (layer "F.Cu")
(at 0 0)
(attr board_only exclude_from_pos_files exclude_from_bom)
(fp_text reference "G***" (at 0 0) (layer F.SilkS)
(effects (font (thickness 0.3)))
)
(fp_text value "LOGO" (at 0.75 0) (layer F.SilkS) hide
(effects (font (thickness 0.3)))
)
(fp_poly (pts (xy -5.809574 12.306478) (xy -5.729486 13.822467) (xy -5.732694 14.858207) (xy -5.893597 15.506035) (xy -6.086553 15.775612) (xy -6.591165 16.070198) (xy -7.225969 16.200962) (xy -7.793222 16.159216)
(xy -8.095181 15.936273) (xy -8.106383 15.864348) (xy -7.871926 15.605079) (xy -7.389675 15.526583) (xy -6.813549 15.411953) (xy -6.547067 15.171113) (xy -6.589593 14.925455) (xy -6.965089 14.977625)
(xy -7.602411 14.956130) (xy -8.080981 14.547559) (xy -8.334789 13.897245) (xy -8.318995 13.578192) (xy -7.516352 13.578192) (xy -7.500678 14.123443) (xy -7.207577 14.311429) (xy -7.025532 14.321277)
(xy -6.614279 14.220175) (xy -6.515173 13.814375) (xy -6.534711 13.578192) (xy -6.732329 13.007197) (xy -7.025532 12.835107) (xy -7.364811 13.076955) (xy -7.516352 13.578192) (xy -8.318995 13.578192)
(xy -8.297824 13.150521) (xy -8.038830 12.613625) (xy -7.481697 12.265838) (xy -6.755319 12.230111) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -9.335619 12.404966) (xy -9.241277 12.483830) (xy -9.027838 12.952701) (xy -8.920155 13.689278) (xy -8.917021 13.834894) (xy -8.969873 14.523848) (xy -9.175080 14.817313) (xy -9.435347 14.861703)
(xy -10.068754 14.919425) (xy -10.313538 14.975401) (xy -10.880786 14.991158) (xy -11.011170 14.952883) (xy -11.271357 14.607706) (xy -11.340024 14.208688) (xy -10.538298 14.208688) (xy -10.380787 14.504598)
(xy -10.056689 14.457413) (xy -9.789583 14.101729) (xy -9.907187 13.826091) (xy -10.110461 13.780852) (xy -10.482691 13.998414) (xy -10.538298 14.208688) (xy -11.340024 14.208688) (xy -11.348936 14.156898)
(xy -11.221939 13.645790) (xy -10.743268 13.382264) (xy -10.538298 13.335000) (xy -9.918621 13.124659) (xy -9.753045 12.891422) (xy -10.058850 12.727389) (xy -10.419139 12.700000) (xy -10.878875 12.614225)
(xy -10.943617 12.429788) (xy -10.531220 12.198719) (xy -9.904377 12.193329) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 1.468640 12.282655) (xy 1.771256 12.442131) (xy 2.027579 12.865002) (xy 2.158168 13.486129) (xy 2.163493 14.129390) (xy 2.044026 14.618663) (xy 1.800237 14.777826) (xy 1.765037 14.767307)
(xy 1.330233 14.770188) (xy 1.208664 14.873504) (xy 0.772549 15.100696) (xy 0.067553 14.952959) (xy -0.263638 14.603732) (xy -0.237456 14.098649) (xy -0.143505 13.946798) (xy 0.573083 13.946798)
(xy 0.639858 14.319869) (xy 0.713221 14.404002) (xy 1.050056 14.458649) (xy 1.323166 14.184775) (xy 1.351064 14.035117) (xy 1.131963 13.809459) (xy 0.945745 13.780852) (xy 0.573083 13.946798)
(xy -0.143505 13.946798) (xy 0.069030 13.603284) (xy 0.578749 13.283213) (xy 0.864681 13.240426) (xy 1.273407 13.108426) (xy 1.351064 12.953228) (xy 1.133693 12.753310) (xy 0.852056 12.750569)
(xy 0.414324 12.700546) (xy 0.300927 12.564894) (xy 0.461870 12.307919) (xy 0.924639 12.207700) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 4.578045 12.310041) (xy 4.854895 12.509816) (xy 4.692328 12.752291) (xy 4.338066 12.888085) (xy 3.926313 13.199485) (xy 3.736838 13.917821) (xy 3.730087 13.990305) (xy 3.582951 14.793710)
(xy 3.367443 15.098036) (xy 3.151178 14.927238) (xy 3.001769 14.305276) (xy 2.972340 13.721816) (xy 2.972340 12.266681) (xy 3.918085 12.239873) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 6.778295 12.349883) (xy 7.034213 12.599197) (xy 6.862276 12.891067) (xy 6.485106 13.048507) (xy 6.101008 13.293963) (xy 5.953876 13.856021) (xy 5.944681 14.160873) (xy 5.853534 14.828456)
(xy 5.633774 15.129721) (xy 5.365920 14.996523) (xy 5.242663 14.755012) (xy 5.168762 14.249804) (xy 5.173069 13.491225) (xy 5.183590 13.343207) (xy 5.281526 12.665500) (xy 5.521621 12.363033)
(xy 6.051576 12.270649) (xy 6.147340 12.265559) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 9.034598 12.282655) (xy 9.337214 12.442131) (xy 9.593537 12.865002) (xy 9.724125 13.486129) (xy 9.729450 14.129390) (xy 9.609983 14.618663) (xy 9.366195 14.777826) (xy 9.330994 14.767307)
(xy 8.896191 14.770188) (xy 8.774621 14.873504) (xy 8.362813 15.120251) (xy 7.825613 14.957788) (xy 7.547160 14.703946) (xy 7.365102 14.150306) (xy 7.465351 13.946798) (xy 8.139041 13.946798)
(xy 8.205815 14.319869) (xy 8.279179 14.404002) (xy 8.616014 14.458649) (xy 8.889123 14.184775) (xy 8.917021 14.035117) (xy 8.697921 13.809459) (xy 8.511702 13.780852) (xy 8.139041 13.946798)
(xy 7.465351 13.946798) (xy 7.620101 13.632651) (xy 8.223108 13.310557) (xy 8.336639 13.289186) (xy 8.797659 13.114762) (xy 8.917021 12.934435) (xy 8.699206 12.749920) (xy 8.418013 12.750569)
(xy 7.980281 12.700546) (xy 7.866884 12.564894) (xy 8.027827 12.307919) (xy 8.490596 12.207700) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 11.223113 12.334830) (xy 11.340318 12.918311) (xy 11.348936 13.260239) (xy 11.390215 13.966268) (xy 11.552083 14.257597) (xy 11.821809 14.271290) (xy 12.191186 13.983377) (xy 12.371049 13.252980)
(xy 12.378546 13.170626) (xy 12.504402 12.426077) (xy 12.678939 12.180640) (xy 12.847586 12.402953) (xy 12.955772 13.061656) (xy 12.970213 13.510639) (xy 12.904585 14.438297) (xy 12.708207 14.845200)
(xy 12.632447 14.865392) (xy 12.098087 14.935621) (xy 11.754255 15.014230) (xy 11.158536 14.985603) (xy 10.876064 14.821392) (xy 10.639961 14.346350) (xy 10.534951 13.653953) (xy 10.556245 12.932956)
(xy 10.699052 12.372113) (xy 10.943617 12.159575) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -17.173833 12.304212) (xy -17.049341 12.804981) (xy -17.023404 13.510639) (xy -17.066795 14.360273) (xy -17.217026 14.775247) (xy -17.428723 14.861703) (xy -17.683614 14.717066) (xy -17.808106 14.216297)
(xy -17.834042 13.510639) (xy -17.790651 12.661005) (xy -17.640421 12.246030) (xy -17.428723 12.159575) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -14.253723 12.280648) (xy -12.294681 12.294681) (xy -12.212322 13.578192) (xy -12.215356 14.388979) (xy -12.336785 14.819987) (xy -12.414982 14.861703) (xy -12.623131 14.628530) (xy -12.704138 14.118617)
(xy -12.789814 13.424790) (xy -12.944140 13.003148) (xy -13.273893 12.750357) (xy -13.568907 12.952489) (xy -13.753549 13.525588) (xy -13.780851 13.931905) (xy -13.889296 14.647146) (xy -14.140097 14.896286)
(xy -14.421454 14.690156) (xy -14.621566 14.039588) (xy -14.642731 13.848405) (xy -14.760417 13.196576) (xy -14.946987 12.851544) (xy -14.996808 12.835107) (xy -15.190411 13.074122) (xy -15.331462 13.666678)
(xy -15.350886 13.848405) (xy -15.511885 14.602368) (xy -15.821891 14.861696) (xy -15.823758 14.861703) (xy -16.076353 14.692905) (xy -16.195076 14.129247) (xy -16.212766 13.564159) (xy -16.212766 12.266615)
)(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -4.439476 12.402597) (xy -4.341639 13.023965) (xy -4.323404 13.510639) (xy -4.372009 14.281344) (xy -4.496282 14.770527) (xy -4.593617 14.861703) (xy -4.747758 14.618681) (xy -4.845595 13.997312)
(xy -4.863830 13.510639) (xy -4.815225 12.739934) (xy -4.690952 12.250751) (xy -4.593617 12.159575) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -1.558219 12.297522) (xy -1.029513 12.700549) (xy -0.819815 13.516719) (xy -0.810638 13.813938) (xy -0.918736 14.597876) (xy -1.168992 14.899940) (xy -1.450354 14.715687) (xy -1.651768 14.040678)
(xy -1.672518 13.848405) (xy -1.833291 13.090812) (xy -2.153172 12.835215) (xy -2.161702 12.835107) (xy -2.485031 13.080285) (xy -2.649080 13.827102) (xy -2.650886 13.848405) (xy -2.812598 14.607609)
(xy -3.133747 14.861668) (xy -3.138563 14.861703) (xy -3.387111 14.732895) (xy -3.479001 14.272368) (xy -3.460018 13.607769) (xy -3.384047 12.841399) (xy -3.211872 12.458611) (xy -2.828026 12.302905)
(xy -2.461826 12.254859) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 15.604787 12.273121) (xy 16.583130 12.315623) (xy 17.364863 12.404252) (xy 17.766489 12.514072) (xy 18.008171 12.904187) (xy 18.109767 13.535150) (xy 18.077097 14.204721) (xy 17.915981 14.710664)
(xy 17.698936 14.861703) (xy 17.396777 14.652858) (xy 17.293964 13.990137) (xy 17.293617 13.931905) (xy 17.225726 13.261609) (xy 17.059968 12.861435) (xy 17.036962 12.843486) (xy 16.736370 12.914107)
(xy 16.439495 13.345705) (xy 16.243085 13.966897) (xy 16.212766 14.303513) (xy 16.133594 14.793441) (xy 15.952498 14.841257) (xy 15.754103 14.512057) (xy 15.623036 13.870935) (xy 15.621099 13.848405)
(xy 15.460326 13.090812) (xy 15.140445 12.835215) (xy 15.131915 12.835107) (xy 14.808586 13.080285) (xy 14.644537 13.827102) (xy 14.642731 13.848405) (xy 14.481732 14.602368) (xy 14.171726 14.861696)
(xy 14.169859 14.861703) (xy 13.918003 14.693864) (xy 13.799093 14.132782) (xy 13.780851 13.555848) (xy 13.780851 12.249994) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -17.111890 11.518771) (xy -17.075195 11.598883) (xy -17.205632 11.845274) (xy -17.428723 11.889362) (xy -17.765022 11.752256) (xy -17.782252 11.598883) (xy -17.503289 11.319710) (xy -17.428723 11.308405)
)(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -4.352012 11.297824) (xy -4.323404 11.484043) (xy -4.489351 11.856705) (xy -4.862422 11.789930) (xy -4.946555 11.716566) (xy -5.001202 11.379732) (xy -4.727328 11.106622) (xy -4.577670 11.078724)
)(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 0.802786 11.284349) (xy 0.810638 11.348937) (xy 0.605013 11.611297) (xy 0.540426 11.619149) (xy 0.278065 11.413524) (xy 0.270213 11.348937) (xy 0.475838 11.086576) (xy 0.540426 11.078724)
)(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy 1.839932 11.219802) (xy 1.891489 11.348937) (xy 1.697550 11.611415) (xy 1.637224 11.619149) (xy 1.271265 11.422732) (xy 1.215958 11.348937) (xy 1.277215 11.117607) (xy 1.470223 11.078724)
)(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -11.879802 -7.219408) (xy -11.000893 -6.435002) (xy -10.976038 -6.402103) (xy -10.663723 -5.873220) (xy -10.505095 -5.268957) (xy -10.512271 -4.515409) (xy -10.697365 -3.538673) (xy -11.072491 -2.264844)
(xy -11.649765 -0.620019) (xy -12.136257 0.675532) (xy -12.698109 2.181309) (xy -13.198498 3.584810) (xy -13.600465 4.777491) (xy -13.867055 5.650810) (xy -13.952801 6.010770) (xy -13.953813 6.989903)
(xy -13.597470 7.613286) (xy -12.909735 7.836106) (xy -12.895288 7.836171) (xy -12.289744 7.607857) (xy -11.572007 7.001651) (xy -10.844473 6.135656) (xy -10.209539 5.127975) (xy -9.843047 4.315752)
(xy -9.497407 3.525315) (xy -9.139063 2.950875) (xy -8.838137 2.673094) (xy -8.664750 2.772636) (xy -8.646808 2.939687) (xy -8.797673 3.691597) (xy -9.191188 4.693194) (xy -9.738733 5.767173)
(xy -10.351691 6.736231) (xy -10.839532 7.326766) (xy -11.535285 7.958268) (xy -12.124064 8.271694) (xy -12.834934 8.372217) (xy -13.126105 8.376596) (xy -14.036729 8.297028) (xy -14.700454 7.985732)
(xy -15.152700 7.586744) (xy -15.551181 7.117653) (xy -15.799721 6.603713) (xy -15.889057 5.973830) (xy -15.809925 5.156910) (xy -15.553061 4.081861) (xy -15.109203 2.677590) (xy -14.469086 0.873004)
(xy -14.173168 0.069435) (xy -13.436784 -1.972062) (xy -12.913162 -3.570585) (xy -12.595599 -4.777017) (xy -12.477395 -5.642242) (xy -12.551846 -6.217143) (xy -12.812250 -6.552603) (xy -13.251904 -6.699506)
(xy -13.281090 -6.703119) (xy -14.112829 -6.544359) (xy -14.969389 -5.941809) (xy -15.765055 -4.980683) (xy -16.414111 -3.746192) (xy -16.512846 -3.490339) (xy -16.897085 -2.597840) (xy -17.261525 -2.033187)
(xy -17.483138 -1.891489) (xy -17.710503 -2.006401) (xy -17.714097 -2.391979) (xy -17.479195 -3.109486) (xy -16.991072 -4.220187) (xy -16.852863 -4.513659) (xy -16.024656 -5.860255) (xy -15.040184 -6.827605)
(xy -13.972510 -7.392232) (xy -12.894695 -7.530659) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -0.865404 -16.178192) (xy 1.310625 -16.151729) (xy 1.552563 -16.148444) (xy 4.061598 -16.106836) (xy 6.099634 -16.049957) (xy 7.736085 -15.966279) (xy 9.040366 -15.844273) (xy 10.081890 -15.672411)
(xy 10.930071 -15.439164) (xy 11.654323 -15.133004) (xy 12.324060 -14.742403) (xy 13.008696 -14.255830) (xy 13.025842 -14.242911) (xy 14.279005 -13.027256) (xy 15.044853 -11.613764) (xy 15.348834 -9.946630)
(xy 15.344899 -9.157371) (xy 15.221223 -7.950577) (xy 14.951078 -7.038653) (xy 14.515997 -6.256509) (xy 13.590275 -5.255069) (xy 12.301133 -4.394850) (xy 10.824640 -3.785224) (xy 10.335638 -3.659695)
(xy 9.740156 -3.466596) (xy 9.460471 -3.249184) (xy 9.457447 -3.228483) (xy 9.609238 -2.878636) (xy 10.023879 -2.184092) (xy 10.640270 -1.232724) (xy 11.397313 -0.112405) (xy 12.233908 1.088991)
(xy 13.088957 2.283590) (xy 13.901360 3.383521) (xy 14.610019 4.300910) (xy 15.104811 4.893607) (xy 15.889661 5.693737) (xy 16.667156 6.357780) (xy 17.274174 6.747007) (xy 17.294064 6.755505)
(xy 17.902779 7.142055) (xy 18.045504 7.536366) (xy 17.942581 7.717623) (xy 17.659427 7.841324) (xy 17.111117 7.917847) (xy 16.212727 7.957568) (xy 14.879332 7.970865) (xy 14.486265 7.971277)
(xy 11.010783 7.971277) (xy 7.541678 2.567022) (xy 6.402170 0.804885) (xy 5.505579 -0.546730) (xy 4.813420 -1.538682) (xy 4.287204 -2.221830) (xy 3.888446 -2.647033) (xy 3.633366 -2.826629)
(xy 5.781379 -2.826629) (xy 5.860135 -2.512895) (xy 6.116685 -1.991045) (xy 6.581246 -1.198879) (xy 7.284035 -0.074194) (xy 8.167648 1.308710) (xy 9.291103 3.064292) (xy 10.162528 4.421240)
(xy 10.829918 5.430415) (xy 11.341265 6.142678) (xy 11.744564 6.608890) (xy 12.087806 6.879912) (xy 12.418986 7.006606) (xy 12.786098 7.039833) (xy 13.237133 7.030454) (xy 13.562124 7.025532)
(xy 14.451808 7.013264) (xy 14.895574 6.952960) (xy 14.987780 6.809367) (xy 14.827235 6.552901) (xy 14.472366 6.108682) (xy 13.899929 5.400216) (xy 13.240426 4.588955) (xy 12.622143 3.779777)
(xy 11.818942 2.655863) (xy 10.931415 1.361327) (xy 10.060156 0.040284) (xy 9.997872 -0.056466) (xy 9.129935 -1.385024) (xy 8.466318 -2.310486) (xy 7.930315 -2.891368) (xy 7.445221 -3.186186)
(xy 6.934332 -3.253455) (xy 6.320943 -3.151691) (xy 6.036388 -3.078558) (xy 5.850202 -2.994450) (xy 5.781379 -2.826629) (xy 3.633366 -2.826629) (xy 3.578658 -2.865148) (xy 3.387350 -2.922735)
(xy 2.702128 -3.008236) (xy 2.702128 1.720226) (xy 2.698978 3.442341) (xy 2.709159 4.701813) (xy 2.762118 5.576185) (xy 2.887300 6.143000) (xy 3.114152 6.479800) (xy 3.472121 6.664127)
(xy 3.990653 6.773525) (xy 4.661170 6.879076) (xy 5.366975 7.074801) (xy 5.651912 7.393815) (xy 5.674468 7.578202) (xy 5.652287 7.750372) (xy 5.541504 7.880422) (xy 5.275764 7.974248)
(xy 4.788711 8.037744) (xy 4.013987 8.076807) (xy 2.885237 8.097333) (xy 1.336103 8.105216) (xy -0.270213 8.106383) (xy -2.211316 8.103843) (xy -3.678014 8.092585) (xy -4.736319 8.067158)
(xy -5.452240 8.022107) (xy -5.891790 7.951978) (xy -6.120978 7.851319) (xy -6.205816 7.714676) (xy -6.214894 7.615269) (xy -6.085856 7.291636) (xy -5.626642 7.058892) (xy -5.478962 7.025686)
(xy -2.026596 7.025686) (xy -0.270213 7.025649) (xy 1.486170 7.025613) (xy 1.486170 -4.253967) (xy 2.702128 -4.253967) (xy 4.841048 -4.377787) (xy 6.284102 -4.528872) (xy 7.317469 -4.783389)
(xy 7.674518 -4.956694) (xy 8.409670 -5.540630) (xy 8.893146 -6.225029) (xy 9.170078 -7.130781) (xy 9.285601 -8.378777) (xy 9.296465 -9.301084) (xy 9.176865 -11.242447) (xy 8.822169 -12.723579)
(xy 8.202208 -13.784308) (xy 7.527434 -14.285682) (xy 9.572326 -14.285682) (xy 9.607280 -14.100005) (xy 10.099562 -12.807344) (xy 10.380089 -11.646544) (xy 10.499371 -10.359144) (xy 10.514577 -9.457446)
(xy 10.463785 -8.139073) (xy 10.327134 -6.947805) (xy 10.128208 -6.088233) (xy 10.125187 -6.079787) (xy 9.885158 -5.401584) (xy 9.745649 -4.984356) (xy 9.731728 -4.931383) (xy 9.945985 -4.860959)
(xy 10.540750 -5.003294) (xy 11.290062 -5.283483) (xy 12.669947 -6.101309) (xy 13.606064 -7.222604) (xy 14.050977 -8.376233) (xy 14.215447 -9.897687) (xy 13.901110 -11.217573) (xy 13.082581 -12.413963)
(xy 12.580016 -12.900450) (xy 11.803826 -13.501074) (xy 11.013909 -13.980686) (xy 10.311317 -14.298509) (xy 9.797105 -14.413767) (xy 9.572326 -14.285682) (xy 7.527434 -14.285682) (xy 7.286817 -14.464466)
(xy 6.045830 -14.803884) (xy 5.085790 -14.860692) (xy 4.296880 -14.849986) (xy 3.704628 -14.771526) (xy 3.280843 -14.557569) (xy 2.997329 -14.140370) (xy 2.825895 -13.452187) (xy 2.738345 -12.425275)
(xy 2.706487 -10.991892) (xy 2.702128 -9.133214) (xy 2.702128 -4.253967) (xy 1.486170 -4.253967) (xy 1.486170 -14.861609) (xy -2.026596 -14.861495) (xy -2.026596 7.025686) (xy -5.478962 7.025686)
(xy -4.796277 6.872184) (xy -3.377660 6.620213) (xy -3.377660 -14.726595) (xy -4.649813 -14.872862) (xy -5.586150 -15.018010) (xy -6.070190 -15.217171) (xy -6.190053 -15.527025) (xy -6.114330 -15.814868)
(xy -6.018969 -15.943608) (xy -5.804292 -16.042436) (xy -5.410991 -16.113931) (xy -4.779759 -16.160673) (xy -3.851289 -16.185244) (xy -2.566273 -16.190224) )(layer F.SilkS) (width 0.000000)
)
(fp_poly (pts (xy -9.279514 -14.768494) (xy -8.980382 -14.207474) (xy -9.071705 -13.513341) (xy -9.440831 -12.986828) (xy -10.172058 -12.534185) (xy -10.952776 -12.469617) (xy -11.591752 -12.804955) (xy -11.632547 -12.851250)
(xy -11.839994 -13.470377) (xy -11.651206 -14.165992) (xy -11.144230 -14.755517) (xy -10.721884 -14.981618) (xy -9.887286 -15.069008) )(layer F.SilkS) (width 0.000000)
)
)

File diff suppressed because it is too large Load Diff

View File

@ -1,77 +0,0 @@
{
"board": {
"active_layer": 2,
"active_layer_preset": "",
"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
},
"ratsnest_display_mode": 0,
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": true,
"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,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
32,
33,
34,
35,
36
],
"visible_layers": "ffffffe_ffffffff",
"zone_display_mode": 0
},
"meta": {
"filename": "numpad.kicad_prl",
"version": 3
},
"project": {
"files": []
}
}

View File

@ -1,493 +0,0 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"board_outline_line_width": 0.09999999999999999,
"copper_line_width": 0.19999999999999998,
"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.049999999999999996,
"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.09999999999999999,
"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.15,
"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.15,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.15,
"silk_text_upright": false,
"zones": {
"45_degree_only": false,
"min_clearance": 0.508
}
},
"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_type_mismatch": "error",
"hole_clearance": "error",
"hole_near_hole": "error",
"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": "error",
"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": {
"allow_blind_buried_vias": false,
"allow_microvias": false,
"max_error": 0.005,
"min_clearance": 0.0,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.0,
"min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.19999999999999998,
"min_microvia_drill": 0.09999999999999999,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0,
"min_text_height": 0.7999999999999999,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.19999999999999998,
"min_via_annular_width": 0.049999999999999996,
"min_via_diameter": 0.39999999999999997,
"solder_mask_clearance": 0.0,
"solder_mask_min_width": 0.0,
"solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true
},
"teardrop_options": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 5,
"td_on_pad_in_zone": false,
"td_onpadsmd": true,
"td_onroundshapesonly": false,
"td_ontrackend": false,
"td_onviapad": true
}
],
"teardrop_parameters": [
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [
0.0,
2.0
],
"via_dimensions": [
{
"diameter": 0.0,
"drill": 0.0
}
],
"zones_allow_external_fillets": false,
"zones_use_no_outline": true
},
"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_label_syntax": "error",
"bus_to_bus_conflict": "error",
"bus_to_net_conflict": "error",
"different_unit_footprint": "error",
"different_unit_net": "error",
"duplicate_reference": "error",
"duplicate_sheet_names": "error",
"extra_units": "error",
"global_label_dangling": "warning",
"hier_label_mismatch": "error",
"label_dangling": "error",
"lib_symbol_issues": "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",
"unannotated": "error",
"unit_value_mismatch": "error",
"unresolved_variable": "error",
"wire_dangling": "error"
}
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "numpad.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.25,
"via_diameter": 0.8,
"via_drill": 0.4,
"wire_width": 6
}
],
"meta": {
"version": 3
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "",
"specctra_dsn": "",
"step": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"annotate_start_num": 0,
"drawing": {
"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,
"pin_symbol_size": 25.0,
"text_offset_ratio": 0.15
},
"legacy_lib_dir": "",
"legacy_lib_list": [],
"meta": {
"version": 1
},
"net_format_name": "",
"ngspice": {
"fix_include_paths": true,
"fix_passive_vals": false,
"meta": {
"version": 0
},
"model_mode": 0,
"workbook_filename": ""
},
"page_layout_descr_file": "",
"plot_directory": "",
"spice_adjust_passive_values": false,
"spice_external_command": "spice \"%I\"",
"subpart_first_id": 65,
"subpart_id_separator": 0
},
"sheets": [
[
"b885208e-2cfd-4660-8aac-5c090f21b8df",
""
]
],
"text_variables": {}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,41 +0,0 @@
# Hackpad
## Overview
The `Hackpad` is a 4x4 numpad/macropad designed for the Arduino Day 2023 in cooperation with the hackspace [Imaginärraum e.V.](imaginaerraum.de) and [Fablab-Bayreuth e.V.](fablab-bayreuth.de).
It supports 16 MX-style switches, an EC-11 rotary encoder, and per key RGB LEDs based on SK6812.
## Hardware Revisions
In v0.2 all necessary components are through hole components (except for an optional reset switch and RGB-LEDs), but the ProMicro protrudes out of the case.
In v0.3 this is fixed by moving some diodes to the bottom side. The bottom diodes however are SMD only.
## Installing Firmware
We support two kinds of firmware: low level [Arduino firmware](firmware_arduino), and the higher level [QMK firmware](firmware_qmk).
### Arduino Firmware
This firmware is mostly for educational purposes.
Its low level code shows how keyboard firmware works on the electronical/physical level. There is a very [basic version](firmware_arduino/hackpad_simple/hackpad_simple.ino) that only includes the bare minimum to understand the keyboard matrix. The more [advanced version](firmware_arduino/hackpad/hackpad.ino) also includes functionality like debouncing.
### QMK Firmware
[QMK](https://qmk.fm) ([TLA](https://en.wikipedia.org/wiki/Three-letter_acronym) for Quantum Mechanical Keyboard) is an open source community centered around developing computer input devices. It provides a very comprehensive firmware library, which can be customized to different keyboard hardware and layouts without the need to write own code.
#### Installing and locating QMK on your Computer
With QMK it is simple to define custom layouts and up to 32 layers.
Follow the instructions to [install](https://docs.qmk.fm/#/newbs_getting_started) QMK on your computer.
After you've installed QMK there exists a directory `qmk_firmware` in your home directory.
Under Linux, the path is `~/qmk_firmware`, while under Windows should be `C:\\users\your_username\qmk_firmware`.
#### Adding support for the hackpad
The QMK version from the official website, does not yet include the software definitions for the `hackpad`-keyboard, so we need to add it manually.
For this you need to copy the directory `hackpad` found at [firmware_qmk/hackpad](firmware_qmk) into the `keyboards` directory in the `qmk_firmware` you have downloaded earlier.
You can get a copy of the `hackpad` directory by downloading this repository and extracting it.
Keep in mind that there are multiple directories called `hackpad` in this repository, i.e. the repository itself, one in the subdirectory `firmware_arduino` and one in the subdirectory `firmware_qmk`.
You need to copy the `hackpad` directory of the subdirectory `firmware_qmk` into the `keyboards` directory of your `qmk_firmware` directory, to enable support for the hackpad keyboard in QMK.
Notice the difference between the directories `qmk_firmware` and `firmware_qmk`.
Once you have completed the previous steps, you should be able to compile your first firmware by typing `qmk compile -kb hackpad -km default` into the command line interface provided by QMK.
#### Editing the layout
You can find instructions on how to change you keymap in the [QMK documentation](https://docs.qmk.fm/#/newbs_building_firmware).
You can find an exhaustive list of keycodes in the [Keycodes overview of QMK](https://docs.qmk.fm/#/keycodes).
#### Flashing the firmware
After you have made your changes to the keymap you need to upload the firmware to the keyboard.
This is done by running `qmk flash -kb hackpad -km "your keymap name"`, where `"your keymap name"` is the name of the subdirectory in the `keymaps` directory which you want to upload to the keyboard.
# Support
If you have any questions regarding this keyboard feel free to contact me via [matrix](https://matrix.org/) in the [hackpad support room](#hackpad:ncxy.de), via [e-mail](mailto:n-hackpad@ncxy.de), or visit me at the hackspace [Imaginärraum e.V.](imaginaerraum.de)
![hackpad](assets/pic.jpg)