Ít đau tay hơn, code đã hơn
I. Giới thiệu
“Sau vài năm code, thứ đau nhất không phải bug… mà là cổ tay.”
Nếu bạn từng bị tê tay, đau cổ tay hay vai gáy sau nhiều giờ ngồi trước máy, thì rất có thể chiếc bàn phím quen thuộc là nguyên nhân.
Mục đích của bài viết này là để giới thiệu chia sẻ cách thiết lập cũng như trải nghiệm lập trình với bàn phím tách đôi , đặc biệt là layout 40%, từ góc nhìn của một dev đã “bỏ fullsize theo split”.
II. Bàn phím tách đôi là gì? Và tại sao lại là 40%?
1. Demo gõ phím
Mình có 4 video để so sánh gõ chữ và code.
Mục đích chính là để so sánh "phong thái" code của bàn phím truyền thống so với bàn phím tách đôi, không phải để so tốc độ, nên các bạn không cần phải nhìn tốc độ gõ rùa bò của mình để phán xét bàn phím nào tốt hơn.
Gõ chữ, bàn phím truyền thống zoom75
Gõ chữ, bàn phím tách đôi Corne V3
Gõ code, bàn phím truyền thống zoom75
Gõ code, bàn phím tách đôi cornce V3
Bonus Amelia Watson trên OLED 😆
2 Tách đôi là gì?
Bàn phím tách đôi là bàn phím được chia làm hai nửa đối xứng, mỗi tay một bên.
Hai nửa kết nối với nhau bằng:
- Cáp (TRRS / USB-C)
- Bluetooth
Có thể đặt xa – gần – xoay góc tùy ý, không bị rập khuôn như bàn phím truyền thống.

Nguồn: Keychron
3. Kích thước bàn phím – càng nhỏ càng “hack não”
Chúng ta sẽ đi nhanh qua các kích thước phổ biến:
- 100% (Fullsize): Bàn phím truyền thống ~104–108 phím, có đủ mọi thứ: chữ, số, function, mũi tên, numpad.
- 75%: Bỏ cụm numpad bên phải.
- 65%: Bỏ thêm hàng phím function (F1–F12).
- 60%: Bỏ tiếp cụm phím mũi tên và vài phím điều hướng.
- 40%: Bỏ luôn hàng số phía trên.

Ưu điểm lớn nhất của layout 40% là chúng ta không cần di chuyển cả bàn tay, mà chỉ di chuyển ngón tay.
Nhược điểm lớn nhất của layout này là chúng ta phải tìm cách để sử dụng các phím bị thiếu bằng cách đẩy chúng sang các layer (lớp) khác.
III. Vì sao dân code nên quan tâm đến bàn phím tách đôi?
1. Lợi ích về sức khỏe
Bàn phím truyền thống đưa 2 tay chúng ta vào tư thế không tự nhiên.
Tư thế tự nhiên của tay người khi thả lỏng:
- Lòng bàn tay hướng vào nhau
- Cổ tay thẳng
Trong khi đó, với bàn phím truyền thống:
- Cẳng tay phải xoay sấp
- Lòng bàn tay úp xuống
- Cổ tay bẻ ra ngoài

Cổ tay bẻ cong. Nguồn: Boardsource
Hệ quả:
- Giảm lưu thông máu
- Căng cơ
- Áp lực lên dây thần kinh giữa
➡️ Lâu dài có thể dẫn tới đau cổ tay, vai, lưng, thậm chí dẫn đến hội chứng ống cổ tay (Carpal Tunnel Syndrome)
Bàn phím tách đôi giải quyết vấn đề này:
- Hai nửa đặt xa nhau → cổ tay thẳng
- Thường có tenting (chân nâng) → cẳng tay ít xoay sấp hơn
- Tư thế gần với tự nhiên hơn

