메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

5x5 매크로 키보드 만들기

데브카페

5x5 매크로 키보드 만들기 (3D 프린터 ,NRF52840칩, ZMK)

  • 준비물
  1. SuperMini NRF52840
  2. 5×5 보드판(3d 프린팅)
  3. 키캡 , 기계식 키보드 체리식 키 클론(알리익프레스)
  4. 저항 다이오드

gpio 핀 할당 (5 Row + 5 Col = 10핀)

SuperMini 핀이 넉넉하게 남아서 여유 있게 배치 가능합니다.

  • 납땜 핀 번호 (보드 실크스크린 기준)
| 용도 | 보드 라벨 | nRF52840 핀 |
|------|---------|------------|
| Row 0 | **011** | P0.11 |
| Row 1 | **013** | P0.13 |
| Row 2 | **015** | P0.15 |
| Row 3 | **017** | P0.17 |
| Row 4 | **020** | P0.20 |
| Col 0 | **022** | P0.22 |
| Col 1 | **024** | P0.24 |
| Col 2 | **100** | P1.00 |
| Col 3 | **011** | P1.11 |
| Col 4 | **113** | P1.13 |
  • ⚠️ Row/Col 핀이 보드 라벨과 혼동되지 않도록 아래 다이어그램 참고

보드 핀 다이어그램

        
 
         USB-C
    ┌─────────────┐
B-  │ o         o │ B+
006 │ o         o │ RAW
008 │ o         o │ GND
GND │ o         o │ RST
020 │ o [Row 4] o │ VCC
022 │ o [Col 0] o │ 031
024 │ o [Col 1] o │ 029
100 │ o [Col 2] o │ 002
011 │ o [Row 0] o │ 115
104 │ o         o │ 113 [Col 4]
106 │ o         o │ 111 [Col 3]
009 │ o         o │ 010
008 │ o         o │ 106
    └─────────────┘

※ Row 1~3 핀: 별도 연결 필요
Row 1 → 013 (P0.13)
Row 2 → 015 (P0.15)  
Row 3 → 017 (P0.17)

보드 핀 다이어그램

  • SuperMini NRF52840
        
         		USB-C
    		┌─────────────┐
		B-  │ o         o │ B+
[Row 0] 006 │ o         o │ RAW
[Row 1]	008 │ o         o │ GND
		GND │ o         o │ RST
		GND	│ o 	    o │ VCC(3.5V)
[Row 1]	017 │ o 	    o │ 031
[Col 0]	020 │ o 	    o │ 029
[Col 1]	022 │ o 	    o │ 002
[Col 2]	024 │ o 	    o │ 115
[Col 3]	100 │ o 	    o │ 113
[Col 4]	011 │ o         o │ 111 
		104 │ o         o │ 010 [Row 3]
		106 │ o         o │ 009 [Row 2]
			└─────────────┘
<뒷면>
   o o o
107 102 101





✅ 확정 핀 할당 (SuperMini 실제 사용 가능 핀 기준)

| 용도 | 보드 라벨 | GPIO |
|------|---------|------|
| **Row 0** | 006 | P0.06 |
| **Row 1** | 008 | P0.08 |
| **Row 2** | 009 | P0.09 |
| **Row 3** | 010 | P0.10 |
| **Row 4** | 017 | P0.17 |
| **Col 0** | 020 | P0.20 |
| **Col 1** | 022 | P0.22 |
| **Col 2** | 024 | P0.24 |
| **Col 3** | 100 | P1.00 |
| **Col 4** | 011 | P0.11 |

배선도

  • 스위치 매트릭스 (다이오드 col2row 방향)
        Col0  Col1  Col2  Col3  Col4
        (020) (022) (024) (100) (011)
          │     │     │     │     │
Row0(006)─┼─[K00]┼─[K01]┼─[K02]┼─[K03]┼─[K04]
          │     │     │     │     │
Row1(008)─┼─[K10]┼─[K11]┼─[K12]┼─[K13]┼─[K14]
          │     │     │     │     │
Row2(009)─┼─[K20]┼─[K21]┼─[K22]┼─[K23]┼─[K24]
          │     │     │     │     │
Row3(010)─┼─[K30]┼─[K31]┼─[K32]┼─[K33]┼─[K34]
          │     │     │     │     │
