다른 명령
새 문서: * 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... |
편집 요약 없음 |
||
| 9번째 줄: | 9번째 줄: | ||
=== KEY 배선 === | === KEY 배선 === | ||
2.1 수직으로 연결한 ROW | 2.1 수직으로 연결한 ROW | ||
ROW1 : GPIO 10 | *ROW1 : GPIO 10 | ||
ROW2 : GPIO 9 | *ROW2 : GPIO 9 | ||
ROW3 : GPIO 6 | *ROW3 : GPIO 6 | ||
ROW4 : GPIO 8 | *ROW4 : GPIO 8 | ||
2.2 수평(저항 다이오드)으로 연결한 COL | 2.2 수평(저항 다이오드)으로 연결한 COL | ||
COL1 : GPIO 5 | *COL1 : GPIO 5 | ||
COL2 : GPIO 4 | *COL2 : GPIO 4 | ||
COL3 : GPIO 12 | *COL3 : GPIO 12 | ||
=== KEY 눌림시 실행되는 명령 === | === KEY 눌림시 실행되는 명령 === | ||
[K1] : 왼쪽 컨트롤 + INSERT키 | *[K1] : 왼쪽 컨트롤 + INSERT키 | ||
[K2] : 왼쪽 컨트롤 + 왼쪽 ALT키 + INSERT키 | *[K2] : 왼쪽 컨트롤 + 왼쪽 ALT키 + INSERT키 | ||
[K3] : 왼쪽 컨트롤 + 왼쪽 SHIFT키 + INSERT키 | *[K3] : 왼쪽 컨트롤 + 왼쪽 SHIFT키 + INSERT키 | ||
[K4] : 왼쪽 컨트롤 + F12키 | *[K4] : 왼쪽 컨트롤 + F12키 | ||
[K5] : 왼쪽 컨트롤 + F11키 | *[K5] : 왼쪽 컨트롤 + F11키 | ||
[K6] : 왼쪽 컨트롤 + F10키 | *[K6] : 왼쪽 컨트롤 + F10키 | ||
[K7] : 왼쪽 컨트롤 + 등호(=)키 | *[K7] : 왼쪽 컨트롤 + 등호(=)키 | ||
[K8] : 왼쪽 컨트롤 + 마이너스(-)키 | *[K8] : 왼쪽 컨트롤 + 마이너스(-)키 | ||
[K9] : 왼쪽 컨트롤 + F9키 | *[K9] : 왼쪽 컨트롤 + F9키 | ||
[K10] : ESC키 | *[K10] : ESC키 | ||
2026년 8월 22일 (토) 12:50 기준 최신판
- 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();
}