Cẳng tay ít xoay sắp hơn. Nguồn: Reddit
2. Lợi ích khi lập trình
Giảm di chuyển tay
- Với phím thường: muốn bấm mũi tên, function, delete → phải rê cả bàn tay
- Với combo + layer: chỉ cần di chuyển ngón tay
Tận dụng ngón cái
- Ngón mạnh nhất nhưng trên phím thường chỉ dùng để… bấm space
- Thường sẽ có một ngón cái không sử dụng tới
- Bàn phím tách đôi cho ngón cái làm nhiều việc hơn: layer, enter, backspace, v.v.
➡️ Kết quả: code mượt hơn, ít mỏi hơn.
3. Tính tiện dụng
- Nhỏ gọn, nhẹ, dễ mang đi
- Chiếm ít diện tích bàn làm việc
- Setup nhìn rất “hacker” 😄

IV. Nguyên lý thiết kế layer
1. Bàn phím sử dụng
- Corne v3 (crkbd)
- Phím thẳng hàng, trái ngược với so le của phím truyền thống
- 42 phím – layout 40%
Nhà phân phối: https://boardsource.xyz/products/corne
So le vs thẳng hàng
Thoạt nhìn nhiều người sẽ thắc mắc:
“Ủa? Không số, không mũi tên thì code kiểu gì?”
Câu trả lời nằm ở: layer + combo.

Nguồn: keymapdb
2. Tiêu chí thiết kế layer (từ góc nhìn dev)
Việc thiết kế layer cho tối ưu và thuận tiện là không có câu trả lời duy nhất.
Tùy vào nhu cầu, thói quen của mỗi người mà sẽ có một bộ layer "tối thượng" khác nhau.
Vì mình là lập trình viên, layer phải đáp ứng các tiêu chí sau:
- Ctrl / Shift / Alt / Win (Command) luôn phải có mặt khi cần thao tác chữ, số, các phím F1 - F12
- Các phím cùng loại sẽ gộp vào một layer
- Tận dụng combo (bấm 2–3 phím cùng lúc) cho các chức năng hay dùng
- Ưu tiên thao tác ở home row (hàng phím A S D F – J K L ;) để nhanh chóng và dễ dàng
Nếu chưa có định hướng thiết kế layer, KeymapDB sẽ là một nguồn tham khảo rất hữu ích. KeymapDB tổng hợp nhiều thiết kế layout cho nhiều loại bàn phím khác nhau.
V. Layer chi tiết
Toàn bộ thiết lập layer của mình sẽ được để ở cuối bài
Chú thích ký hiệu
| Ký hiệu | Ý nghĩa |
|---|---|
| ⌘ | Windows |
| ⌥ | Alt |
| ⌃ | Ctrl |
| ⇧ | Shift |
| ␣ | Space |
| ⇥ | Tab |
1. Layer 1 – Chữ cái (Base layer)
- Chứa toàn bộ chữ cái
- Tối ưu bằng combo:
| Combo | Chức năng |
|---|---|
| S + D | Undo |
| D + F | Esc |
| X + C | Paste |
| C + V | Copy |
| X + V | Cut |
| J + K | Backspace |
| K + L | Enter |
| M + , | Delete |
Ví dụ thiết lập combo cho copy
// combos
const uint16_t PROGMEM copy_combo[] = {KC_C, KC_V, COMBO_END};
combo_t key_combos[] = {
COMBO(copy_combo, KC_COPY),
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
idle_timer = timer_read32(); // Reset the idle timer on key press
oled_on(); // Use custom function to turn OLED on
}
switch (keycode) {
case KC_COPY:
if (record->event.pressed) {
// Send Ctrl + C
register_code(KC_LCTL);
register_code(KC_C);
} else {
unregister_code(KC_C);
unregister_code(KC_LCTL);
}
return false; // Skip further processing of KC_COPY
}
return true;
}

2. Layer 2 – Số (Number)
- Truy cập từ layer 1 bằng cách nhấn giữ Num
- Số nằm ở nửa phải, giống numpad ở bàn phím 100%
- Ctrl / Alt / Shift / Win nằm ở home row trái

3. Layer 3 – Function (F1–F12)
- Truy cập từ layer 1 bằng cách nhấn giữ Num + Space
- Gồm các phím function F1 ~ F12