Row4(017)─┼─[K40]┼─[K41]┼─[K42]┼─[K43]┼─[K44]
  • 각 스위치에 다이오드(1N4148) 직렬 연결
  • 캐소드(띠) → Col 방향

ZMK 펌웨어 파일 구성

📁 폴더 구조


zmk-config/
├── config/
│    └── west.yml
├── boards/shields/macro25/
│   ├── macro25.conf
│   ├── macro25.keymap
│   ├── macro25.overlay
│   ├── macro25.conf
│   └── Kconfig.shield
├── zephyr/
│    └── module.yml
└── build.yaml



1️⃣ `macro25.overlay`

c
/ {
    chosen {
        zmk,kscan = &kscan0;
    };

    kscan0: kscan_0 {
        compatible = "zmk,kscan-gpio-matrix";
        label = "KSCAN";
        diode-direction = "col2row";

        row-gpios
            = <&gpio0  6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>  // Row0 - 라벨:006
            , <&gpio0  8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>  // Row1 - 라벨:008
            , <&gpio0  9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>  // Row2 - 라벨:009
            , <&gpio0 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>  // Row3 - 라벨:010
            , <&gpio0 17 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>  // Row4 - 라벨:017
            ;

        col-gpios
            = <&gpio0 20 GPIO_ACTIVE_HIGH>   // Col0 - 라벨:020
            , <&gpio0 22 GPIO_ACTIVE_HIGH>   // Col1 - 라벨:022
            , <&gpio0 24 GPIO_ACTIVE_HIGH>   // Col2 - 라벨:024
            , <&gpio1  0 GPIO_ACTIVE_HIGH>   // Col3 - 라벨:100
            , <&gpio0 11 GPIO_ACTIVE_HIGH>   // Col4 - 라벨:011
            ;
    };
};

2️⃣ `macro25.keymap`

c
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/bt.h>
#include <dt-bindings/zmk/outputs.h>

/ {
    /*
     * 매크로 정의
     * 자주 쓰는 Oracle / Python / AutoIt 작업에 맞게 커스터마이징
     */
    macros {
        // Oracle 관련 매크로
        mac_sel_all: mac_sel_all {
            compatible = "zmk,behavior-macro";
            label = "SELECT_ALL";
            #binding-cells = <0>;
            bindings = <&kp S &kp E &kp L &kp E &kp C &kp T
                        &kp SPACE &kp STAR &kp SPACE
                        &kp F &kp R &kp O &kp M &kp SPACE>;
        };

        mac_commit: mac_commit {
            compatible = "zmk,behavior-macro";
            label = "COMMIT";
            #binding-cells = <0>;
            bindings = <&kp C &kp O &kp M &kp M &kp I &kp T &kp SEMI>;
        };

        mac_rollback: mac_rollback {
            compatible = "zmk,behavior-macro";
            label = "ROLLBACK";
            #binding-cells = <0>;
            bindings = <&kp R &kp O &kp L &kp L &kp B
                        &kp A &kp C &kp K &kp SEMI>;
        };

        mac_expl: mac_expl {
            compatible = "zmk,behavior-macro";
            label = "EXPLAIN_PLAN";
            #binding-cells = <0>;
            bindings = <&kp E &kp X &kp P &kp L &kp A &kp I &kp N
                        &kp SPACE &kp P &kp L &kp A &kp N
                        &kp SPACE &kp F &kp O &kp R &kp SPACE>;
        };

        // Python 관련 매크로
        mac_print: mac_print {
            compatible = "zmk,behavior-macro";
            label = "PRINT";
            #binding-cells = <0>;
            bindings = <&kp P &kp R &kp I &kp N &kp T
                        &kp LPAR &kp RPAR &kp LEFT>;
        };

        mac_def: mac_def {
            compatible = "zmk,behavior-macro";
            label = "DEF_FUNC";
            #binding-cells = <0>;
            bindings = <&kp D &kp E &kp F &kp SPACE>;
        };
    };

    keymap {
        compatible = "zmk,keymap";

        // Layer 0: 기본 매크로 레이어
        default_layer {
            bindings = <
// Row 0: Oracle DBA 작업
&mac_sel_all  &mac_commit   &mac_rollback  &mac_expl     &kp LC(C)
// Row 1: Python / 편집
&mac_print    &mac_def      &kp LC(Z)      &kp LC(Y)     &kp LC(S)
// Row 2: 시스템 / 창 전환
&kp LC(A)     &kp LC(X)     &kp LC(V)      &kp LA(TAB)   &kp LC(W)
// Row 3: 미디어 / 볼륨
&kp C_VOL_DN  &kp C_VOL_UP  &kp C_MUTE     &kp C_PP      &kp C_NEXT
// Row 4: BT / 레이어 전환
&bt BT_SEL 0  &bt BT_SEL 1  &bt BT_CLR     &mo 1         &mo 2
            >;
        };

        // Layer 1: Oracle 심화 레이어 (mo 1 홀드)
        oracle_layer {
            bindings = <
&kp LC(F)     &kp LC(H)     &kp F5         &kp F8        &kp F9
&kp LC(N)     &kp LC(O)     &kp LC(P)      &kp LC(G)     &kp LC(L)
&kp LC(LS(P)) &kp LC(LS(N)) &kp LC(LS(F))  &none         &none
&none         &none         &none          &none         &none
&trans        &trans        &trans         &trans        &trans
            >;
        };

        // Layer 2: BT / 시스템 레이어 (mo 2 홀드)
        sys_layer {
            bindings = <
&bt BT_SEL 0  &bt BT_SEL 1  &bt BT_SEL 2   &bt BT_SEL 3  &bt BT_CLR
&out OUT_USB  &out OUT_BLE  &none          &none         &none
&none         &none         &none          &none         &none
&none         &none         &none          &none         &none
&trans        &trans        &trans         &trans        &trans
            >;
        };
    };
};

