Skip to content

Krishveer's Hackboard #682

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
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
17 changes: 17 additions & 0 deletions hackboards/poler1_KB/BOM.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
BOM for poler1_KB

1. PCB in black color
2. Orpheus Pico
3. 68 Gateron Jupiter Red Switches
4. 68 Keycaps
5. 83 SK6812 MINI-E LEDs
6. 4 M3x16mm screws
7. 4 M3 hex nuts
8. 68 Through-hole 1N4148 Diodes
9. 68 Kailh Hotswap Sockets
10. Stabilizers for Keys
11. 0.91 inch OLED display
12. EC11 Rotary encoder
13. 4 M3 spacers

Estimated Total for parts(excluding PCB) is roughly around 75$
51 changes: 51 additions & 0 deletions hackboards/poler1_KB/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# poler1_KB

- This is a keyboard totally built from scratch and has anti ghosting 68 switches with a bunch of RGB and a display controlled by a knob.

---

## Inspiration

My inspiration for this keyboard is the wooting keyboard but due to my amateur routing techniques i had to come up with a slightly bigger keyboard than the original wooting keyboard but in return I added a display and a knob to show animations and probably change animations shown on the display.

## Challenges

I have no clue how I have managed to build the case for it. It was extremely challenging because I dont have the physical board to measure. I managed to build a really simple design which protects the base of PCB and also avoid the damage incase of a drop lol.

## Specifications

### BOM

1. PCB in black color
2. Orpheus Pico
3. 68 Gateron Jupiter Red Switches
4. 68 Keycaps
5. 83 SK6812 MINI-E LEDs
6. 4 M3x16mm screws
7. 4 M3 hex nuts
8. 68 Through-hole 1N4148 Diodes
9. 68 Kailh Hotswap Sockets
10. Stabilizers for Keys
11. 0.91 inch OLED display
12. EC11 Rotary encoder
13. 4 M3 spacers

Estimated Total for parts(excluding PCB) is roughly around 75$

### Others

- PCB Color: Black
- KMK Firmware
- Base.stl

### Top View

![Top Preview](cad/top_view.png)

### Bottom View

![Bottom Preview](cad/bottom_view.png)

| Schematic | PCB | Case |
| :--------------------------------------: | :----------------------: | :--------------------------------: |
| ![image](assets/schematics-combined.jpg) | ![image](assets/pcb.png) | ![image](assets/combined_case.jpg) |
Binary file added hackboards/poler1_KB/assets/combined_case.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added hackboards/poler1_KB/assets/pcb.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added hackboards/poler1_KB/cad/bottom_view.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
163,194 changes: 163,194 additions & 0 deletions hackboards/poler1_KB/cad/case.step

Large diffs are not rendered by default.

Binary file added hackboards/poler1_KB/cad/top_view.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
67 changes: 67 additions & 0 deletions hackboards/poler1_KB/firmware/KMK/firmware.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
from kmk.kmk_keyboard import KMKKeyboard
from kmk.scanners.keypad import MatrixScanner
from kmk.handlers.stock import simple_key_sequence
from kmk.modules.encoder import EncoderHandler
from kmk.modules.rgb import RGB
import board
import digitalio
import neopixel
import busio
import adafruit_ssd1306
from kmk.keys import KC

keyboard = KMKKeyboard()

keyboard.matrix = MatrixScanner(
columns=(board.GP5, board.GP6, board.GP7, board.GP8, board.GP9, board.GP10, board.GP11,
board.GP12, board.GP13, board.GP14, board.GP15, board.GP16, board.GP17, board.GP18, board.GP19),
rows=(board.GP0, board.GP1, board.GP2, board.GP3, board.GP4),
)

i2c = busio.I2C(board.GP20, board.GP21)
display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c)
display.fill(0)
display.text("Hello", 40, 10, 1)
display.show()

num_pixels = 83
pixels = neopixel.NeoPixel(board.GP22, num_pixels, brightness=0.3, auto_write=False)