4. Layer 4 – Navigate
- Truy cập bằng cách nhấn giữ Nav ở layer 1
- Bao gồm:
- Mũi tên
- Page Up / Down (PgUp, PgDn)
- Shift + Tab
- Screenshot (Windows: PrintWin / Ubuntu: PrintUbu)
- Task Manager (CS ESC)
- Inspect browser (CS C)
- Alt + F4
Ví dụ thiết lập custom key cho chức năng chụp màn hình ở ubuntu
#define PRNT_UBU LCTL(KC_LBRC) // left ctrl + [

5. Layer 5 – Symbol
- Truy cập bằng cách nhấn giữ Num + Nav ở layer 1
- Ký tự đặc biệt
- Caps Lock

6. Layer 6 – Config
- Truy cập băng cách nhấn giữ Nav + Config ở layer 4
- Chỉnh LED
- Thời gian tap/hold
- Reboot / Reset bàn phím

Tất cả layer này được viết bằng C (QMK keymap) và flash trực tiếp lên bàn phím.
VI. Thiết lập layer với QMK
1. Phần mềm
- QMK MSYS (Windows)
- Tài liệu chính thức: https://docs.qmk.fm/newbs
QMK có phiên bản web để thao tác bằng chuột một cách trực quan.

Vì thiết lập của mình hơi phức tạp một chút + có hoạt ảnh cho màn hình OLED nên sẽ thiết lập bằng code.