3️⃣ `macro25.conf`

ini
# 블루투스
CONFIG_ZMK_BLE=y
CONFIG_BT_DEVICE_NAME="Macro25-NRF52840"

# USB 동시 지원
CONFIG_ZMK_USB=y

# 배터리
CONFIG_ZMK_BATTERY_REPORTING=y

# 절전
CONFIG_ZMK_SLEEP=y
CONFIG_ZMK_IDLE_SLEEP_TIMEOUT=600000

# 디바운스
CONFIG_ZMK_KSCAN_DEBOUNCE_PRESS_MS=5
CONFIG_ZMK_KSCAN_DEBOUNCE_RELEASE_MS=5

4️⃣ `Kconfig.shield`


kconfig
config SHIELD_MACRO25
    def_bool $(shields_list_contains,macro25)

if SHIELD_MACRO25

config ZMK_KEYBOARD_NAME
    default "Macro25"

endif

5️⃣ `build.yaml`

yaml
---
include:
  - board: supermini_nrf52840
    shield: macro25


---

6️⃣ `.github/workflows/build.yml`

yaml
name: Build ZMK Firmware

on:
  push:
  pull_request:
  workflow_dispatch:

jobs:
  build:
    uses: zmkfirmware/zmk/.github/workflows/build-user-config.yml@main



납땜 순서 요약


1. 다이오드(1N4148) 25개 → 각 스위치 위치에 납땜
   캐소드(띠쪽) → Col 방향

2. 스위치 25개 → PCB 또는 수납땜

3. Row 배선 (수평)
   Row0: 006핀 → 1행 스위치 5개 연결
   Row1: 008핀 → 2행 스위치 5개 연결
   Row2: 009핀 → 3행 스위치 5개 연결
   Row3: 010핀 → 4행 스위치 5개 연결
   Row4: 017핀 → 5행 스위치 5개 연결

4. Col 배선 (수직)
   Col0: 020핀 → 1열 스위치 5개 연결
   Col1: 022핀 → 2열 스위치 5개 연결
   Col2: 024핀 → 3열 스위치 5개 연결
   Col3: 100핀 → 4열 스위치 5개 연결
   Col4: 011핀 → 5열 스위치 5개 연결

5. SuperMini USB-C → PC 연결 후 펌웨어 플래시

---

키 배치 커스터마이징 팁


| 위치 | 추천 매크로 |
|------|-----------|
| R0C0 | `SELECT * FROM` |
| R0C1 | `COMMIT` |
| R0C2 | `ROLLBACK` |
| R0C3 | `EXPLAIN PLAN FOR` |
| R0C4 | `ALTER SESSION SET` |
| R1C0 | `print()` |
| R1C1 | `def func():` |
| R1C2 | `import cx_Oracle` |
| R4C3 | Layer 1 (Oracle 심화) |
| R4C4 | Layer 2 (BT/시스템) |

Comments