From 9749bf8f25e6112365a4480e490da6303d86d6be Mon Sep 17 00:00:00 2001 From: binaryDiv Date: Sat, 28 Sep 2024 15:47:29 +0200 Subject: [PATCH 1/3] Add QMK firmware for rev1 --- Makefile | 54 +++ README.md | 33 +- layouts/eepyboard-v1-0.json | 339 ++++++++++++++++++ layouts/keyboard-layout-wip.json | 328 ----------------- .../binarydiv/eepyboard/rev1/README.md | 3 + .../binarydiv/eepyboard/rev1/config.h | 7 + .../binarydiv/eepyboard/rev1/info.json | 213 +++++++++++ .../eepyboard/rev1/keymaps/default/keymap.c | 85 +++++ .../binarydiv/eepyboard/rev1/rules.mk | 9 + 9 files changed, 742 insertions(+), 329 deletions(-) create mode 100644 Makefile create mode 100644 layouts/eepyboard-v1-0.json delete mode 100644 layouts/keyboard-layout-wip.json create mode 100644 qmk_keyboards/binarydiv/eepyboard/rev1/README.md create mode 100644 qmk_keyboards/binarydiv/eepyboard/rev1/config.h create mode 100644 qmk_keyboards/binarydiv/eepyboard/rev1/info.json create mode 100644 qmk_keyboards/binarydiv/eepyboard/rev1/keymaps/default/keymap.c create mode 100644 qmk_keyboards/binarydiv/eepyboard/rev1/rules.mk diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..67fe937 --- /dev/null +++ b/Makefile @@ -0,0 +1,54 @@ +# Set QMK_HOME in your environment variables to adjust the path of the firmware +QMK_HOME ?= ${HOME}/qmk_firmware + +# QMK keyboard information (author, keyboard, revision) +QMK_KEYBOARD_AUTHOR := binarydiv +QMK_KEYBOARD_NAME := eepyboard +QMK_KEYBOARD_REV ?= rev1 + +# Directory structure for QMK keyboard files +QMK_KEYBOARD_AUTHOR_DIR := ${QMK_KEYBOARD_AUTHOR} +QMK_KEYBOARD_BASE_DIR := ${QMK_KEYBOARD_AUTHOR}/${QMK_KEYBOARD_NAME} +QMK_KEYBOARD_REV_DIR := ${QMK_KEYBOARD_AUTHOR}/${QMK_KEYBOARD_NAME}/${QMK_KEYBOARD_REV} + +# Keymap to use when compiling QMK firmware +QMK_KEYMAP ?= default + +# Set default make target +.DEFAULT_GOAL := qmk-compile + + +# -- QMK commands + +# Prerequisite: Check if QMK is installed +.PHONY: _qmk-check-firmware-installed +_qmk-check-firmware-installed: + @test -d "${QMK_HOME}" || { \ + echo "QMK firmware not found! (QMK_HOME=${QMK_HOME})"; \ + echo "Please install QMK using 'qmk setup' first or set QMK_HOME in environment."; \ + exit 1; \ + } + +# Create symlink in QMK firmware directory to the keyboard files in qmk_keyboards/ +.PHONY: _qmk-create-symlink +_qmk-create-symlink: _qmk-check-firmware-installed ${QMK_HOME}/keyboards/${QMK_KEYBOARD_BASE_DIR} + +# Only create symlink if it doesn't exist already +${QMK_HOME}/keyboards/${QMK_KEYBOARD_BASE_DIR}: + mkdir -p "${QMK_HOME}/keyboards/${QMK_KEYBOARD_AUTHOR_DIR}" + ln -s "$$(realpath qmk_keyboards/${QMK_KEYBOARD_BASE_DIR})" "${QMK_HOME}/keyboards/${QMK_KEYBOARD_BASE_DIR}" + +# Compile QMK firmware +.PHONY: qmk-compile +qmk-compile: _qmk-create-symlink + qmk compile -kb ${QMK_KEYBOARD_REV_DIR} -km ${QMK_KEYMAP} + +# Compile and flash QMK firmware to keyboard +.PHONY: qmk-flash +qmk-flash: _qmk-create-symlink + qmk flash -kb ${QMK_KEYBOARD_REV_DIR} -km ${QMK_KEYMAP} + +# Run "qmk config" to set this keyboard as the default (to simplify running qmk commands manually) +.PHONY: qmk-activate +qmk-activate: _qmk-create-symlink + qmk config user.keyboard=${QMK_KEYBOARD_REV_DIR} user.keymap=${QMK_KEYMAP} diff --git a/README.md b/README.md index b7815a2..6af5de2 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,14 @@ Custom ergonomic mechanical keyboard with low-profile (Choc) switches. +## Versions + +- **eepyBoard v1.0: Hardware revision 1** + - Mostly ortholinear layout with 13 columns + - Bottom row: two regular keys + four thumb keys (per side, symmetrical) + - Partial F-key row (Esc, F1-F8) and rotary encoder + - RP2040 controller board in upper right corner + ## Repository structure - `/layouts`: Keyboard layouts created with the [Keyboard Layout Editor](http://www.keyboard-layout-editor.com) @@ -78,7 +86,30 @@ Now you can generate the gerber, drill and map files. ### Compile and flash QMK firmware -TODO: Add this when building the firmware +To compile the QMK firmware, you first need the `qmk` CLI and a local copy of the QMK firmware. + +1. [Install](https://docs.qmk.fm/#/cli) the `qmk` CLI using your favorite package manager. +2. Run `qmk setup` to clone a local copy of the QMK firmware. (By default in `~/qmk_firmware`, feel free to adjust.) + +The firmware for this keyboard is compiled using the local copy of QMK and the keyboard definitions in `qmk_keyboards` +which are automatically symlinked to your installed QMK firmware directory (defaults to `~/qmk_firmware`, can be +overridden by setting `QMK_HOME` in your environment). A Makefile is provided to simplify compiling and flashing. + +To compile and flash the firmware, run `make qmk-flash`. + +After compiling the firmware, you will be asked to put your keyboard into bootloader mode. This can be done in multiple +ways: + +- Hold the BOOTSEL button on the controller board while pressing the reset button (or while plugging in the cable). +- Hold the Escape key while pressing the reset button / plugging in the cable. +- Press the key combination that is mapped to the `QK_BOOTLOADER` keycode (currently Fn + Right Ctrl). + +The RP2040 uses UF2 as the default bootloader. This bootloader works by emulating a USB storage device that the firmware +file can be copied on. After putting the RP2040 into bootloader mode, you need to mount the USB storage device (doesn't +matter where). For convenience, it is recommended to enable auto-mounting in your system, e.g. using `udiskie`. + +You can also run `make qmk-activate` which will run `qmk config` to set `user.keyboard` and `user.keymap` to this +keyboard. This allows you to use the `qmk` CLI directly without specifying the keyboard and keymap everytime. ## Used software diff --git a/layouts/eepyboard-v1-0.json b/layouts/eepyboard-v1-0.json new file mode 100644 index 0000000..43495b8 --- /dev/null +++ b/layouts/eepyboard-v1-0.json @@ -0,0 +1,339 @@ +[ + { + "name": "eepyBoard v1.0", + "author": "binaryDiv" + }, + [ + { + "t": "#000000\n\n\n#cc00ff\n\n\n\n\n\n#ff0000", + "fa": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + "Esc\n\n\nStopRec", + { + "x": 0.25, + "fa": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 2 + ] + }, + "F1\n\n\nRecord1\n\n\n\n\n\nMacro1", + "F2\n\n\nRecord2\n\n\n\n\n\nMacro2", + "F3", + "F4", + { + "x": 0.25 + }, + "F5", + "F6", + "F7", + "F8\n\n\n\n\n\n\n\n\nPrtScr", + { + "x": 2, + "c": "#ffffff", + "w": 1.125, + "h": 1.125 + }, + "Vol -/+\n\n\nRGB brightness\n\n\n\n\n\nScroll ↑ ↓" + ], + [ + { + "y": 0.25, + "c": "#cccccc" + }, + "~\n`\n\n\n\n\n\n\n\nEsc", + "!\n1\n\n\n\n\n\n\n\nF1", + "@\n2\n\n\n\n\n\n\n\nF2", + "#\n3\n\n\n\n\n\n\n\nF3", + "$\n4\n\n\n\n\n\n\n\nF4", + "%\n5\n\n\n\n\n\n\n\nF5", + "^\n6\n\n\n\n\n\n\n\nF6", + "&\n7\n\n\n\n\n\n\n\nF7", + "*\n8\n\n\n\n\n\n\n\nF8", + "(\n9\n\n\n\n\n\n\n\nF9", + ")\n0\n\n\n\n\n\n\n\nF10", + "_\n-\n\nRGB mode\n\n\n\n\n\nF11", + "+\n=\n\nRGB toggle\n\n\n\n\n\nF12" + ], + [ + "Tab", + "Q\n\n\n\n\n\n\n\n\nHome", + { + "fa": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + "W\n\n\n\n\n\n\n\n\n↑", + { + "fa": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 2 + ] + }, + "E\n\n\n\n\n\n\n\n\nEnd", + "R\n\n\n\n\n\n\n\n\nPgUp", + "T", + "Y", + { + "fa": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + "U\n\n\n\n\n\n\n\n\n_", + "I\n\n\n\n\n\n\n\n\n=", + "O\n\n\n\n\n\n\n\n\n[", + "P\n\n\n\n\n\n\n\n\n]", + "{\n[\n\nRGB speed -", + "}\n]\n\nRGB speed +" + ], + [ + "Esc", + "A\n\n\n\n\n\n\n\n\n←", + "S\n\n\n\n\n\n\n\n\n↓", + "D\n\n\n\n\n\n\n\n\n→", + { + "fa": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 2 + ] + }, + "F\n\n\n\n\n\n\n\n\nPgDn", + "G", + "H", + { + "fa": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + "J\n\n\n\n\n\n\n\n\n-", + "K\n\n\n\n\n\n\n\n\n+", + "L\n\n\n\n\n\n\n\n\n{", + ":\n;\n\n\n\n\n\n\n\n}", + "\"\n'", + "|\n\\" + ], + [ + "Shift", + { + "fa": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 2 + ] + }, + "Home\n\n\n\n\n\n\n\n\nCtrl ←", + { + "fa": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ] + }, + "Z\n\n\n\n\n\n\n\n\nSelect Word", + { + "fa": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 2 + ] + }, + "X\n\n\n\n\n\n\n\n\nCtrl →", + "C\n\n\n\n\n\n\n\n\nEnter", + "V", + "B", + "N", + "M", + "<\n,", + ">\n.", + "?\n/\n\nClear eeprom", + "Shift\n\n\nReboot" + ], + [ + "Ctrl", + "End", + { + "x": 9, + "t": "#cc00ff\n\n\n#cc00ff\n\n\n\n\n\n#ff0000" + }, + "Fn", + { + "t": "#000000\n\n\n#cc00ff\n\n\n\n\n\n#ff0000" + }, + "Ctrl\n\n\nBoot loader" + ], + [ + { + "r": 6, + "rx": 1.5, + "ry": 16, + "y": -10.75, + "x": -0.5 + }, + "Super" + ], + [ + { + "r": 12, + "y": -1, + "x": -0.5, + "t": "#ff0000\n\n\n#cc00ff\n\n\n\n\n\n#ff0000" + }, + "Move" + ], + [ + { + "r": 18, + "y": -1, + "x": -0.5, + "t": "#000000\n\n\n#cc00ff\n\n\n\n\n\n#ff0000" + }, + "Bksp" + ], + [ + { + "r": 24, + "y": -1, + "x": -0.5, + "fa": [ + 2, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 2 + ] + }, + "Space" + ], + [ + { + "r": -24, + "rx": 11.5, + "y": -10.75, + "x": -0.5, + "fa": [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 2 + ] + }, + "Bksp" + ], + [ + { + "r": -18, + "y": -1, + "x": -0.5 + }, + "Enter" + ], + [ + { + "r": -12, + "y": -1, + "x": -0.5 + }, + "AltGr" + ], + [ + { + "r": -6, + "y": -1, + "x": -0.5 + }, + "Del" + ] +] \ No newline at end of file diff --git a/layouts/keyboard-layout-wip.json b/layouts/keyboard-layout-wip.json deleted file mode 100644 index c55aed2..0000000 --- a/layouts/keyboard-layout-wip.json +++ /dev/null @@ -1,328 +0,0 @@ -[ - [ - { - "x": 1, - "t": "#000000\n\n\n\n\n\n\n\n\n#ff0000", - "fa": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 2 - ] - }, - "!\n1\n\n\n\n\n\n\n\nF1", - "@\n2\n\n\n\n\n\n\n\nF2", - "#\n3\n\n\n\n\n\n\n\nF3", - { - "x": 6 - }, - "*\n8\n\n\n\n\n\n\n\nF8", - "(\n9\n\n\n\n\n\n\n\nF9", - ")\n0\n\n\n\n\n\n\n\nF10" - ], - [ - { - "y": -0.75 - }, - "~\n`\n\n\n\n\n\n\n\nEsc", - { - "x": 3 - }, - "$\n4\n\n\n\n\n\n\n\nF4", - { - "x": 4 - }, - "&\n7\n\n\n\n\n\n\n\nF7", - { - "x": 3 - }, - "_\n-\n\n\n\n\n\n\n\nF11" - ], - [ - { - "y": -0.75, - "x": 5 - }, - "%\n5\n\n\n\n\n\n\n\nF5", - { - "x": 2 - }, - "^\n6\n\n\n\n\n\n\n\nF6" - ], - [ - { - "y": -0.5, - "x": 1 - }, - "Q\n\n\n\n\n\n\n\n\nM left", - "W\n\n\n\n\n\n\n\n\nM↑", - "E\n\n\n\n\n\n\n\n\nM right", - { - "x": 6 - }, - "I\n\n\n\n\n\n\n\n\n↑", - { - "t": "#000000\n\n\n#0094ff\n\n\n\n\n\n#ff0000" - }, - "O\n\n\n[\n\n\n\n\n\nEnd", - { - "t": "#000000\n\n\n#0094ff" - }, - "P\n\n\n]" - ], - [ - { - "y": -0.75, - "t": "#000000" - }, - "Tab", - { - "x": 3 - }, - "R", - { - "x": 4, - "t": "#000000\n\n\n\n\n\n\n\n\n#ff0000" - }, - "U\n\n\n\n\n\n\n\n\nHome", - { - "x": 3 - }, - "+\n=\n\n\n\n\n\n\n\nF12" - ], - [ - { - "y": -0.75, - "x": 5, - "t": "#000000" - }, - "T", - { - "x": 2, - "t": "#000000\n\n\n\n\n\n\n\n\n#ff0000" - }, - "Y\n\n\n\n\n\n\n\n\nPgUp" - ], - [ - { - "y": -0.5, - "x": 1 - }, - "A\n\n\n\n\n\n\n\n\nM←", - "S\n\n\n\n\n\n\n\n\nM↓", - "D\n\n\n\n\n\n\n\n\nM→", - { - "x": 6, - "f": 3 - }, - "K\n\n\n\n\n\n\n\n\n↓", - { - "t": "#000000\n\n\n#0094ff\n\n\n\n\n\n#ff0000", - "f": 3 - }, - "L\n\n\n{\n\n\n\n\n\n→", - { - "t": "#000000\n\n\n#0094ff" - }, - ":\n;\n\n}" - ], - [ - { - "y": -0.75, - "t": "#000000" - }, - "Esc (?)", - { - "x": 3 - }, - "F", - { - "x": 4, - "t": "#000000\n\n\n\n\n\n\n\n\n#ff0000", - "f": 3 - }, - "J\n\n\n\n\n\n\n\n\n←", - { - "x": 3, - "t": "#000000\n\n\n#0094ff" - }, - "\"\n'\n\n|" - ], - [ - { - "y": -0.75, - "x": 5, - "t": "#000000" - }, - "G", - { - "x": 2, - "t": "#000000\n\n\n\n\n\n\n\n\n#ff0000", - "f": 3 - }, - "H\n\n\n\n\n\n\n\n\nPgDn" - ], - [ - { - "y": -0.5, - "x": 1, - "f": 3 - }, - "Back\n\n\n\n\n\n\n\n\nDel", - { - "t": "#000000" - }, - "Z", - "X", - { - "x": 6 - }, - "M", - "<\n,", - ">\n." - ], - [ - { - "y": -0.75, - "t": "#002aff\n\n\n\n\n\n\n\n\n#ff0000", - "fa": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1 - ] - }, - "Shift\n\n\n\n\n\n\n\n\nCaps-Word", - { - "x": 3, - "t": "#000000" - }, - "C", - { - "x": 4 - }, - "N", - { - "x": 3, - "t": "#000000\n\n\n#0094ff" - }, - "?\n/\n\n\\" - ], - [ - { - "y": -0.75, - "x": 5, - "t": "#000000" - }, - "V", - { - "x": 2 - }, - "B" - ], - [ - { - "y": -0.5, - "x": 1, - "t": "#0094ff" - }, - "Raise", - { - "x": 10, - "t": "#cc00ff" - }, - "Fn / kbdctl" - ], - [ - { - "y": -0.75, - "t": "#002aff" - }, - "Ctrl", - { - "x": 12, - "t": "#000000", - "a": 7 - }, - "(?)" - ], - [ - { - "y": -0.75, - "x": 2.5, - "t": "#002aff", - "a": 4 - }, - "Super", - { - "x": 7, - "t": "#009e26" - }, - "Leader ?" - ], - [ - { - "y": -0.75, - "x": 3.5, - "t": "#ff0000" - }, - "Move", - { - "x": 5, - "t": "#0094ff" - }, - "1shot Raise" - ], - [ - { - "y": -0.75, - "x": 4.5, - "t": "#002aff" - }, - "Alt", - { - "x": 3 - }, - "AltGr" - ], - [ - { - "y": -0.75, - "x": 5.5, - "t": "#000000", - "fa": [ - 2 - ] - }, - "Space", - { - "x": 1, - "t": "#000000\n\n\n\n\n\n\n\n\n#ff0000", - "fa": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 2 - ] - }, - "Enter\n\n\n\n\n\n\n\n\nIns (?)" - ] -] \ No newline at end of file diff --git a/qmk_keyboards/binarydiv/eepyboard/rev1/README.md b/qmk_keyboards/binarydiv/eepyboard/rev1/README.md new file mode 100644 index 0000000..9229a4c --- /dev/null +++ b/qmk_keyboards/binarydiv/eepyboard/rev1/README.md @@ -0,0 +1,3 @@ +# eepyBoard v1.0 / rev1 + +This is the firmware for hardware revision 1 of the eepyBoard (v1.0). diff --git a/qmk_keyboards/binarydiv/eepyboard/rev1/config.h b/qmk_keyboards/binarydiv/eepyboard/rev1/config.h new file mode 100644 index 0000000..ecd559c --- /dev/null +++ b/qmk_keyboards/binarydiv/eepyboard/rev1/config.h @@ -0,0 +1,7 @@ +// Copyright 2024 binaryDiv (@binaryDiv) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +// Lock one-shot keys when tapping them twice +#define ONESHOT_TAP_TOGGLE 2 diff --git a/qmk_keyboards/binarydiv/eepyboard/rev1/info.json b/qmk_keyboards/binarydiv/eepyboard/rev1/info.json new file mode 100644 index 0000000..55dd2d1 --- /dev/null +++ b/qmk_keyboards/binarydiv/eepyboard/rev1/info.json @@ -0,0 +1,213 @@ +{ + "keyboard_name": "eepyBoard v1.0", + "maintainer": "binaryDiv", + "manufacturer": "binaryDiv", + "url": "https://git.0xbd.space/binaryDiv/eepyBoard", + "processor": "RP2040", + "bootloader": "rp2040", + "usb": { + "device_version": "1.0.0", + "vid": "0x1337", + "pid": "0xBD32" + }, + "features": { + "bootmagic": true, + "command": false, + "console": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "diode_direction": "COL2ROW", + "matrix_pins": { + "cols": ["GP8", "GP7", "GP6", "GP5", "GP4", "GP3", "GP2", "GP1", "GP0", "GP25", "GP24", "GP23", "GP22"], + "rows": ["GP12", "GP13", "GP14", "GP15", "GP16", "GP17"] + }, + "encoder": { + "rotary": [ + { + "pin_a": "GP10", + "pin_b": "GP11", + "resolution": 4 + } + ] + }, + "layouts": { + "LAYOUT_ortho_6x13": { + "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": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "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": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [1, 9], "x": 9, "y": 1}, + {"matrix": [1, 10], "x": 10, "y": 1}, + {"matrix": [1, 11], "x": 11, "y": 1}, + {"matrix": [1, 12], "x": 12, "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": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + {"matrix": [2, 6], "x": 6, "y": 2}, + {"matrix": [2, 7], "x": 7, "y": 2}, + {"matrix": [2, 8], "x": 8, "y": 2}, + {"matrix": [2, 9], "x": 9, "y": 2}, + {"matrix": [2, 10], "x": 10, "y": 2}, + {"matrix": [2, 11], "x": 11, "y": 2}, + {"matrix": [2, 12], "x": 12, "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": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + {"matrix": [3, 6], "x": 6, "y": 3}, + {"matrix": [3, 7], "x": 7, "y": 3}, + {"matrix": [3, 8], "x": 8, "y": 3}, + {"matrix": [3, 9], "x": 9, "y": 3}, + {"matrix": [3, 10], "x": 10, "y": 3}, + {"matrix": [3, 11], "x": 11, "y": 3}, + {"matrix": [3, 12], "x": 12, "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}, + {"matrix": [4, 4], "x": 4, "y": 4}, + {"matrix": [4, 5], "x": 5, "y": 4}, + {"matrix": [4, 6], "x": 6, "y": 4}, + {"matrix": [4, 7], "x": 7, "y": 4}, + {"matrix": [4, 8], "x": 8, "y": 4}, + {"matrix": [4, 9], "x": 9, "y": 4}, + {"matrix": [4, 10], "x": 10, "y": 4}, + {"matrix": [4, 11], "x": 11, "y": 4}, + {"matrix": [4, 12], "x": 12, "y": 4}, + {"matrix": [5, 0], "x": 0, "y": 5}, + {"matrix": [5, 1], "x": 1, "y": 5}, + {"matrix": [5, 2], "x": 2, "y": 5}, + {"matrix": [5, 3], "x": 3, "y": 5}, + {"matrix": [5, 4], "x": 4, "y": 5}, + {"matrix": [5, 5], "x": 5, "y": 5}, + {"matrix": [5, 6], "x": 6, "y": 5}, + {"matrix": [5, 7], "x": 7, "y": 5}, + {"matrix": [5, 8], "x": 8, "y": 5}, + {"matrix": [5, 9], "x": 9, "y": 5}, + {"matrix": [5, 10], "x": 10, "y": 5}, + {"matrix": [5, 11], "x": 11, "y": 5}, + {"matrix": [5, 12], "x": 12, "y": 5} + ] + } + }, + "rgb_matrix": { + "driver": "ws2812", + "default": { + "animation": "cycle_pinwheel", + "speed": 32 + }, + "animations": { + "cycle_pinwheel": true, + "typing_heatmap": true + }, + "max_brightness": 127, + "sleep": true, + "center_point": [6, 3], + "layout": [ + {"x": 10, "y": 0, "flags": 8}, + {"x": 8, "y": 0, "matrix": [0, 8], "flags": 4}, + {"x": 7, "y": 0, "matrix": [0, 7], "flags": 4}, + {"x": 6, "y": 0, "matrix": [0, 6], "flags": 4}, + {"x": 5, "y": 0, "matrix": [0, 5], "flags": 4}, + {"x": 4, "y": 0, "matrix": [0, 4], "flags": 4}, + {"x": 3, "y": 0, "matrix": [0, 3], "flags": 4}, + {"x": 2, "y": 0, "matrix": [0, 2], "flags": 4}, + {"x": 1, "y": 0, "matrix": [0, 1], "flags": 4}, + {"x": 0, "y": 0, "matrix": [0, 0], "flags": 4}, + {"x": 0, "y": 1, "matrix": [1, 0], "flags": 4}, + {"x": 1, "y": 1, "matrix": [1, 1], "flags": 4}, + {"x": 2, "y": 1, "matrix": [1, 2], "flags": 4}, + {"x": 3, "y": 1, "matrix": [1, 3], "flags": 4}, + {"x": 4, "y": 1, "matrix": [1, 4], "flags": 4}, + {"x": 5, "y": 1, "matrix": [1, 5], "flags": 4}, + {"x": 6, "y": 1, "matrix": [1, 6], "flags": 4}, + {"x": 7, "y": 1, "matrix": [1, 7], "flags": 4}, + {"x": 8, "y": 1, "matrix": [1, 8], "flags": 4}, + {"x": 9, "y": 1, "matrix": [1, 9], "flags": 4}, + {"x": 10, "y": 1, "matrix": [1, 10], "flags": 4}, + {"x": 11, "y": 1, "matrix": [1, 11], "flags": 4}, + {"x": 12, "y": 1, "matrix": [1, 12], "flags": 4}, + {"x": 12, "y": 2, "matrix": [2, 12], "flags": 4}, + {"x": 11, "y": 2, "matrix": [2, 11], "flags": 4}, + {"x": 10, "y": 2, "matrix": [2, 10], "flags": 4}, + {"x": 9, "y": 2, "matrix": [2, 9], "flags": 4}, + {"x": 8, "y": 2, "matrix": [2, 8], "flags": 4}, + {"x": 7, "y": 2, "matrix": [2, 7], "flags": 4}, + {"x": 6, "y": 2, "matrix": [2, 6], "flags": 4}, + {"x": 5, "y": 2, "matrix": [2, 5], "flags": 4}, + {"x": 4, "y": 2, "matrix": [2, 4], "flags": 4}, + {"x": 3, "y": 2, "matrix": [2, 3], "flags": 4}, + {"x": 2, "y": 2, "matrix": [2, 2], "flags": 4}, + {"x": 1, "y": 2, "matrix": [2, 1], "flags": 4}, + {"x": 0, "y": 2, "matrix": [2, 0], "flags": 4}, + {"x": 0, "y": 3, "matrix": [3, 0], "flags": 4}, + {"x": 1, "y": 3, "matrix": [3, 1], "flags": 4}, + {"x": 2, "y": 3, "matrix": [3, 2], "flags": 4}, + {"x": 3, "y": 3, "matrix": [3, 3], "flags": 4}, + {"x": 4, "y": 3, "matrix": [3, 4], "flags": 4}, + {"x": 5, "y": 3, "matrix": [3, 5], "flags": 4}, + {"x": 6, "y": 3, "matrix": [3, 6], "flags": 4}, + {"x": 7, "y": 3, "matrix": [3, 7], "flags": 4}, + {"x": 8, "y": 3, "matrix": [3, 8], "flags": 4}, + {"x": 9, "y": 3, "matrix": [3, 9], "flags": 4}, + {"x": 10, "y": 3, "matrix": [3, 10], "flags": 4}, + {"x": 11, "y": 3, "matrix": [3, 11], "flags": 4}, + {"x": 12, "y": 3, "matrix": [3, 12], "flags": 4}, + {"x": 12, "y": 4, "matrix": [4, 12], "flags": 4}, + {"x": 11, "y": 4, "matrix": [4, 11], "flags": 4}, + {"x": 10, "y": 4, "matrix": [4, 10], "flags": 4}, + {"x": 9, "y": 4, "matrix": [4, 9], "flags": 4}, + {"x": 8, "y": 4, "matrix": [4, 8], "flags": 4}, + {"x": 7, "y": 4, "matrix": [4, 7], "flags": 4}, + {"x": 6, "y": 4, "matrix": [4, 6], "flags": 4}, + {"x": 5, "y": 4, "matrix": [4, 5], "flags": 4}, + {"x": 4, "y": 4, "matrix": [4, 4], "flags": 4}, + {"x": 3, "y": 4, "matrix": [4, 3], "flags": 4}, + {"x": 2, "y": 4, "matrix": [4, 2], "flags": 4}, + {"x": 1, "y": 4, "matrix": [4, 1], "flags": 4}, + {"x": 0, "y": 4, "matrix": [4, 0], "flags": 4}, + {"x": 0, "y": 5, "matrix": [5, 0], "flags": 4}, + {"x": 1, "y": 5, "matrix": [5, 1], "flags": 4}, + {"x": 2, "y": 5, "matrix": [5, 2], "flags": 4}, + {"x": 3, "y": 5, "matrix": [5, 3], "flags": 4}, + {"x": 4, "y": 5, "matrix": [5, 4], "flags": 4}, + {"x": 5, "y": 5, "matrix": [5, 5], "flags": 4}, + {"x": 7, "y": 5, "matrix": [5, 7], "flags": 4}, + {"x": 8, "y": 5, "matrix": [5, 8], "flags": 4}, + {"x": 9, "y": 5, "matrix": [5, 9], "flags": 4}, + {"x": 10, "y": 5, "matrix": [5, 10], "flags": 4}, + {"x": 11, "y": 5, "matrix": [5, 11], "flags": 4}, + {"x": 12, "y": 5, "matrix": [5, 12], "flags": 4} + ] + }, + "ws2812": { + "pin": "GP9" + } +} diff --git a/qmk_keyboards/binarydiv/eepyboard/rev1/keymaps/default/keymap.c b/qmk_keyboards/binarydiv/eepyboard/rev1/keymaps/default/keymap.c new file mode 100644 index 0000000..5c1e5fa --- /dev/null +++ b/qmk_keyboards/binarydiv/eepyboard/rev1/keymaps/default/keymap.c @@ -0,0 +1,85 @@ +// Copyright 2024 binaryDiv (@binaryDiv) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +// Define layer names for better readability +enum layer_names { + // Base layer + L_BASE, + + // "Code" key: Moving the cursor around via WASD, F-keys on number keys, etc. + L_CODE, + + // Fn / keyboard control layer: Used for keyboard configuration + L_FN, +}; + +// Custom keycodes +enum custom_keycodes { + // Macro to select the current word (Ctrl-Left, Shift-Ctrl-Right) + MACRO_SELECT_WORD = SAFE_RANGE, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // Base layer + [L_BASE] = LAYOUT_ortho_6x13( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, _______, _______, _______, KC_KB_MUTE, + KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQUAL, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LEFT_BRACKET, KC_RIGHT_BRACKET, + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SEMICOLON, KC_QUOTE, KC_BACKSLASH, + KC_LEFT_SHIFT, KC_HOME, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RIGHT_SHIFT, + KC_LEFT_CTRL, KC_END, KC_LGUI, KC_LEFT_ALT, OSL(L_CODE), KC_SPACE, _______, KC_BACKSPACE, KC_ENTER, OSM(MOD_RALT), KC_DELETE, MO(L_FN), KC_RIGHT_CTRL + ), + + // "Code" key layer + [L_CODE] = LAYOUT_ortho_6x13( + _______, DM_PLY1, DM_PLY2, _______, _______, _______, _______, _______, KC_PRINT_SCREEN, _______, _______, _______, _______, + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + _______, KC_HOME, KC_UP, KC_END, KC_PGUP, _______, _______, KC_UNDERSCORE, KC_EQUAL, KC_LEFT_BRACKET, KC_RIGHT_BRACKET, _______, _______, + _______, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDN, _______, _______, KC_MINUS, KC_PLUS, KC_LEFT_CURLY_BRACE, KC_RIGHT_CURLY_BRACE, _______, _______, + _______, LCTL(KC_LEFT), MACRO_SELECT_WORD, LCTL(KC_RIGHT), KC_ENTER, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + + // "Fn" key layer + [L_FN] = LAYOUT_ortho_6x13( + DM_RSTP, DM_REC1, DM_REC2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, OS_TOGG, _______, RGB_MOD, RGB_TOG, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_CLEAR_EEPROM, QK_REBOOT, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOTLOADER + ) +}; + +// Define mapping for rotary encoder +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + // Base layer: Volume control + [L_BASE] = { + ENCODER_CCW_CW(KC_KB_VOLUME_DOWN, KC_KB_VOLUME_UP) + }, + // Code layer: Scroll wheel + [L_CODE] = { + ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN) + }, + // Fn layer: RGB LED brightness control + [L_FN] = { + ENCODER_CCW_CW(RGB_VAD, RGB_VAI) + } +}; +#endif + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case MACRO_SELECT_WORD: + // Run macro when keycode is pressed + if (record->event.pressed) { + // Select word + SEND_STRING(SS_LCTL(SS_TAP(X_LEFT)) SS_LSFT(SS_LCTL(SS_TAP(X_RIGHT)))); + } + break; + } + return true; +} diff --git a/qmk_keyboards/binarydiv/eepyboard/rev1/rules.mk b/qmk_keyboards/binarydiv/eepyboard/rev1/rules.mk new file mode 100644 index 0000000..2c841ca --- /dev/null +++ b/qmk_keyboards/binarydiv/eepyboard/rev1/rules.mk @@ -0,0 +1,9 @@ +# Enable support for rotary encoder +ENCODER_ENABLE = yes +ENCODER_MAP_ENABLE = yes + +# Use RP2040-specific driver for WS2812 (PIO-based) +WS2812_DRIVER = vendor + +# Enable support for dynamic macros +DYNAMIC_MACRO_ENABLE = yes From 0f38a3c3523f54ede7bc4278619f994fd2a87e7e Mon Sep 17 00:00:00 2001 From: binaryDiv Date: Sat, 28 Sep 2024 15:51:50 +0200 Subject: [PATCH 2/3] KiCad: Update paths --- kicad/eepyboard.kicad_pcb | 4 ++-- kicad/eepyboard.kicad_pro | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/kicad/eepyboard.kicad_pcb b/kicad/eepyboard.kicad_pcb index bfb8f91..ba68495 100644 --- a/kicad/eepyboard.kicad_pcb +++ b/kicad/eepyboard.kicad_pcb @@ -133,9 +133,9 @@ (subtractmaskfromsilk no) (outputformat 1) (mirror no) - (drillshape 1) + (drillshape 0) (scaleselection 1) - (outputdirectory "") + (outputdirectory "gerber/rev1/") ) ) (net 0 "") diff --git a/kicad/eepyboard.kicad_pro b/kicad/eepyboard.kicad_pro index 55f5926..d7b41e1 100644 --- a/kicad/eepyboard.kicad_pro +++ b/kicad/eepyboard.kicad_pro @@ -1019,7 +1019,7 @@ "gencad": "", "idf": "", "netlist": "", - "plot": "", + "plot": "gerber/rev1/", "pos_files": "", "specctra_dsn": "", "step": "", From 183857b2fff06a2e9abe314be80627a2d9203dff Mon Sep 17 00:00:00 2001 From: binaryDiv Date: Sat, 28 Sep 2024 15:56:34 +0200 Subject: [PATCH 3/3] Add 3D prints for makeshift feet for rev1 --- 3d_prints/rev1/makeshift_feet/bottom_left.stl | Bin 0 -> 32084 bytes 3d_prints/rev1/makeshift_feet/bottom_right.stl | Bin 0 -> 32084 bytes 3d_prints/rev1/makeshift_feet/top_left.stl | Bin 0 -> 29084 bytes 3d_prints/rev1/makeshift_feet/top_right.stl | Bin 0 -> 31184 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 3d_prints/rev1/makeshift_feet/bottom_left.stl create mode 100644 3d_prints/rev1/makeshift_feet/bottom_right.stl create mode 100644 3d_prints/rev1/makeshift_feet/top_left.stl create mode 100644 3d_prints/rev1/makeshift_feet/top_right.stl diff --git a/3d_prints/rev1/makeshift_feet/bottom_left.stl b/3d_prints/rev1/makeshift_feet/bottom_left.stl new file mode 100644 index 0000000000000000000000000000000000000000..79b55be7f45197c394a7a1709ad92ca5c8bfeade GIT binary patch literal 32084 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 literal 0 HcmV?d00001 diff --git a/3d_prints/rev1/makeshift_feet/bottom_right.stl b/3d_prints/rev1/makeshift_feet/bottom_right.stl new file mode 100644 index 0000000000000000000000000000000000000000..02fb9bb4ec032e7297c882f85e142e75cb4daede GIT binary patch literal 32084 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 Hl_dTT^^NwU literal 0 HcmV?d00001 diff --git a/3d_prints/rev1/makeshift_feet/top_left.stl b/3d_prints/rev1/makeshift_feet/top_left.stl new file mode 100644 index 0000000000000000000000000000000000000000..46ffe1e333a456a72e3e9c0964ae3fc1f143de8a GIT binary patch literal 29084 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 V_}=@w##&4K!+=sLp*50a{{xf?%98*9 literal 0 HcmV?d00001 diff --git a/3d_prints/rev1/makeshift_feet/top_right.stl b/3d_prints/rev1/makeshift_feet/top_right.stl new file mode 100644 index 0000000000000000000000000000000000000000..e5f6cf8a2667099d3dd9dec3339abc4f919f7136 GIT binary patch literal 31184 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 ON}ptAn}(%i#6JOnXZUyk literal 0 HcmV?d00001