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

NUM 패드 키보드

데브카페
Devcafe (토론 | 기여)님의 2026년 8월 22일 (토) 12:49 판 (새 문서: * ESP32-S3-Zero 칩을 사용하여 10개(K1~K10) 매크로 키패드 생성 === KEY 배열 === [K1][K2][K3] [K4][K5][K6] [K7][K8][K9][K10] === KEY 배선 === 2.1 수직으로 연결한 ROW ROW1 : GPIO 10 ROW2 : GPIO 9 ROW3 : GPIO 6 ROW4 : GPIO 8 2.2 수평(저항 다이오드)으로 연결한 COL COL1 : GPIO 5 COL2 : GPIO 4 COL3 : GPIO 12 === KEY 눌림시 실행되는 명령 === [K1] : 왼쪽 컨트롤 + INSERT키 [K2] : 왼쪽 컨트롤 + 왼쪽 ALT키 + INSER...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)
  • ESP32-S3-Zero 칩을 사용하여 10개(K1~K10) 매크로 키패드 생성

KEY 배열

 [K1][K2][K3]
 [K4][K5][K6]
 [K7][K8][K9][K10]

KEY 배선

2.1 수직으로 연결한 ROW ROW1 : GPIO 10 ROW2 : GPIO 9 ROW3 : GPIO 6 ROW4 : GPIO 8

2.2 수평(저항 다이오드)으로 연결한 COL COL1 : GPIO 5 COL2 : GPIO 4 COL3 : GPIO 12

KEY 눌림시 실행되는 명령

[K1] : 왼쪽 컨트롤 + INSERT키 [K2] : 왼쪽 컨트롤 + 왼쪽 ALT키 + INSERT키 [K3] : 왼쪽 컨트롤 + 왼쪽 SHIFT키 + INSERT키 [K4] : 왼쪽 컨트롤 + F12키 [K5] : 왼쪽 컨트롤 + F11키 [K6] : 왼쪽 컨트롤 + F10키 [K7] : 왼쪽 컨트롤 + 등호(=)키 [K8] : 왼쪽 컨트롤 + 마이너스(-)키 [K9] : 왼쪽 컨트롤 + F9키 [K10] : ESC키


펌웨어 만들기

- arduino IDE
/*
  ESP32-S3-Zero 10키(K1~K10) 매크로 키패드 - USB HID(유선)
  - Arduino IDE 설정 필수:
      Tools > USB Mode        = "USB-OTG (TinyUSB)"
      Tools > USB CDC On Boot = "Disabled"  (CDC 켜져 있으면 HID가 안 잡히는 경우가 있음)
    보드는 Tools > Board > esp32 > "Waveshare ESP32-S3-Zero" 선택
    
  키 배열:
    [K1][K2][K3]
    [K4][K5][K6]
    [K7][K8][K9][K10]

  실제 매트릭스는 4행 x 3열이며, K10만 Row4/Col1에 위치(Row4의 Col2,3은 미사용):
    Row1: K1  K2  K3
    Row2: K4  K5  K6
    Row3: K7  K8  K9
    Row4: K10  -   -

  배선:
    ROW1 = GPIO10   ROW2 = GPIO9   ROW3 = GPIO6   ROW4 = GPIO8   (전부 OUTPUT)
    COL1 = GPIO5    COL2 = GPIO4   COL3 = GPIO12                  (전부 INPUT_PULLUP)

  다이오드 방향: 캐소드(띠)가 Row 쪽을 향하도록 납땜하세요.
    (Row를 LOW로 구동 시, Col의 내부 풀업에서 전류가 흘러들어와야 눌림 감지)

  보드 설정 (Tools 메뉴):
    Board          : ESP32S3 Dev Module
    USB Mode       : USB-OTG (TinyUSB)   ← 필수
    USB CDC On Boot: Disabled             (필요하면 Enabled로 바꿔 시리얼 디버그 확인 가능)
    Flash Size     : 4MB (32Mb)           ← 실제 칩과 반드시 일치시킬 것

  동작: [K1]~[K9]는 지정된 단축키 조합을, [K10]은 ESC를 전송합니다.
*/

#include <USB.h>
#include <USBHIDKeyboard.h>

USBHIDKeyboard Keyboard;

const int ROW_PINS[4] = {10, 9, 6, 8};   // R1, R2, R3, R4
const int COL_PINS[3] = {5, 4, 12};      // C1, C2, C3

// 키맵: keys[] 배열에 최대 3개 키코드까지 지정 (0=미사용)
// 예: {KEY_LEFT_CTRL, KEY_INSERT, 0} → Ctrl+Insert
struct KeyAction {
  uint8_t keys[3];
};

KeyAction keymap[4][3] = {
  { {KEY_LEFT_CTRL, KEY_INSERT, 0},                    // K1: Ctrl+Insert
    {KEY_LEFT_CTRL, KEY_LEFT_ALT, KEY_INSERT},         // K2: Ctrl+Alt+Insert
    {KEY_LEFT_CTRL, KEY_LEFT_SHIFT, KEY_INSERT} },     // K3: Ctrl+Shift+Insert

  { {KEY_LEFT_CTRL, KEY_F12, 0},                       // K4: Ctrl+F12
    {KEY_LEFT_CTRL, KEY_F11, 0},                       // K5: Ctrl+F11
    {KEY_LEFT_CTRL, KEY_F10, 0} },                     // K6: Ctrl+F10

  { {KEY_LEFT_CTRL, '=', 0},                           // K7: Ctrl+(=)
    {KEY_LEFT_CTRL, '-', 0},                           // K8: Ctrl+(-)
    {KEY_LEFT_CTRL, KEY_F9, 0} },                      // K9: Ctrl+F9

  { {KEY_ESC, 0, 0},                                   // K10: ESC
    {0, 0, 0},                                         // (미사용)
    {0, 0, 0} }                                        // (미사용)
};

bool keyState[4][3] = { {false} };
unsigned long lastDebounceTime[4][3] = { {0} };
const unsigned long DEBOUNCE_MS = 15;

void setup() {
  Serial.begin(115200);

  for (int r = 0; r < 4; r++) {
    pinMode(ROW_PINS[r], OUTPUT);
    digitalWrite(ROW_PINS[r], HIGH); // 평소 HIGH, 스캔할 때만 LOW
  }
  for (int c = 0; c < 3; c++) {
    pinMode(COL_PINS[c], INPUT_PULLUP);
  }

  USB.begin();
  Keyboard.begin();
}

void pressKeys(const KeyAction &action) {
  for (int i = 0; i < 3; i++) {
    if (action.keys[i] != 0) Keyboard.press(action.keys[i]);
  }
}

void scanMatrix() {
  for (int r = 0; r < 4; r++) {
    digitalWrite(ROW_PINS[r], LOW);
    delayMicroseconds(20);

    for (int c = 0; c < 3; c++) {
      bool pressed = (digitalRead(COL_PINS[c]) == LOW);
      unsigned long now = millis();

      if (pressed != keyState[r][c] && (now - lastDebounceTime[r][c]) > DEBOUNCE_MS) {
        lastDebounceTime[r][c] = now;
        keyState[r][c] = pressed;

        if (pressed) {
          pressKeys(keymap[r][c]);
        } else {
          Keyboard.releaseAll();
        }

        Serial.printf("R%dC%d %s\n", r + 1, c + 1, pressed ? "DOWN" : "UP");
      }
    }

    digitalWrite(ROW_PINS[r], HIGH);
  }
}

void loop() {
  scanMatrix();
}

Comments