def rainbow_cycle(wait):
for j in range(256):
for i in range(num_pixels):
pixel_index = (i * 256 // num_pixels) + j
pixels[i] = wheel(pixel_index & 255)
pixels.show()

def wheel(pos):
if pos < 85:
return (pos * 3, 255 - pos * 3, 0)
elif pos < 170:
pos -= 85
return (255 - pos * 3, 0, pos * 3)
else:
pos -= 170
return (0, pos * 3, 255 - pos * 3)

rainbow_cycle(0.01)

encoder_handler = EncoderHandler()
keyboard.modules.append(encoder_handler)

def mute_toggle():
keyboard.send_key_sequence(simple_key_sequence("MUTE"))

encoder_handler.pins = ((board.GP26, board.GP27, board.GP28),)
encoder_handler.tap_time = 150
encoder_handler.set_encoder_switch_handler(0, mute_toggle)

keyboard.keymap = [
[KC.ESC, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC],
[KC.TAB, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.ENTER],
[KC.LSHIFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMMA, KC.DOT, KC.RSHIFT],
[KC.LCTRL, KC.LALT, KC.SPACE, KC.RALT, KC.RCTRL]
]

if __name__ == "__main__":
keyboard.go()
2,271 changes: 2,271 additions & 0 deletions hackboards/poler1_KB/pcb/PCB_PCB_Krishveer's-HackBoard_2025-03-21.json

Large diffs are not rendered by default.

858 changes: 858 additions & 0 deletions hackboards/poler1_KB/pcb/SCH_Krishveer's-HackBoard_2025-03-21.json

Large diffs are not rendered by default.

Binary file not shown.
Binary file added hackboards/poler1_KB/production/case/base.stl
Binary file not shown.
Binary file added hackboards/poler1_KB/production/case/top.stl
Binary file not shown.
67 changes: 67 additions & 0 deletions hackboards/poler1_KB/production/firmware.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
from kmk.kmk_keyboard import KMKKeyboard
from kmk.scanners.keypad import MatrixScanner
from kmk.handlers.stock import simple_key_sequence
from kmk.modules.encoder import EncoderHandler
from kmk.modules.rgb import RGB
import board
import digitalio
import neopixel
import busio
import adafruit_ssd1306
from kmk.keys import KC

keyboard = KMKKeyboard()

keyboard.matrix = MatrixScanner(
columns=(board.GP5, board.GP6, board.GP7, board.GP8, board.GP9, board.GP10, board.GP11,
board.GP12, board.GP13, board.GP14, board.GP15, board.GP16, board.GP17, board.GP18, board.GP19),
rows=(board.GP0, board.GP1, board.GP2, board.GP3, board.GP4),
)

i2c = busio.I2C(board.GP20, board.GP21)
display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c)
display.fill(0)
display.text("Hello", 40, 10, 1)
display.show()

num_pixels = 83
pixels = neopixel.NeoPixel(board.GP22, num_pixels, brightness=0.3, auto_write=False)

def rainbow_cycle(wait):
for j in range(256):
for i in range(num_pixels):
pixel_index = (i * 256 // num_pixels) + j
pixels[i] = wheel(pixel_index & 255)
pixels.show()

def wheel(pos):
if pos < 85:
return (pos * 3, 255 - pos * 3, 0)
elif pos < 170:
pos -= 85
return (255 - pos * 3, 0, pos * 3)
else:
pos -= 170
return (0, pos * 3, 255 - pos * 3)

rainbow_cycle(0.01)

encoder_handler = EncoderHandler()
keyboard.modules.append(encoder_handler)

def mute_toggle():
keyboard.send_key_sequence(simple_key_sequence("MUTE"))

encoder_handler.pins = ((board.GP26, board.GP27, board.GP28),)
encoder_handler.tap_time = 150
encoder_handler.set_encoder_switch_handler(0, mute_toggle)

keyboard.keymap = [
[KC.ESC, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC],
[KC.TAB, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.ENTER],
[KC.LSHIFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMMA, KC.DOT, KC.RSHIFT],
[KC.LCTRL, KC.LALT, KC.SPACE, KC.RALT, KC.RCTRL]
]

if __name__ == "__main__":
keyboard.go()
Loading