[태그:] Keycode

  • MCU는 어떤 일을 할까? 키보드 입력을 처리하는 핵심 칩의 역할

    MCU는 어떤 일을 할까? 키보드 입력을 처리하는 핵심 칩의 역할

    LINK&TEM GUIDE

    MCU는 어떤 일을 할까?

    키 입력 감지부터 Keycode 처리와 USB 전송까지 키보드 컨트롤러의 역할

    📌 핵심 요약
    • MCU는 키보드 내부에서 펌웨어를 실행하는 작은 컴퓨터 역할을 합니다.
    • 키보드 매트릭스를 반복해서 스캔하며 어떤 스위치가 눌렸는지 확인합니다.
    • 감지한 위치를 Keycode로 변환하고 레이어, 매크로, 조합키 규칙을 처리합니다.
    • 처리가 끝난 입력은 USB 또는 무선 통신 규격에 맞는 리포트로 PC에 전달됩니다.
    • MCU의 성능뿐 아니라 GPIO 수, 플래시·RAM 용량, USB 지원 방식도 키보드 설계에 중요합니다.

    키보드에서 키를 누르면 스위치가 전기적으로 연결되고, 그 신호가 곧바로 문자로 바뀌어 PC에 전달된다고 생각하기 쉽습니다. 하지만 스위치는 자신이 어떤 글자인지 알지 못합니다. 스위치가 만들어내는 것은 특정 회로가 연결되었다는 단순한 전기적 변화뿐입니다.

    이 변화를 읽고, 어느 위치의 키가 눌렸는지 판단하고, 현재 레이어에서 어떤 기능을 실행해야 하는지 결정한 뒤, 컴퓨터가 이해할 수 있는 입력 데이터로 만들어 보내는 부품이 바로 MCU입니다.

    MCU는 Microcontroller Unit의 약자로, 프로세서와 메모리, 입출력 장치가 하나의 칩 안에 통합된 소형 제어 장치입니다. 키보드에서는 QMK와 같은 펌웨어를 실행하면서 매트릭스 스캔, 디바운스, Keycode 해석, LED 제어, USB 통신 등을 반복적으로 처리합니다.

    따라서 MCU를 이해하면 키보드 입력이 왜 단순한 스위치 연결만으로 끝나지 않는지, QMK 펌웨어가 어디에서 실행되는지, EEPROM과 플래시 메모리는 각각 무엇을 저장하는지, STM32와 RP2040 같은 칩의 차이가 실제 키보드에 어떤 영향을 주는지까지 하나의 흐름으로 이해할 수 있습니다.


    1. MCU는 키보드 안의 작은 컴퓨터다

    MCU를 가장 쉽게 설명하면 키보드 안에 들어 있는 작은 컴퓨터입니다. 일반적인 PC의 CPU처럼 명령어를 실행하지만, 문서 작성이나 영상 편집처럼 범용 작업을 수행하는 것이 아니라 키보드 제어에 필요한 작업을 빠르고 반복적으로 처리하도록 사용됩니다.

    MCU 내부에는 명령을 실행하는 CPU 코어, 펌웨어를 저장하는 플래시 메모리, 실행 중인 데이터를 보관하는 RAM, 외부 회로와 신호를 주고받는 GPIO, 시간을 측정하는 타이머, USB와 같은 통신 장치가 통합되어 있습니다.

    키보드 MCU에 들어 있는 대표 구성
    • CPU 코어 : 펌웨어의 명령어를 순서대로 실행
    • 플래시 메모리 : QMK 펌웨어와 기본 키맵을 저장
    • RAM : 현재 키 상태와 실행 중인 임시 데이터를 보관
    • GPIO : 키보드의 행과 열, LED, 로터리 엔코더 등을 연결
    • 타이머 : 스캔 주기, 디바운스, 탭·홀드 시간을 측정
    • 통신 장치 : USB, UART, SPI, I²C 등의 데이터 전송을 담당

    이 구성 요소들은 각각 따로 움직이는 것이 아니라 펌웨어의 지시에 따라 연결됩니다. 예를 들어 CPU 코어가 GPIO의 상태를 읽고, RAM에 저장된 이전 키 상태와 비교한 뒤, 새로운 입력이 발견되면 플래시에 저장된 키맵을 참고하여 어떤 Keycode를 처리할지 결정하는 방식입니다.

    일반적인 데스크톱 프로세서와 비교하면 MCU의 동작 속도와 메모리 용량은 작습니다. 하지만 키보드는 대규모 프로그램을 실행할 필요가 없기 때문에 중요한 것은 절대적인 연산 성능보다 입력을 일정한 주기로 안정적으로 처리하는 능력입니다.

    🔍 Link&Tem Insight

    MCU는 CPU만을 의미하지 않습니다. CPU 코어를 포함해 플래시, RAM, GPIO, 타이머, USB 컨트롤러 같은 주변 장치를 하나의 칩에 통합한 부품입니다. 키보드 PCB에서 MCU 하나가 여러 기능을 처리할 수 있는 이유도 이러한 통합 구조에 있습니다.

    2. 키보드가 켜지면 MCU에서 일어나는 일

    키보드를 USB 포트에 연결하거나 무선 키보드의 전원을 켜면 MCU는 저장된 펌웨어를 읽어 실행하기 시작합니다. 이 과정을 부팅 또는 초기화라고 부릅니다.

    초기화 단계에서는 MCU의 동작 클록을 설정하고, 키보드의 행과 열에 연결된 GPIO 방향을 지정하며, USB 통신 장치와 타이머를 준비합니다. EEPROM이나 별도의 비휘발성 저장 영역에 사용자 설정이 있다면 이 값도 불러옵니다.

    전원을 넣은 뒤의 기본 흐름
    1. MCU가 리셋 상태에서 시작합니다.
    2. 플래시 메모리에 저장된 펌웨어를 실행합니다.
    3. 클록, GPIO, 타이머와 통신 장치를 초기화합니다.
    4. 저장된 키맵 및 사용자 설정을 불러옵니다.
    5. USB 장치 정보를 PC에 전달하여 키보드로 인식시킵니다.
    6. 키보드 매트릭스 스캔을 반복하기 시작합니다.

    유선 USB 키보드라면 MCU는 자신이 어떤 종류의 장치인지 PC에 알려야 합니다. 이때 키보드는 일반적으로 USB HID 장치로 동작합니다. 운영체제가 장치를 정상적으로 인식하면 별도의 전용 드라이버를 설치하지 않아도 기본 키 입력을 받을 수 있습니다.

    초기화가 끝난 뒤에는 프로그램이 종료되지 않습니다. MCU는 전원이 꺼질 때까지 매트릭스를 읽고, 입력 변화를 확인하고, 필요한 기능을 실행하는 루프를 계속 반복합니다.

    💡 TIP

    키보드의 LED는 켜지지만 PC에서 입력 장치로 인식되지 않는다면 전원 공급은 되고 있어도 MCU의 펌웨어 실행, USB 데이터 연결, 부트로더 또는 USB 초기화 과정에 문제가 있을 수 있습니다. 이때는 케이블과 포트를 먼저 확인한 뒤 펌웨어 상태를 점검하는 것이 좋습니다.

    3. MCU는 키가 눌렸는지 어떻게 찾을까?

    대부분의 키보드는 모든 스위치를 MCU 핀에 하나씩 직접 연결하지 않습니다. 키가 많아질수록 필요한 배선과 GPIO 수가 지나치게 증가하기 때문입니다. 대신 스위치를 행과 열로 묶은 키보드 매트릭스 구조를 사용합니다.

    예를 들어 5개의 행과 15개의 열로 구성된 매트릭스라면 최대 75개 위치를 20개의 신호선으로 확인할 수 있습니다. MCU는 특정 행이나 열에 신호를 보낸 다음 반대쪽 선의 상태를 읽으며 어느 교차점이 연결되었는지 조사합니다.

    단계 MCU가 수행하는 작업
    1 하나의 행 또는 열을 활성화
    2 반대 방향의 입력 핀 상태를 읽음
    3 다음 행 또는 열로 이동
    4 전체 매트릭스의 현재 상태를 완성
    5 이전 상태와 비교해 눌림과 해제를 판별

    QMK 공식 문서에서는 매트릭스 스캔을 키보드 펌웨어의 핵심 기능으로 설명합니다. 실제로 MCU는 이 과정을 매우 짧은 간격으로 반복하면서 사용자가 키를 누르거나 떼는 순간을 찾아냅니다. :contentReference[oaicite:0]{index=0}

    매트릭스 스캔은 한 번만 실행되는 작업이 아닙니다. MCU는 전체 행과 열을 읽은 직후 다시 처음부터 스캔합니다. 이 반복 속도를 스캔 레이트라고 하며, 실제 입력 지연에는 스캔 주기뿐 아니라 디바운스 시간, 펌웨어 처리, USB 리포트 전송 주기도 함께 영향을 줍니다.

    🔍 Link&Tem Insight

    높은 클록 속도의 MCU를 사용한다고 키보드 지연 시간이 자동으로 크게 줄어드는 것은 아닙니다. 매트릭스 구조, 스캔 코드, 디바운스 알고리즘, USB 폴링 간격과 펌웨어 기능의 처리 방식이 함께 맞아야 안정적인 입력 성능을 얻을 수 있습니다.

    4. 스위치 신호가 바로 입력되지 않는 이유

    기계식 스위치의 금속 접점은 눌리는 순간 한 번만 깔끔하게 붙지 않을 수 있습니다. 접점이 매우 짧은 시간 동안 여러 번 붙었다 떨어지는 현상이 발생할 수 있으며, 이를 바운스라고 합니다.

    MCU가 모든 전기적 변화를 그대로 입력으로 처리하면 사용자는 키를 한 번 눌렀는데 같은 문자가 두 번 이상 입력될 수 있습니다. 이를 방지하기 위해 펌웨어는 일정한 기준에 따라 신호를 안정화하는 디바운스 처리를 수행합니다.

    디바운스는 단순히 일정 시간 동안 입력을 무시하는 방식으로만 동작하지 않습니다. 펌웨어에 따라 전체 매트릭스의 변화를 기준으로 판단하거나, 각 키의 상태를 개별적으로 추적하거나, 연속해서 동일한 상태가 확인되었을 때만 입력을 확정할 수 있습니다.

    MCU가 구분해야 하는 키 상태
    • 이전에도 눌려 있었고 지금도 눌려 있는 상태
    • 이전에는 없었지만 새롭게 눌린 상태
    • 이전에는 눌려 있었지만 지금은 해제된 상태
    • 접점 바운스로 인해 짧게 반복되는 불안정한 상태

    디바운스 시간을 지나치게 길게 설정하면 채터링은 줄어들 수 있지만 빠르게 같은 키를 연타할 때 반응이 둔해질 수 있습니다. 반대로 너무 짧게 설정하면 오래되었거나 접점 상태가 좋지 않은 스위치에서 중복 입력이 나타날 수 있습니다.

    💡 TIP

    특정 키에서만 중복 입력이 발생한다면 MCU 성능보다 해당 스위치의 접점 상태나 소켓 접촉 문제를 먼저 확인하는 것이 좋습니다. 여러 키에서 동시에 문제가 나타난다면 펌웨어의 디바운스 설정과 매트릭스 회로도 함께 점검해야 합니다.

    5. 위치 정보는 어떻게 Keycode로 바뀔까?

    MCU가 매트릭스에서 확인하는 것은 문자가 아니라 행과 열의 위치입니다. 예를 들어 특정 키를 눌렀을 때 MCU가 처음 얻는 정보는 “2번 행과 4번 열이 연결되었다”와 같은 좌표입니다.

    이 좌표를 실제 기능으로 바꾸는 기준이 키맵입니다. 펌웨어는 현재 활성화된 레이어의 키맵을 확인해 해당 위치에 지정된 Keycode를 찾습니다.

    같은 물리적 스위치라도 기본 레이어에서는 숫자 키로 작동하고, Fn 레이어에서는 기능키나 미디어 제어 키로 작동할 수 있습니다. MCU는 현재 레이어 상태, 눌린 수정키, 탭·홀드 조건 등을 함께 확인한 뒤 최종 동작을 결정합니다.

    처리 정보 의미
    행·열 좌표 실제로 눌린 스위치의 물리적 위치
    레이어 상태 현재 적용해야 할 키맵 선택
    Keycode 해당 위치에서 실행할 기능을 나타내는 내부 값
    키 이벤트 새로 눌렸는지 또는 해제되었는지 나타내는 변화

    QMK에서는 기본 키보드 입력뿐 아니라 레이어 전환, 매크로, 탭 댄스, 원샷 모디파이어와 같은 기능도 Keycode와 이벤트 처리 구조 안에서 실행됩니다. 사용자 정의 Keycode 역시 펌웨어가 정해진 범위의 값으로 구분하여 처리할 수 있습니다. :contentReference[oaicite:1]{index=1}

    🔍 Link&Tem Insight

    Keycode는 PC에 그대로 전송되는 문자 자체와 같지 않습니다. MCU 내부에서 기능을 구분하기 위한 값이며, 일부 Keycode는 키보드 안에서만 처리됩니다. 예를 들어 레이어 전환 Keycode는 PC로 전송되지 않고 MCU가 활성 레이어를 바꾸는 데 사용됩니다.

    6. MCU와 QMK Firmware는 어떤 관계일까?

    MCU가 키보드의 하드웨어라면 QMK Firmware는 그 하드웨어에서 실행되는 소프트웨어입니다. MCU만 PCB에 장착되어 있다고 해서 자동으로 키 입력을 처리하는 것은 아닙니다. 어떤 GPIO를 행과 열로 사용할지, 키맵을 어떻게 읽을지, USB 데이터를 어떤 형식으로 보낼지를 정의한 펌웨어가 필요합니다.

    QMK 공식 설명처럼 키보드 안의 프로세서는 버튼 입력을 감지하고 그 정보를 호스트 컴퓨터에 전달하는 소프트웨어를 실행합니다. 사용자가 QMK 키맵을 빌드한다는 것은 결국 특정 MCU가 실행할 프로그램을 만드는 과정입니다. :contentReference[oaicite:2]{index=2}

    하드웨어와 펌웨어의 역할 구분
    • MCU : 명령어를 실행하고 실제 전기 신호를 읽는 장치
    • QMK Firmware : 키 입력을 어떻게 처리할지 정의한 프로그램
    • 키맵 : 각 물리적 위치에 어떤 기능을 넣을지 정한 데이터
    • 부트로더 : 새로운 펌웨어를 MCU에 기록할 수 있게 해주는 프로그램

    QMK를 빌드하면 선택한 키보드와 MCU에 맞는 실행 파일이 만들어집니다. AVR 계열에서는 HEX 파일이 사용되는 경우가 많고, ARM 기반 MCU에서는 BIN이나 UF2 같은 형식이 사용될 수 있습니다. 생성된 파일을 부트로더를 통해 플래시에 기록하면 MCU가 다음 부팅부터 새로운 펌웨어를 실행합니다.

    잘못된 키맵을 작성하면 특정 키가 다른 기능으로 작동할 수 있고, 보드 설정이나 핀 정의가 잘못되면 매트릭스 자체를 읽지 못할 수도 있습니다. 따라서 펌웨어는 단순한 키 배치표가 아니라 MCU의 주변 장치와 키보드 회로를 제어하는 전체 프로그램에 가깝습니다.

    💡 TIP

    펌웨어를 직접 플래싱하기 전에는 키보드 모델과 리비전, MCU 종류, 부트로더 방식을 반드시 확인해야 합니다. 이름이 비슷한 다른 PCB용 파일을 기록하면 키 배열이나 USB 연결이 정상적으로 작동하지 않을 수 있습니다.
    Part 1 정리

    MCU는 키보드 매트릭스를 반복해서 스캔하고, 불안정한 스위치 신호를 정리한 뒤, 눌린 위치를 현재 레이어의 Keycode로 변환하는 핵심 제어 장치입니다. 이 모든 과정은 MCU에 저장된 QMK와 같은 펌웨어가 지시합니다. 다음 내용에서는 MCU가 처리한 Keycode를 USB 리포트로 전송하는 과정과 플래시·RAM·EEPROM의 차이, RGB와 무선 기능이 MCU 자원을 사용하는 방식, STM32와 RP2040을 선택할 때 확인해야 할 기준을 이어서 살펴봅니다.

    7. MCU가 USB HID Report를 만드는 과정

    키보드 매트릭스에서 눌린 스위치를 확인하고 해당 위치를 Keycode로 변환했다고 해서 입력 처리가 끝나는 것은 아닙니다. MCU는 이 정보를 컴퓨터가 이해할 수 있는 형식으로 다시 정리해야 합니다. USB 키보드에서는 일반적으로 이 데이터가 HID Report 형태로 전달됩니다.

    키 입력이 USB 데이터가 되는 흐름
    스위치 상태 확인 → 행과 열 좌표 판별 → Keycode 조회 → Modifier와 일반 키 구분 → HID Report 생성 → USB 엔드포인트를 통해 PC로 전송

    예를 들어 사용자가 Ctrl+C를 누르면 MCU는 Ctrl 키를 일반 문자 키와 똑같이 처리하지 않습니다. Ctrl, Shift, Alt, GUI와 같은 키는 Modifier 영역에 기록하고, C 키는 별도의 Keycode 영역에 기록합니다. 이렇게 만들어진 Report를 컴퓨터가 읽으면 운영체제는 두 키가 동시에 눌렸다고 해석합니다.

    Report 요소 담기는 정보 예시
    Modifier Ctrl, Shift, Alt, GUI 상태 왼쪽 Ctrl이 눌렸는지 표시
    일반 Keycode 문자, 숫자, 기능키 입력 A, Enter, F1 등
    상태 변화 키가 눌렸는지 해제됐는지 C 입력 후 빈 Report 전송

    키를 떼는 동작도 중요합니다. MCU가 키가 눌렸다는 Report만 보내고 해제됐다는 상태를 보내지 않으면 컴퓨터는 해당 키가 계속 눌린 것으로 판단할 수 있습니다. 따라서 MCU는 매 스캔 주기마다 현재 상태를 비교하고, 필요한 경우 새로운 Report를 만들어 전송합니다.

    핵심 포인트 Polling Rate는 컴퓨터가 키보드의 USB 데이터를 확인하는 빈도와 관련되고, Scan Rate는 MCU가 키 매트릭스를 검사하는 빈도와 관련됩니다. 두 값은 서로 연결되어 있지만 같은 개념은 아닙니다.

    8. Flash, RAM, EEPROM은 각각 무엇을 저장할까?

    MCU 내부에는 모든 데이터를 같은 방식으로 저장하는 하나의 공간만 있는 것이 아닙니다. 펌웨어 코드, 실행 중에 바뀌는 값, 전원이 꺼진 뒤에도 유지해야 하는 설정은 서로 다른 성격을 가지므로 각각 적합한 메모리 영역이 사용됩니다.

    메모리 주요 역할 전원 차단 후 유지 키보드에서의 예시
    Flash 펌웨어 프로그램과 고정 데이터 저장 유지됨 QMK 코드, 키맵, 기능 모듈
    RAM 실행 중 필요한 임시 상태 저장 유지되지 않음 현재 눌린 키, 매트릭스 상태, 타이머 값
    EEPROM 사용자가 변경한 설정 저장 유지됨 기본 레이어, RGB 설정, 일부 사용자 옵션

    Flash에는 MCU가 실행할 펌웨어가 기록됩니다. 키보드에 새로운 펌웨어를 플래싱한다는 것은 일반적으로 이 Flash 영역의 프로그램을 교체하는 작업입니다. 펌웨어 용량이 MCU의 Flash 크기를 넘으면 빌드가 실패하거나 일부 기능을 제외해야 합니다.

    RAM은 키보드가 작동하는 동안 계속 바뀌는 데이터를 처리합니다. 현재 활성화된 레이어, 눌린 키 목록, 디바운스 상태, RGB 애니메이션 계산값, USB 전송 버퍼 등이 RAM을 사용할 수 있습니다. 전원이 꺼지면 이 내용은 사라지며, 다음 부팅 때 다시 초기화됩니다.

    EEPROM은 사용자가 변경한 설정을 전원 차단 후에도 유지할 때 사용됩니다. 다만 모든 MCU가 별도의 물리 EEPROM을 내장하는 것은 아닙니다. 일부 MCU나 펌웨어 환경에서는 Flash의 일부 영역을 EEPROM처럼 사용하는 에뮬레이션 방식이 사용될 수 있습니다.

    TIP. 펌웨어 용량이 부족할 때 사용하지 않는 RGB 효과, 오디오 기능, 콘솔 출력, 마우스 키, OLED 기능 등을 비활성화하면 Flash와 RAM 사용량을 줄일 수 있습니다. MCU 성능이 충분해도 저장 공간이 작으면 원하는 기능을 모두 넣기 어려울 수 있습니다.

    9. RGB, OLED, Encoder도 MCU가 처리한다

    MCU의 역할은 키 입력 처리에만 한정되지 않습니다. 최근 커스텀 키보드에는 RGB LED, OLED 화면, 로터리 Encoder, 터치 센서, 무선 통신 모듈처럼 다양한 부품이 추가됩니다. 이 장치들은 대부분 MCU와 직접 또는 간접적으로 통신하며, 펌웨어는 정해진 주기마다 각 장치의 상태를 읽거나 데이터를 출력합니다.

    RGB LED
    색상과 밝기를 계산하고 LED 배열에 데이터를 전송합니다. 복잡한 애니메이션은 연산량과 메모리 사용량을 늘릴 수 있습니다.
    “`
    OLED
    레이어, Caps Lock, 로고, 애니메이션 등을 화면 버퍼에 구성한 뒤 I²C 또는 SPI 방식으로 디스플레이에 전달합니다.
    Rotary Encoder
    두 신호의 변화 순서를 읽어 회전 방향을 판별합니다. 이후 볼륨 조절이나 스크롤 같은 Keycode를 실행합니다.
    무선 통신
    Bluetooth 또는 2.4GHz 모듈과 통신하고 연결 상태, 절전, 배터리 관리, 입력 전송을 처리합니다.
    “`

    기능이 많아질수록 MCU가 해야 할 일도 증가합니다. 그러나 단순히 클럭 속도가 높은 MCU를 사용한다고 모든 문제가 해결되는 것은 아닙니다. 펌웨어의 작업 순서, 인터럽트 처리, 통신 방식, 메모리 관리가 비효율적이면 키 스캔이 지연되거나 RGB 애니메이션이 끊길 수 있습니다.

    성능보다 중요한 것은 작업 배분이다
    키 입력 스캔은 짧고 일정한 주기로 반복되어야 합니다. OLED 화면을 한 번 갱신하는 데 너무 긴 시간이 걸리거나, RGB 효과 계산이 메인 루프를 오래 점유하면 입력 응답에 영향을 줄 수 있습니다. 좋은 펌웨어는 부가 기능이 핵심 입력 처리를 방해하지 않도록 구성됩니다.

    10. STM32와 RP2040이 키보드에 많이 사용되는 이유

    커스텀 키보드에서 자주 볼 수 있는 MCU 계열로는 STM32와 RP2040이 있습니다. 두 계열 모두 다양한 기능을 구현할 수 있지만, 내부 구조와 개발 환경, USB 구성, 메모리 용량, 보드 설계 방식에는 차이가 있습니다.

    비교 항목 STM32 RP2040
    제품 구성 성능과 주변장치가 다른 다양한 모델 존재 대표 칩 중심으로 비교적 통일된 구성
    CPU 구조 모델에 따라 Cortex-M0, M3, M4 등 다양 듀얼 코어 Cortex-M0+
    프로그램 저장 대체로 내부 Flash 사용 외부 QSPI Flash 사용
    키보드 장점 선택지가 많고 제품별 최적화 가능 넉넉한 자원과 편리한 부트로더 환경
    주의점 정확한 모델에 따라 사양 차이가 큼 외부 Flash와 전원 회로를 함께 설계해야 함

    STM32는 하나의 MCU가 아니라 매우 넓은 제품군입니다. 따라서 STM32라는 이름만 보고 성능을 단정하기 어렵습니다. 정확한 모델명과 Flash, RAM, GPIO 수, USB 지원 여부를 함께 확인해야 합니다.

    RP2040은 비교적 넉넉한 SRAM과 듀얼 코어, 유연한 PIO 기능을 갖추고 있으며, 부트셀 버튼을 활용한 파일 복사 방식의 펌웨어 기록이 편리한 편입니다. QMK 기반 키보드에서도 RP2040을 사용하는 컨트롤러와 PCB가 점차 보편적으로 활용되고 있습니다.

    어느 쪽이 무조건 더 좋을까? MCU 이름만으로 키보드의 입력 지연이나 완성도를 판단하기는 어렵습니다. PCB 회로, USB 설정, 스캔 방식, 디바운스 알고리즘, 펌웨어 최적화가 함께 작동하기 때문입니다. 필요한 기능을 안정적으로 처리할 수 있는지가 더 중요합니다.

    11. 좋은 키보드 MCU를 판단하는 기준

    키보드에 적합한 MCU는 단순히 클럭 속도가 가장 높은 제품이 아닙니다. 키 매트릭스 크기와 필요한 부가 기능을 충분히 지원하면서도 펌웨어 생태계와 부품 수급, 전력 소비, PCB 설계 난이도가 균형을 이루어야 합니다.

    확인해야 할 항목
    “`
    ① GPIO 수 키 매트릭스의 행과 열, RGB, Encoder, OLED, 상태 LED 등을 연결할 핀이 충분해야 합니다.
    ② Flash와 RAM 용량 VIA, VIAL, RGB Matrix, OLED, 매크로처럼 기능이 많아질수록 더 많은 저장 공간과 실행 메모리가 필요합니다.
    ③ USB 지원 하드웨어 USB 기능과 펌웨어 지원이 안정적이어야 HID 장치로 원활하게 동작할 수 있습니다.
    ④ 펌웨어 호환성 QMK에서 해당 MCU와 보드를 얼마나 안정적으로 지원하는지, 참고할 수 있는 기존 설계가 충분한지도 중요합니다.
    ⑤ 전력 소비 유선 키보드보다 배터리를 사용하는 무선 키보드에서 특히 중요합니다. 절전 모드와 웨이크업 기능도 확인해야 합니다.
    “`
    결국 MCU는 키보드 전체의 조정자다
    MCU는 스위치 신호를 읽고, 디바운스를 적용하고, 레이어와 Keycode를 해석하고, USB Report를 만든 뒤 컴퓨터로 전달합니다. 동시에 RGB, OLED, Encoder, 저장 설정까지 관리합니다. 우리가 키 하나를 누르는 짧은 순간에도 MCU 내부에서는 여러 단계가 빠르게 반복됩니다.

    자주 묻는 질문

    MCU가 빠르면 키보드 입력도 무조건 빨라질까?
    그렇지는 않습니다. MCU 성능은 중요한 요소지만 매트릭스 스캔 주기, 디바운스 방식, USB Polling 설정, 펌웨어 구조도 함께 영향을 줍니다. 충분한 성능의 MCU에서는 펌웨어 최적화 차이가 더 크게 나타날 수 있습니다.
    “`
    MCU가 고장 나면 스위치만 교체해도 해결될까?
    MCU 자체나 주변 전원·USB 회로가 손상됐다면 스위치 교체만으로 해결되지 않습니다. 전체 키가 작동하지 않거나 USB 인식이 되지 않는다면 MCU, USB 커넥터, 전원 회로, 펌웨어 상태를 함께 확인해야 합니다.
    VIA에서 바꾼 키맵도 MCU에 저장될까?
    VIA를 지원하는 펌웨어에서는 변경된 키맵이나 설정이 MCU의 비휘발성 저장 영역에 기록될 수 있습니다. 구체적인 저장 방식과 범위는 보드의 MCU, QMK 설정, EEPROM 구현에 따라 달라질 수 있습니다.
    무선 키보드에도 MCU가 들어갈까?
    들어갑니다. 무선 키보드의 MCU 또는 무선 SoC는 키 스캔뿐 아니라 Bluetooth 연결, 배터리 상태, 절전 모드, 무선 패킷 전송까지 처리합니다. 제품에 따라 키보드 제어용 MCU와 무선 통신 칩이 분리되기도 합니다.
    키보드마다 펌웨어 파일이 다른 이유는 무엇일까?
    MCU 종류, 핀 연결, 매트릭스 배열, LED 구성, 부트로더, USB 설정이 보드마다 다르기 때문입니다. 외형이 비슷한 키보드라도 다른 보드용 펌웨어를 기록하면 정상 작동하지 않을 수 있습니다.
    “`

    함께 보면 좋은 글

    공식 자료

    Sources

    • QMK Firmware Documentation, Understanding QMK
    • QMK Firmware Documentation, How a Keyboard Matrix Works
    • QMK Firmware Documentation, Quantum Keycodes
    • Raspberry Pi Documentation, RP2040 Microcontroller
    • STMicroelectronics, STM32 32-bit Arm Cortex MCU Documentation
    • USB Implementers Forum, Human Interface Device Class Specifications
    LINK&TEM SUMMARY
    MCU는 키보드의 스위치 신호를 읽고 Keycode와 USB 데이터로 변환하며, 메모리와 RGB·OLED·Encoder 같은 부가 기능까지 통합 관리하는 핵심 제어 장치입니다.
  • Keycode는 어떻게 인식될까? QMK 키 입력 처리 구조 완벽 이해

    Keycode는 어떻게 인식될까? QMK 키 입력 처리 구조 완벽 이해

    LINK&TEM GUIDE

    Keycode는 어떻게 인식될까?

    물리 키 위치가 QMK 키코드와 USB HID 입력으로 바뀌는 과정

    📌 핵심 요약
    • 키보드는 키캡에 적힌 문자보다 먼저 스위치가 연결된 행과 열 위치를 감지합니다.
    • QMK는 감지된 매트릭스 좌표를 현재 활성화된 레이어의 Keycode로 변환합니다.
    • KC_A 같은 기본 Keycode는 일반적으로 USB HID Usage ID와 연결됩니다.
    • 레이어 전환, Mod-Tap, 매크로처럼 복합 기능을 가진 Keycode는 QMK 내부에서 추가 처리를 거칩니다.
    • 최종적으로 만들어진 HID 리포트를 운영체제가 해석해 문자 입력이나 단축키 동작을 실행합니다.

    키보드에서 A 키를 누르면 컴퓨터 화면에 곧바로 알파벳 A가 나타나는 것처럼 보입니다. 하지만 키보드 내부에서는 스위치가 눌린 순간부터 운영체제가 문자를 표시하기까지 여러 단계의 변환이 일어납니다. 그 중심에 있는 값이 바로 Keycode입니다.

    Keycode는 단순히 특정 문자를 의미하는 이름이 아닙니다. 펌웨어가 감지한 물리적인 키 위치에 어떤 기능을 부여할지 결정하는 숫자 값에 가깝습니다. 같은 스위치라도 기본 레이어에서는 A가 될 수 있고, Fn 레이어에서는 볼륨 조절이나 방향키가 될 수 있습니다. 따라서 키보드가 인식하는 것은 처음부터 문자가 아니라 매트릭스 좌표와 그 좌표에 배정된 기능 값입니다.

    특히 QMK Firmware에서는 기본 문자 키뿐 아니라 레이어 전환, Ctrl 조합, Tap-Hold, 매크로, 마우스 이동, 미디어 제어까지 다양한 동작을 Keycode 형태로 관리합니다. 이번 글에서는 스위치가 눌린 뒤 Keycode가 선택되고, QMK 내부 처리 과정을 거쳐 USB HID 리포트로 전달되는 흐름을 순서대로 살펴보겠습니다.


    1. Keycode는 키캡에 적힌 문자가 아니다

    Keycode를 이해할 때 가장 먼저 구분해야 하는 것은 물리 키, Keycode, 실제 입력 문자가 서로 다른 개념이라는 점입니다. 키캡에 A가 인쇄되어 있어도 키보드 회로와 펌웨어가 그 글자를 직접 읽는 것은 아닙니다.

    스위치를 누르면 전기적으로 특정 행과 열이 연결됩니다. MCU는 키보드 매트릭스를 반복해서 스캔하면서 이전 상태와 현재 상태가 달라진 지점을 찾습니다. 예를 들어 2번 행과 4번 열의 스위치가 새롭게 연결되었다면 펌웨어는 먼저 “2행 4열 키가 눌렸다”라는 사실을 알아냅니다.

    그다음 QMK는 현재 활성화된 레이어의 키맵에서 해당 좌표를 조회합니다. 2행 4열에 KC_A가 저장되어 있다면 그제야 이 물리 입력은 KC_A라는 Keycode로 변환됩니다. 같은 좌표에 KC_LEFT가 배치되어 있다면 방향키 왼쪽으로 처리되고, MO(1)가 배치되어 있다면 레이어를 일시적으로 활성화하는 키가 됩니다.

    구분 의미 예시
    물리 키 PCB에서 스위치가 연결된 실제 위치 2행 4열
    Keycode 펌웨어가 해당 위치에 배정한 기능 값 KC_A
    HID Usage 호스트로 전달되는 표준 입력 식별 값 Keyboard a and A
    출력 문자 운영체제의 언어 배열이 최종적으로 만든 결과 a, A 또는 다른 문자
    💡 TIP

    특정 키가 예상과 다른 문자를 입력한다고 해서 항상 스위치나 PCB 문제인 것은 아닙니다. 키맵의 Keycode 배정과 운영체제의 키보드 언어 배열을 먼저 확인하는 것이 좋습니다.
    Link&Tem Insight

    QMK의 언어별 Keycode 별칭은 운영체제의 언어 설정을 직접 변경하지 않습니다. 예를 들어 특정 국가 배열을 위한 별칭을 사용해도 실제 출력 문자는 호스트 운영체제에 선택된 키보드 레이아웃에 따라 결정됩니다. Keycode는 문자 자체보다 키보드 위치와 기능을 전달하는 식별자에 가깝습니다.

    2. 키를 누르면 먼저 매트릭스 좌표가 발견된다

    대부분의 기계식 키보드는 각 스위치를 MCU 핀에 하나씩 직접 연결하지 않고 행과 열로 구성된 매트릭스를 사용합니다. 예를 들어 5개의 행과 15개의 열을 조합하면 비교적 적은 수의 MCU 핀으로 많은 스위치를 검사할 수 있습니다.

    MCU는 한쪽 라인을 순서대로 활성화하고 반대쪽 라인의 전기 상태를 읽는 방식으로 전체 키를 스캔합니다. 특정 행을 활성화했을 때 특정 열에서 신호 변화가 감지되면 그 교차점에 있는 스위치가 눌린 것으로 판단합니다. 이때 얻는 정보는 아직 KC_A나 KC_ENTER가 아니라 행 번호와 열 번호입니다.

    스위치는 접점이 맞닿는 순간 짧은 시간 동안 신호가 여러 번 흔들릴 수 있습니다. 펌웨어는 디바운스 처리를 통해 이 흔들림을 하나의 정상적인 입력으로 정리합니다. 안정된 상태 변화가 확인되면 QMK는 해당 좌표의 키 이벤트를 생성하며, 눌림과 떼어짐을 각각 구분합니다.

    스위치 입력이 Keycode로 바뀌기 전 단계
    1. MCU가 매트릭스의 행과 열을 반복해서 스캔합니다.
    2. 이전 스캔과 현재 스캔의 상태를 비교합니다.
    3. 디바운스 처리를 거쳐 실제 눌림인지 판단합니다.
    4. 변화가 발생한 행과 열 좌표를 확인합니다.
    5. 눌림 또는 떼어짐 상태가 포함된 키 이벤트를 생성합니다.
    6. 활성 레이어의 키맵에서 해당 좌표의 Keycode를 조회합니다.

    이 구조 덕분에 물리 키의 위치와 기능을 분리할 수 있습니다. PCB의 스위치 위치는 그대로 두고 펌웨어의 키맵만 변경해도 완전히 다른 배열을 만들 수 있는 이유입니다. QWERTY 배열을 Colemak이나 Dvorak으로 바꾸거나, Caps Lock 위치에 Ctrl을 배치하는 것도 같은 원리입니다.

    3. QMK는 활성 레이어에서 Keycode를 찾는다

    매트릭스 좌표가 확인되면 QMK는 keymaps 배열에서 해당 위치의 값을 조회합니다. QMK 키맵은 일반적으로 레이어, 행, 열로 구성된 다차원 구조를 사용하며 각 위치에는 16비트 형태의 액션 코드가 저장됩니다.

    기본 레이어가 활성화된 상태에서 A 위치를 누르면 Layer 0의 해당 좌표를 확인합니다. 그러나 Fn 키로 Layer 1이 활성화되어 있다면 같은 물리 위치에서도 Layer 1의 값을 먼저 확인합니다. Layer 1에 KC_F1이 배치되어 있다면 A가 아니라 F1 기능으로 처리됩니다.

    상위 레이어의 해당 위치가 KC_TRNS로 설정되어 있으면 QMK는 그 키를 투명한 위치로 판단합니다. 즉 현재 레이어에서 기능을 확정하지 않고 아래쪽 레이어로 내려가 실제 Keycode를 찾습니다. 반대로 KC_NO가 배치되어 있으면 해당 위치는 아무 동작도 하지 않습니다.

    키맵 값 처리 방식 결과
    KC_A 기본 키 입력으로 처리 A 위치의 HID 입력 전송
    KC_TRNS 아래 레이어의 같은 좌표 조회 하위 레이어 기능 사용
    KC_NO 입력을 실행하지 않음 아무 동작 없음
    MO(1) 누르는 동안 지정 레이어 활성화 Layer 1 사용
    LT(1, KC_SPC) 탭과 홀드 시간을 구분 Space 또는 Layer 1
    Link&Tem Insight

    레이어는 각각 독립된 키보드가 겹쳐 있는 구조에 가깝습니다. QMK는 활성화된 레이어 가운데 우선순위가 높은 레이어부터 좌표를 확인하고, 투명 키를 만나면 아래 레이어로 내려갑니다. 따라서 레이어가 활성화되었다고 해서 모든 키가 반드시 바뀌는 것은 아닙니다.

    4. KC_A는 내부적으로 숫자 값으로 처리된다

    QMK의 키맵 파일을 보면 KC_A, KC_ENTER, KC_LCTRL 같은 이름이 사용됩니다. 사람이 보기에는 문자와 기능 이름이지만 컴파일 과정이 끝난 펌웨어에서는 숫자 값으로 처리됩니다. 이 이름들은 개발자가 키맵을 읽고 수정하기 쉽게 만든 기호입니다.

    QMK 공식 문서에 따르면 Quantum Keycode는 일정한 숫자 범위 안에서 관리됩니다. 기본 키에 해당하는 표준 Keycode는 낮은 범위를 사용하고, 레이어 전환이나 Mod-Tap처럼 추가 정보가 필요한 기능은 다른 비트 영역을 활용합니다. 겉으로는 함수처럼 보이는 Keycode도 전처리와 컴파일 과정을 거치면 펌웨어가 해석할 수 있는 값으로 변환됩니다.

    예를 들어 KC_A는 일반적인 키보드 입력을 나타내는 기본 Keycode입니다. 반면 LCTL(KC_C)는 Ctrl과 C를 함께 보내는 조합을 표현하며, LT(1, KC_SPC)는 짧게 누르면 Space를 보내고 길게 누르면 Layer 1을 활성화하도록 구성됩니다. 이 값들은 모두 같은 방식으로 처리되지 않고 Keycode의 종류에 따라 서로 다른 QMK 처리 루틴으로 전달됩니다.

    ⚠ 주의할 점

    QMK Keycode 이름과 USB HID Usage ID를 완전히 같은 개념으로 보면 안 됩니다. 기본 Keycode는 HID 값과 직접 연결되는 경우가 많지만, 레이어 전환이나 매크로 같은 QMK 전용 Keycode는 호스트로 그대로 전송되지 않고 펌웨어 내부 동작으로 먼저 해석됩니다.

    5. 기본 Keycode와 QMK 전용 Keycode의 차이

    모든 Keycode가 컴퓨터로 곧바로 전송되는 것은 아닙니다. KC_A나 KC_ENTER 같은 기본 Keycode는 최종적으로 USB HID 키보드 리포트에 반영될 수 있지만, MO(1), TG(2), QK_BOOT 같은 QMK 전용 Keycode는 키보드 내부 상태를 변경하기 위해 사용됩니다.

    MO(1)을 누르면 운영체제에 “MO(1) 키가 눌렸다”라는 값이 전달되는 것이 아닙니다. QMK가 해당 Keycode를 먼저 가로채 Layer 1을 활성화하고, 이후 다른 키가 눌렸을 때 Layer 1의 키맵을 조회하도록 내부 상태를 변경합니다. 키를 떼면 해당 레이어를 다시 비활성화합니다.

    Mod-Tap과 Layer-Tap처럼 하나의 키에 두 가지 기능이 들어 있는 Keycode는 눌린 시간, 다른 키의 입력 여부, 탭 횟수 같은 추가 조건도 확인합니다. 따라서 같은 키를 눌러도 짧게 누른 경우와 길게 누른 경우의 결과가 달라질 수 있습니다.

    종류 대표 예시 주요 처리 위치
    기본 키 KC_A, KC_1, KC_ENTER HID 키보드 리포트에 반영
    수정 키 KC_LCTL, KC_LSFT HID Modifier 비트에 반영
    레이어 키 MO(1), TG(1), TO(2) QMK 내부 레이어 상태 변경
    탭·홀드 키 MT(), LT() 입력 시간과 조건 판정 후 기능 결정
    사용자 정의 키 SAFE_RANGE 이후 값 사용자 코드에서 직접 동작 정의
    Keycode 인식 흐름 한눈에 보기
    1. 스위치가 눌리면서 매트릭스의 전기 상태가 변합니다.
    2. MCU가 행과 열 좌표의 변화를 발견합니다.
    3. 디바운스 후 눌림 또는 떼어짐 이벤트가 확정됩니다.
    4. 활성 레이어의 키맵에서 16비트 Keycode를 찾습니다.
    5. QMK가 Keycode 종류와 추가 조건을 분석합니다.
    6. 내부 기능이면 레이어나 펌웨어 상태를 변경합니다.
    7. 일반 입력이면 HID 리포트에 키 상태를 반영합니다.
    8. 운영체제가 HID 입력을 현재 언어 배열에 맞게 해석합니다.
    Part 1 정리

    Keycode 인식은 키캡의 문자를 읽는 과정이 아니라 매트릭스 좌표를 찾고, 활성 레이어의 키맵에서 기능 값을 조회하는 과정입니다. 기본 Keycode는 HID 입력으로 이어질 수 있지만 레이어, Tap-Hold, 매크로 같은 QMK 전용 Keycode는 펌웨어 내부에서 먼저 해석됩니다. 다음 내용에서는 process_record 처리 과정, HID 리포트 생성, 운영체제가 최종 문자를 결정하는 원리와 Keycode 오류를 확인하는 방법을 이어서 살펴보겠습니다.

    6. QMK는 Keycode를 어떤 순서로 처리할까?

    활성 레이어에서 Keycode를 찾았다고 해서 곧바로 PC에 전송되는 것은 아닙니다. QMK는 조회된 Keycode를 여러 처리 단계에 통과시킨 뒤, 최종적으로 어떤 입력을 전송할지 결정합니다.

    이 과정이 필요한 이유는 QMK의 Keycode가 단순한 문자 입력만 표현하지 않기 때문입니다. 일반 키보드의 A 키처럼 바로 전송할 수 있는 입력도 있지만, 레이어 전환, 탭과 홀드 구분, 매크로, 모드 전환처럼 펌웨어 내부에서 먼저 해석해야 하는 기능도 있습니다.

    Keycode 처리 흐름
    1. 키보드 매트릭스에서 눌린 위치를 확인합니다.
    2. 현재 활성화된 레이어를 확인합니다.
    3. 키맵에서 해당 위치의 Keycode를 조회합니다.
    4. QMK 내부 기능이 먼저 Keycode를 검사합니다.
    5. 사용자 정의 처리 함수가 입력을 확인합니다.
    6. 전송 가능한 HID 입력으로 변환합니다.
    7. USB 또는 무선 연결을 통해 PC로 전달합니다.

    예를 들어 키맵에서 조회된 값이 KC_A라면 비교적 단순합니다. QMK는 A 키가 눌렸다는 정보를 HID 리포트에 추가할 수 있습니다. 하지만 조회된 값이 MO(1)이라면 PC에 MO(1)이라는 키를 보내는 것이 아닙니다.

    MO(1)은 QMK 내부에서만 의미가 있는 레이어 기능입니다. 이 Keycode가 눌리는 동안 QMK는 1번 레이어를 활성화하고, 키를 놓으면 다시 비활성화합니다. 즉 일부 Keycode는 운영체제로 전송되는 입력이고, 일부는 펌웨어의 상태를 바꾸는 명령입니다.

    💡 핵심 구분

    모든 Keycode가 PC로 그대로 전송되는 것은 아닙니다. 기본 키는 HID 입력으로 변환되지만, 레이어·매크로·탭홀드 같은 기능 키는 QMK 내부에서 먼저 처리됩니다.

    7. process_record_user는 어떤 역할을 할까?

    QMK에서 사용자 정의 Keycode를 만들거나 특정 키의 동작을 변경할 때 자주 사용하는 함수가 process_record_user입니다. 이 함수는 Keycode가 최종 처리되기 전에 사용자가 입력을 직접 확인하고 필요한 동작을 추가할 수 있게 해줍니다.

    함수에는 현재 인식된 Keycode와 키가 눌렸는지 또는 놓였는지를 나타내는 기록이 전달됩니다. 사용자는 이 값을 기준으로 특정 Keycode가 눌렸을 때 문자열을 입력하거나, 다른 키 조합을 실행하거나, 펌웨어 상태를 변경할 수 있습니다.

    process_record_user에서 할 수 있는 일
    • 사용자 정의 Keycode 동작 실행
    • 특정 키를 다른 키 조합으로 변환
    • 문자열이나 단축키 전송
    • 키가 눌릴 때와 놓일 때의 동작 분리
    • 조건에 따라 기본 Keycode 처리 차단

    이 함수의 반환값도 중요합니다. 일반적으로 true를 반환하면 QMK가 해당 Keycode의 기본 처리를 계속 진행합니다. 반대로 false를 반환하면 이후 기본 처리를 중단할 수 있습니다.

    예를 들어 사용자 정의 Keycode가 눌렸을 때 이미 원하는 매크로를 실행했다면 false를 반환해 동일한 입력이 추가로 처리되지 않도록 만들 수 있습니다. 반면 단순히 입력 상태만 확인하고 원래 Keycode도 정상적으로 동작하게 하려면 true를 반환합니다.

    process_record_user는 Keycode를 새로 만드는 기능이라기보다, 이미 인식된 Keycode가 어떤 동작을 해야 하는지 사용자가 개입할 수 있는 지점이라고 이해하면 쉽습니다.

    8. Keycode는 HID 리포트로 어떻게 변환될까?

    QMK 내부 처리가 끝난 기본 Keycode는 USB HID 규격에 맞는 입력 정보로 변환됩니다. 이때 키보드는 문자 자체를 보내는 것이 아니라, 현재 어떤 키들이 눌려 있는지를 담은 HID 리포트를 전송합니다.

    예를 들어 사용자가 A 키를 누르면 키보드는 PC에 영문 소문자 a라는 글자를 직접 전송하지 않습니다. 대신 키보드 사용 페이지에서 A 위치에 해당하는 HID Usage 정보를 리포트에 기록합니다.

    이후 운영체제가 현재 키보드 배열, Shift 키 상태, Caps Lock 상태, 입력 언어를 확인해 실제 화면에 어떤 문자를 표시할지 결정합니다.

    단계 처리 주체 주요 역할
    물리 키 감지 키보드 MCU 행과 열 좌표 확인
    Keycode 조회 QMK Firmware 레이어와 키맵 해석
    HID 리포트 생성 QMK Firmware 눌린 키 상태를 규격에 맞게 구성
    문자 해석 운영체제 언어와 배열에 맞는 문자 출력
    중요한 점

    Keycode와 화면에 표시되는 문자는 같은 개념이 아닙니다. 같은 KC_A 입력이라도 키보드 배열과 입력 언어에 따라 운영체제가 다르게 해석할 수 있습니다.

    9. Shift·Ctrl·Alt는 일반 키와 무엇이 다를까?

    Shift, Ctrl, Alt, GUI 키는 일반 문자 키와 함께 조합되는 수식 키입니다. HID 키보드 리포트에서는 이러한 키의 상태가 일반 키와 구분되어 관리되는 경우가 많습니다.

    예를 들어 Ctrl+C를 입력하면 QMK는 Ctrl이 눌린 상태와 C가 눌린 상태를 함께 리포트에 반영합니다. 운영체제는 이 조합을 문자 입력이 아니라 복사 명령으로 해석합니다.

    QMK에서는 LCTL(KC_C)처럼 하나의 표현 안에 수식 키와 기본 Keycode를 조합할 수도 있습니다. 이렇게 작성된 Keycode는 눌리는 순간 Ctrl과 C가 함께 활성화되고, 키를 놓으면 함께 해제되는 방식으로 처리됩니다.

    대표적인 수식 키 표현
    • KC_LSFT — 왼쪽 Shift
    • KC_LCTL — 왼쪽 Ctrl
    • KC_LALT — 왼쪽 Alt
    • KC_LGUI — Windows 키 또는 Command 키
    • LCTL(KC_C) — Ctrl+C 조합

    이 구조 덕분에 키 하나로 여러 키의 조합을 실행할 수 있습니다. 다만 운영체제마다 단축키 체계가 다르므로, Windows와 macOS에서 같은 Keycode 조합이 서로 다른 기능으로 동작할 수 있습니다.

    10. 탭홀드 Keycode는 어떻게 구분할까?

    QMK의 강력한 기능 중 하나는 키를 짧게 눌렀을 때와 길게 누르고 있을 때 서로 다른 동작을 실행하는 탭홀드 기능입니다.

    예를 들어 LT(1, KC_SPC)는 짧게 누르면 Space로 동작하고, 누른 채 유지하면 1번 레이어를 활성화합니다. 하나의 물리 키가 두 가지 역할을 가지는 것입니다.

    이 경우 QMK는 키가 눌린 순간 바로 Space를 전송하기 어렵습니다. 사용자가 짧게 누를지, 계속 누르고 있을지 아직 알 수 없기 때문입니다. 따라서 설정된 탭 판정 시간과 이후 입력을 확인해 탭인지 홀드인지 결정합니다.

    💡 탭홀드 처리의 특징

    일반 Keycode는 눌린 즉시 처리할 수 있지만, 탭홀드 Keycode는 입력 시간과 다른 키의 입력 여부까지 확인해야 최종 동작을 결정할 수 있습니다.

    이 때문에 탭홀드 설정에서는 타이핑 습관이 중요합니다. 판정 시간이 너무 짧으면 의도하지 않은 홀드가 발생할 수 있고, 너무 길면 레이어 전환이나 수식 키 동작이 늦게 느껴질 수 있습니다.

    11. Keycode를 눌렀는데 다른 문자가 나오는 이유

    QMK 키맵에서 KC_A를 지정했는데 예상과 다른 문자가 입력된다면, 펌웨어가 Keycode를 잘못 인식했다고 단정하기는 어렵습니다. 키보드는 정상적인 HID 위치 정보를 보냈지만 운영체제의 키보드 배열이 다르게 설정되어 있을 수 있기 때문입니다.

    특히 ANSI와 ISO 배열, 영문과 한글 입력기, 미국식과 유럽식 키보드 레이아웃 사이에는 같은 물리 위치를 다르게 해석하는 경우가 있습니다.

    예상과 다른 입력이 나올 때 확인할 항목
    • 현재 활성화된 QMK 레이어가 맞는지 확인
    • VIA 또는 키맵에서 지정한 Keycode 확인
    • Windows 또는 macOS의 키보드 배열 확인
    • 입력 언어와 한영 전환 상태 확인
    • Shift, Ctrl, Alt 같은 수식 키가 남아 있지 않은지 확인
    • 탭홀드 판정이 의도대로 작동하는지 확인

    Keycode는 키보드 펌웨어와 운영체제 사이의 약속입니다. 따라서 문제를 확인할 때는 물리 스위치, QMK 키맵, HID 전송, 운영체제 배열을 각각 나누어 살펴보는 것이 좋습니다.

    12. Keycode 동작을 확인하는 방법

    사용자 정의 키맵을 수정한 뒤에는 실제로 어떤 Keycode가 인식되는지 확인하는 과정이 필요합니다. 화면에 입력되는 문자만 보면 펌웨어에서 어떤 단계가 잘못되었는지 구분하기 어렵기 때문입니다.

    기본적인 확인 방법은 키보드 테스트 도구를 사용해 눌린 키를 확인하는 것입니다. 더 깊게 확인하려면 QMK의 콘솔과 디버깅 기능을 이용해 매트릭스 좌표, Keycode, 키 이벤트가 어떻게 처리되는지 살펴볼 수 있습니다.

    문제 위치를 구분하는 기준
    • 키 입력 자체가 감지되지 않으면 매트릭스 또는 하드웨어 확인
    • 다른 Keycode가 조회되면 레이어와 키맵 확인
    • Keycode는 맞지만 기능이 다르면 사용자 정의 함수 확인
    • HID 입력은 맞지만 문자가 다르면 운영체제 배열 확인

    QMK 콘솔을 사용하려면 펌웨어에서 콘솔 기능을 활성화해야 하며, 키보드와 MCU에 따라 지원 방식이 다를 수 있습니다. 일반 사용자는 먼저 VIA 키 테스터와 운영체제의 키보드 뷰어를 확인하고, 펌웨어를 직접 개발할 때 콘솔 디버깅을 사용하는 것이 효율적입니다.

    13. Keycode를 이해할 때 자주 하는 실수

    Keycode는 이름만 보면 단순해 보이지만, 실제로는 펌웨어 기능과 HID 규격, 운영체제 해석이 연결된 개념입니다. 아래와 같은 부분에서 혼동이 자주 발생합니다.

    자주 하는 오해
    • Keycode를 화면에 표시되는 문자와 동일하게 생각하는 것
    • 모든 QMK Keycode가 PC로 직접 전송된다고 생각하는 것
    • 물리 키 위치와 Keycode가 항상 고정되어 있다고 생각하는 것
    • 레이어가 바뀌어도 같은 키가 같은 기능을 한다고 생각하는 것
    • 펌웨어 문제와 운영체제 키보드 배열 문제를 구분하지 않는 것

    가장 중요한 기준은 물리 위치 → 활성 레이어 → Keycode → QMK 내부 처리 → HID 리포트 → 운영체제 해석의 순서입니다. 입력 문제가 생겼을 때 이 순서를 따라가면 어느 단계에서 예상과 달라졌는지 찾기 쉬워집니다.

    🔍 Insight

    QMK의 Keycode는 단순한 키 이름이 아니라 펌웨어가 실행할 동작을 표현하는 명령 값입니다. 일부는 HID 입력이 되고, 일부는 레이어나 매크로처럼 키보드 내부 상태를 바꿉니다.

    14. 자주 묻는 질문

    Q. KC_A는 문자 a를 직접 전송하나요?

    아닙니다. 키보드는 A 키 위치에 해당하는 HID 입력 정보를 보내고, 운영체제가 현재 언어와 키보드 배열을 기준으로 최종 문자를 결정합니다.

    Q. 같은 물리 키에 여러 Keycode를 지정할 수 있나요?

    가능합니다. 레이어마다 서로 다른 Keycode를 배치할 수 있으며, 탭홀드 기능을 사용하면 짧게 누를 때와 길게 누를 때의 동작도 나눌 수 있습니다.

    Q. MO(1)도 PC로 전송되는 Keycode인가요?

    MO(1)은 QMK 내부에서 레이어를 활성화하는 기능입니다. 일반 문자 키처럼 운영체제로 그대로 전송되는 값은 아닙니다.

    Q. 사용자 정의 Keycode는 어떻게 만들 수 있나요?

    일반적으로 사용자 정의 Keycode 값을 선언한 뒤 process_record_user 함수에서 해당 값이 눌렸을 때 실행할 동작을 작성합니다.

    Q. Keycode 번호를 직접 외워야 하나요?

    대부분의 경우 숫자를 외울 필요는 없습니다. KC_A, KC_ENT, MO(1)처럼 QMK가 제공하는 이름을 사용하면 컴파일 과정에서 실제 값으로 변환됩니다.

    Q. Keycode가 정상인데 문자가 다르게 입력될 수 있나요?

    가능합니다. 운영체제에 설정된 키보드 언어와 배열이 다르면 동일한 HID 입력도 다른 문자로 해석될 수 있습니다.

    📚 함께 보면 좋은 글

    Keycode가 인식되는 전체 흐름을 이해했다면 펌웨어, 저장 공간, MCU 구조까지 함께 살펴보세요. 각각의 개념이 연결되면 키보드가 입력을 처리하는 과정이 더 명확해집니다.

    🔗 공식 자료

    📖 출처

    • QMK Firmware 공식 문서 — Keycodes
    • QMK Firmware 공식 문서 — Keymap Overview
    • QMK Firmware 공식 문서 — Quantum Keycodes
    • QMK Firmware 공식 문서 — Custom Quantum Functions
    • QMK Firmware 공식 문서 — Tap-Hold Configuration
    • USB Implementers Forum HID Usage Tables
    Link&Tem 한 줄 정리

    Keycode는 키캡에 적힌 문자가 아니라, 매트릭스 위치와 활성 레이어를 바탕으로 QMK가 찾아낸 동작 값입니다. 이 값은 펌웨어 내부 기능으로 처리되거나 HID 리포트로 변환된 뒤 운영체제에서 최종 입력으로 해석됩니다.