팁과 노하우

전체보기

모바일 상단 메뉴

본문 페이지

[사냥] QMK로 진꾹보드 만들기

운영뭣같네
댓글: 31 개
조회: 15008
추천: 6
2025-07-27 23:19:36

이전 제가 꾹보드 관련해서 적었던 글입니다.
https://www.inven.co.kr/board/maple/2304/43364

 많은 사람들은 꾹보드가 싸구려 키보드의 물리적인 결함에서 오는 오류인 줄 알고 계십니다. 저도 그렇게 생각했는데요, 제네시스 기판, 한성 매그니톡스같은 꾹보드 기능이 들어간 키보드와, 원래는 안되었지만 펌웨어 업데이트로 가능하게 된 다얼유 a87 pro 8k 같은 키보드를 보면서 물리적인 결함이 아닌 펌웨어의 결함임을 알게 되었습니다. 이후 USB 패킷이랑 수십개의 펌웨어 코드를 관찰 분석하며 펌웨어에서 이 결함을 만들려고 삽질을 많이 해봤습니다.
본문은 이해하기 편하게 끊어서 적었습니다.

Q. 꾹보드 제작해서 사용하면 정지 안 먹나요?
A. 위에 링크 걸어둔 글에서 말한 것 같이, 고정키를 써서 꾹보드를 사용하는 것이 아닌 이상 정지를 먹은 것을 본 적이 없습니다. 다얼유 a87 pro 8k, 한성 매그니톡스같이 자체적으로 펌웨어에서 꾹보드가 가능하도록 변경한 것일 뿐, 권장하지 않는 플레이 방식 6)에서 말하는 매크로와는 다릅니다. 이 글에서 다루는 꾹보드 제작은 키보드에 일종의 "기능"을 추가하는 것이 아닌, 기존에 꾹보드 현상이 일어나지 않도록 설계된 펌웨어에서 꾹보드 현상이 일어날 수 있도록 변경한 것입니다.

목차
1. 준비물
2. 개발 환경 세팅
3. 기본 키보드 설정
4. 펌웨어 변경
5. 키보드 flash
(번외) 원리 및 추가사항



