Í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.

1L2Vpl3iTPsNihJu9uHX8Cpi7xpBcgIG6

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.

15GIQ4dT-jZbMbrXNT7efHwN7rpH2xz1Y

Ư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

1v6mNFgqF8rcjycMaTii-nTR3bql_vsG9

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

1P3Gvjoxkpjr-Yf1YzKuzskfFNqGIDjk0

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” 😄

1y-GqsYFgV-9HzbkzscQWktFkkCPtc758

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

Before After

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.

15BTlB19R51xn_Z13ekHwRb3fXLOVV3gz

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;
}

1bXIqTg1vIJ1mtqN2F9064ESG33tJsPsC

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

1TRAaA4udGxqn_jag02lwKxuN-Nn0Cx0h

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

1bG7woOMLDjhjJju22LDoVxNvqUhFBmPK

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 + [

1KS7JIprY75koT-qEXAaDdRGkYTtCqZht

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

1qBGhJzD48ANBIA5WRepKe8P0xhreNJOH

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

12c9Ri2okYLIAQaaP8Rsj3adMZR2fOVrV

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 có phiên bản web để thao tác bằng chuột một cách trực quan.

1U5HNw1S0mECIVIWUxHfZF4KOFxJD2ZcH

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.

1z1bUuvNX1G7F7vzodzN1f1OQ7EIE_SVS

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
  • 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.

IX. Nguồn tham khảo