2. Setup ban đầu
qmk setup
qmk compile -kb <my_keyboard> -km <my_keymap>
- my_keyboard: mã bàn phím
- my_keymap: tên file keymap
Ví dụ để build firmware cho Clueboard 66% và sử dụng keymap default:
qmk compile -kb clueboard/66/rev3 -km default
Nếu môi trường OK, bạn sẽ thấy firmware được build thành công.
Đây mới chỉ là test tạo firmware, chưa áp keymap lên bàn phím.
Linking: .build/clueboard_66_rev3_default.elf [OK]
Creating load file for flashing: .build/clueboard_66_rev3_default.hex [OK]
Copying clueboard_66_rev3_default.hex to qmk_firmware folder [OK]
Checking file size of clueboard_66_rev3_default.hex [OK]
* The firmware size is fine - 26356/28672 (2316 bytes free)
QMK sẽ clone repo về, với nhiều thiết lập mặc định cho nhiều bàn phím khác nhau.
3. Flash keymap
Trong qmk msys, chạy lệnh sau:
qmk flash -kb <my_keyboard> -km <my_keymap>
Tùy vào bàn phím mà câu lệnh thực tế sẽ khác và yêu cầu nhiều tham số hơn.
Ví dụ với bàn phím corne v3 sử dụng chip controller blok thì câu lệnh của mình là:
qmk flash -c -kb crkbd/rev1 -km custom -e CONVERT_TO=blok
- c: clean build cũ
- CONVERT_TO=blok: corne mặc định dùng Pro Micro, nhưng phím mình dùng chip Blok (RP2040) nên cần convert
/
├─ keyboards/
├─ crkbd/
├─ custom /
├─ animation-util.c
├─ config.h
├─ global_vars.c
├─ keymap.c
Kết quả sau khi build xong:
Compiling: platforms/chibios/vendors/RP/pico_sdk_shims.c [OK]
Assembling: lib/pico-sdk/src/rp2_common/pico_divider/divider.S [OK]
Assembling: lib/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S [OK]
Linking: .build/crkbd_rev1_custom_blok.elf [WARNINGS] |
| lto-wrapper.exe: warning: using serial compilation of 2 LTRANS jobs
| lto-wrapper.exe: note: see the '-flto' option documentation for more information
| Creating binary load file for flashing: .build/crkbd_rev1_custom_blok.bin [OK]
Creating UF2 file for deployment: .build/crkbd_rev1_custom_blok.uf2 [OK]
Copying crkbd_rev1_custom_blok.uf2 to qmk_firmware folder [OK]
Creating load file for flashing: .build/crkbd_rev1_custom_blok.hex [OK]
Size after:
text data bss dec hex filename
0 59004 0 59004 e67c crkbd_rev1_custom_blok.uf2
Flashing for bootloader: rp2040
Waiting for drive to deploy...
Lúc này qmk sẽ chờ chúng ta bấm nút reset để có thể chính thức cài đặt keymap lên bàn phím.
Chúng ta có thể bấm phím reset trên bàn phím (nếu có) hoặc bấm 2 lần vào nút reset vật lý trên bo mạch.
Ở đây mình dùng nút vật lý.
Kết quả sau khi bấm reset:
Flashing for bootloader: rp2040 Waiting for drive to deploy...
Flashing D: (RPI-RP2) Wrote 118272 bytes to D:/NEW.UF2
Như vậy là đã thành công, keymap đã được ghi lên bàn phím 🙌
VII. Trải nghiệm thực tế
1. Giai đoạn “khổ luyện” ban đầu
- Tốc độ code tụt thảm hại
- Ngày đầu: 6–10 từ/phút
- Gõ sai liên tục, đặc biệt là chữ C
- Não luôn phải suy nghĩ "ký tự này nó nằm ở đâu nhỉ?"
👉 Cảm giác như học gõ máy lại từ đầu.
2. Khi đã quen (sau ~2 tháng)
- Tay gần như không di chuyển ngoài các ngón tay
- Combo rất sướng tay
- Phím mũi tên nằm ngay home row
- Bấm số dễ dàng
- Nhiều tính năng phải bấm tổ hợp hoặc di chuyển nhiều ở bàn phím truyền thống giờ trở nên dễ dàng hơn rất nhiều
- Cổ tay hết đau
- Mang đi làm, về nhà cực tiện
➡️ Không muốn quay lại bàn phím thường nữa.
3. Điểm trừ
a. Thời gian làm quen
- Đổi thói quen gõ phím hơn 10 năm là chuyện không dễ
- Rất dễ nản chí trong thời gian đầu
b. Chi phí
- Ở Việt Nam chỉ có vài mẫu phổ biến (Corne, Sofle…) trên shopee
- Mẫu lạ phải order nước ngoài, kéo theo tiền ship + thuế + hàn mạch đội lên
- Phí ngu: nếu không muốn tốn phí hàn mạch, chúng ta có thể tự làm (nếu biết hàn). Thật không may mình đọc không kĩ và hàn ngược chip controller vào mạch, gỡ ra thì hỏng luôn, phải order lại 2 con chip
c. Đòi hỏi vọc vạch
- Tốn thời gian để học cách chỉnh sửa layer, để tìm ra layer ưng ý
- Dù đã sử dụng một thời gian khá lâu, mình vẫn phát hiện ra các điểm cần cải tiến
- Bấm redo (shift + s + d) hơi khó khăn, cần cho ra một combo dễ dàng hơn
- Khi sử dụng một số công cụ dùng nhiều phím space, tay phải phải rời khỏi chuột để bấm => cần thiết kế combo cho ra phím space ở bên trái
- Dù đã sử dụng một thời gian khá lâu, mình vẫn phát hiện ra các điểm cần cải tiến
- Nhiều khi gặp lỗi nhưng tìm nát internet cũng không ra giải pháp
- Ảnh động trên màn oled bị quay 90 độ không hiểu vì sao
- Flash không ăn, hoặc flash chỉ ăn nửa bàn phím
d. Chơi game
- Bộ layout trên không tiện để chơi game yêu cầu nhiều nút như MMORPG => cần phải tạo một layer khác chuyên dành cho game (sẽ triển khai trong tương lai)
e. Dùng ngoài quán
- Không phải bàn cà phê nào cũng đủ rộng để “tách đôi” 😅
VIII. Kết
Bàn phím tách đôi không dành cho tất cả mọi người.
Nhưng nếu bạn:
- Code nhiều giờ mỗi ngày
- Quan tâm đến sức khỏe lâu dài
- Thích tối ưu workflow
- Không ngại học lại từ đầu
👉 Thì đây là một khoản đầu tư rất đáng.