1. 준비물
 QMK가 지원되며 펌웨어가 공개되어 있는 키보드(https://browse.qmk.fm/#/ 여기에 검색해서 나와야 함)
 필자가 사용하는 키보드는 Keychron사의 v1 knob 모델이다. knob펌웨어는 없기에 v1 기본 모델의 펌웨어를 사용하였다.

 Q. 제 키보드는 QMK/VIA 지원이라는데 검색해서 안 나와요ㅠㅠ 새로 하나 사야 할까요?
 A. 저기 없어도 비공식적으로 공유되고 있을 수도 있으니 인터넷에 찾아보세요. 없으면 그냥 그냥 꾹보드 기능 들어간 키보드 사세요.


2. 개발 환경 세팅
QMK MSYS를 다운로드하자. https://msys.qmk.fm/
다운로드 완료 후 실행 시 아래와 같은 창이 뜰 것이다.
여기다가 qmk setup <- 복붙
qmk 파일들이 있는 곳은 C:users(유저이름)qmk_firmware 이다.

QMK Toolbox를 다운로드 하자. https://github.com/qmk/qmk_toolbox/releases
다운로드 완료 후 관리자 권한으로 실행 시 드라이버 설치에 관하여 창을 띄울 것이다.
예(Y)를 눌러서 설치해준다.
만약 드라이버 설치에 관한 창이 뜨지 않는다면, 아래 영상을 참고하여 드라이버를 설치한다.
개발 환경 세팅이 완료되었다.


3. 기본 키보드 설정
기본적인 키보드 설정을 하는 방법을 알려주겠다.
먼저 qmk_fireware (C:users(유저이름)qmk_firmware)로 들어가준다.
우리가 들어갈 폴더는 keyboards폴더와 quantum밖에 없다.

keyboards라는 폴더에 들어간다.
자신의 키보드의 제조사를 찾아서 들어간다. 
필자의 경우 Keychron이다.
그 뒤 자신의 기종을 찾아서 들어간다.
keymaps라는 폴더가 있을 수도 있고, ansi라는 폴더와 다른 폴더들이 보일 수도 있다.
ansi가 있는 사람은 ansi 안으로 들어가면 keymaps가 있다.

keymaps 안으로 들어가준다.
default폴더를 복붙해준 뒤, 이름을 알아서 바꿔주자.
이것이 키맵의 이름이 된다.
!!! 이름은 반드시 영어로 해야한다. 필자도 폴더 이름을 kkug로 변경하였다.

그 뒤 이름을 바꾼 폴더 안으로 들어가준다.
이렇게 keymap.c와 rules.mk 파일이 보일 것이다. 혹시 파일 확장자가 보이지 않을 시
따라 눌러준다.

이제 config.h라는 파일을 하나 만들어 줄 것이다.
우클릭 > 새로 만들기 > 텍스트 문서
위에 따라 텍스트 문서를 하나 만들면 '새 텍스트 문서.txt'라는 파일이 하나 생성되었을 것이다.
이 '새 텍스트 문서.txt'를 'config.h'로 바꿔준다.

config.h를 열어 아래를 복붙후 저장한다.
#pragma once

#define DEBOUNCE 10
#define USB_POLLING_INTERVAL_MS 1
rules.mk를 열어 아래를 복붙후 저장한다.
DEBOUNCE_TYPE = sym_defer_g

!!! 꾹보드를 널널하게 하고싶으면 #define DEBOUNCE 10에서 10을 더 큰 수로 변경해준다.
!!! 너무 큰 수로 하면 키 씹힘이 많아진다.
!!! 너무 작은 수로 하면 입력 딜레이는 줄어들지만 '안녀ㅕㅇ하세ㅔ요'같이 한번 키 입력에 여러번 입력되는 오류가 발생한다.


4. 펌웨어 변경
이제 꾹보드를 만들어 보겠다.
qmk_firmware 폴더로 다시 돌아간다.
이번엔 quantum폴더로 들어가준다.
action.c라는 파일을 찾는다.
이름을 action.backup으로 변경한다.
action.zip을 다운로드 후 안에 있는 action.cquantum폴더에 넣는다.
!!! 꾹보드를 일반 키보드로 되돌리는 방법은 방금 넣은 action.c를 삭제하고 action.backup의 이름을 action.c로 변경하 후 다시 펌웨어를 flash하면 된다.
!!! 원래대로 되돌아가지 않는다면, action.c를 열어서 아무 글자나 입력하고 지운 뒤 저장하고 flash해준다.


5. 키보드 flash
이제 마지막 단계이다. 이 수정한 펌웨어를 키보드에 넣도록 하겠다.
키보드를 부트로더로 부팅시킨다.
부트로더로 부팅 시키는 법은 다양하다.
구글에 아래에 맞게 검색해 본다.
(키보드 이름) bootloader 
(키보드 이름) DFU

필자가 보유중인 v1은 스페이스바 뚜껑 따면 버튼이 있다.
보통 버튼이 있을텐데, 버튼을 누른 채로 키보드를 컴퓨터와 연결한다.
LED가 켜지지 않아야 정상이다.
잘 연결되었는지는 QMK Toolbox에서 볼 수 있다.

QMK MSYS를 켠다.
우리가 입력해야 하는 명령어는 아래와 같다.
qmk flash -kb <keyboard> -km <키맵이름>

여기서 우리는 <keyboard>에 무엇이 들어가야 하는지 알아야한다.
(제조사)/(키보드)
(제조사)/(키보드)/ansi
둘 중 하나인데, 아까 ansi라는 폴더를 봤다면 밑, 아니면 위이다.
필자는 ansi라는 폴더가 있었기 때문에, keychron/v1/ansi이다.

<키맵이름>에는 아까 정하였던 키맵의 이름을 넣으면 된다. 필자는 kkug이다.

최종적으로 필자의 명령어는 아래와 같다.
qmk flash -kb keychron/v1/ansi -km kkug
그대로 QMK MSYS에 입력하고 엔터키를 누른다.
완료된 모습이며, 만약 Trying again every 0.5s (Ctrl+C to cancel)........같은 구간에서 넘어가지 않는다면,
1. 키보드가 부트로더(DFU) 모드가 아니다.
2. 컴퓨터에서 인식을 못하였다.
둘 중 하나이다.
사이즈가 큰 키맵을 만지다가 2 같은 상황이 만들어질 수 있는데, 그때는 DFU 버튼을 누른 채로 인식할 때까지 뺐다 꽂았다를 수십 번 반복하면 된다.

꾹보드가 잘 작동하는지 확인한다.
ㅁㅇㄹㄴㅁㅇㄹㄴㅁㅇㄹㄴㅁㅇㄹㄴㅁㅇㄹㄴㅁㅇㄹㄴㅁㅇㄹㄴㅁㅇㄹㄴ
멮멮멮멮멮멮멮멮멮멮멮멮멮멮멮멮멮
잘 작동한다.


(번외) 원리 및 추가사항

꾹보드의 기본 원리
꾹보드와 꾹보드가 아닌 키보드의 차이
-> 동시 입력의 패킷 전송 방식의 차이

예시로 필자가 a와 s를 a가 조금 더 빠르게 눌렀다고 하자.
그럼 assssssssssssssssssssss와 같이 입력이 될 것이다.
이는 키보드가 USB 패킷을 아래와 같은 순서로 보내기 때문이다.
a가 눌림
a, s가 눌림
따라서 a가 먼저 눌려있는 상태로 s가 추가된 것이다.

반대로 s를 조금 더 빠르게 누른다면 패킷은
s가 눌림
a, s가 눌림
와 같이 전송될 것이다.

그러면, 완전 동시에 누르게 되면 어떻게 될까?
a, s가 눌림 <- 이 패킷이 바로 전송되어야 하는게 아닌가?
여기서 꾹보드와 꾹보드가 아닌 키보드의 차이가 보여진다.

꾹보드와 아닌 키보드의 패킷 전송은 아래와 같다. asdf 동시 입력을 예시로 들어보겠다.

꾹보드
a, s, d, f가 눌림

꾹보드X
a가 눌림
a, s가 눌림
a, s, d가 눌림
a, s, d, f가 눌림

꾹보드는 동시에 눌린 여러개의 키를 정직하게 한 패킷에 넣어 보냈다.
반대로 꾹보드가 아닌 키보드는 a, s, d, f를 따로 보냈다. (키코드의 값이 더 낮은 것을 먼저 보낸다.)

꾹보드가 아닌 키보드의 경우, 입력이 동시에 일어났을 경우 키를 하나씩 처리하기 때문에, 패킷에 키가 하나씩 들어갈 수밖에 없다.
반대로 키를 하나씩 처리하는 것이 아니라 물리적으로 눌려있는 키를 싹 스캔해서 하나의 패킷에 넣으면 되는 것이다.
QMK에서 키 눌림을 처리하는 코드는 action.c에 있었고, 이 부분을 수정하여 물리적으로 눌려있는 키를 모두 하나의 패킷에 넣도록 수정하였다.

config.h와 rules.mk에 대하여
config.h
#pragma once

#define DEBOUNCE 10
#define USB_POLLING_INTERVAL_MS 1
rules.mk
DEBOUNCE_TYPE = sym_defer_g

DEBOUNCE
키보드의 키를 눌렀을 때, 키보드 스위치가 닫히면서 전류가 흐르게 된다.
(출처: freeCodeCamp)
위 그림에서 high 상태면 눌린 상태, low상태면 눌리지 않은 상태라고 보면 된다.
스위치가 닫히며 전압에 변화가 생기게 되는데, 이 변화가 깔끔하지가 않다.
위 그림처럼 전압이 내려갔다 올라갔다하는 구간이 있다. 이 오락가락하는 것을 BOUNCE(바운스)라고 한다.
이 BOUNCE를 잡아주는 것을 DEBOUNCE라고 한다.

config.h에서 DEBOUNCE 뒤에 넣은 숫자는 몇 ms(미리초)동안 이 오락가락하는 BOUNCE가 없이 안정되어야 입력으로 인정하겠느냐? 이다.
rules.mk에서 DEBOUNCE_TYPE은 디바운스 처리 알고리즘을 선택하는 것으로, 필자는 sym_defer_g를 썼는데, 디바운스는 대표적으로 3개가 쓰인다
sym_defer_g
sym_defer_pk
sym_eager_pk

defer vs eager
defer: 키 눌림 -> 불안정한 입력 무시 -> 안정 -> 전달
eager: 키 눌림 -> 전달 -> 불안정한 입력 무시 -> 안정
안정되기를 기다린 후 전달하는 것과 전달하고 안정되기를 기다리는 것의 차이이다.
(게임용 설정에서는 sym_eager_pk를 쓰자.)

g는 global, 전체 키보드에서 디바운스를 하겠다는 이야기인데,
sym_defer_g에서 DEBOUNCE값이 10이면 10ms동안 안정되어야 신호를 전달하게 된다.
a를 누르고 9ms동안 안정된 상태를 유지한 상태라고 하자. 그럼 1ms 후에는 a 신호가 전달되어야 한다.
하지만 여기서 s를 누르게 되면, 1ms가 지나더라도 a 신호는 전달되지 않고, s가 안정된 후 10ms가 지나기를 기다린다.
이렇듯 마지막 입력을 기준으로 디바운스를 기다리는 것이 g이다. <- 안정된 후 한번에 키들을 전송하기 때문에 꾹보드를 구현하기에는 최적의 설정이다.

pk는 per key, 키마다 디바운스를 하겠다는 이야기인데
위에서와는 다르게 a가 신호 전달되기 전에 s를 눌러도 a는 그냥 10ms 지나면 신호가 전달된다.

참고 바란다.

#define USB_POLLING_INTERVAL_MS는 키보드와 컴퓨터가 얼마 간격으로 통신을 주고받을 것이냐이다.
1이면 1ms로, 초당 1000번이다.
키보드 스펙을 보면 polling rate가 있는데, 이는 키보드가 컴퓨터와 초당 패킷을 주고받을 수 있는 최대 횟수이다.
참고로 키보드 스펙을 볼 때 polling rate 말고도 scan rate도 잘 봐야한다.



질문이나 수정사항은 댓글로 받겠습니다.
키보드에 대한 전문 지식을 가지고 있지 않습니다.
글을 엄청 못쓰지만 정보를 공유하고 도움을 드리고 싶어 한번 써 보았습니다.
읽어주셔서 감사합니다.

모바일 게시판 하단버튼

댓글

새로고침
새로고침

모바일 게시판 하단버튼

지금 뜨는 인벤

더보기+

모바일 게시판 리스트

모바일 게시판 하단버튼

글쓰기

모바일 게시판 페이징

최근 HOT한 콘텐츠

  • 메이플
  • 게임
  • IT
  • 유머
  • 연예
AD