2022年3月11日 星期五

使用 qmk 建立鍵盤

使用 docker 建立 qmk 的開發環境

參考 Setting Up Your QMK Environment

使用和 Linux 下個人帳號,可以在外部直接編輯修改程式

必須要加上 sudo,才能夠建立 qmk 的

Dockerfile

## ref: https://docs.qmk.fm/#/newbs_getting_started
FROM ubuntu:22.10

# Prerequisites
RUN apt-get -y update && apt-get -y upgrade && apt-get clean
RUN apt-get -y install sudo git python3 python3-pip

# Install the QMK CLI
RUN python3 -m pip install --upgrade pip \
    && python3 -m pip install qmk

# 安裝 QMK 開發需求
RUN apt-get -y install \
        gcc-arm-none-eabi \
        gcc-avr avrdude \
        dfu-util dfu-programmer

# 要安裝,否則會出現錯誤
# fatal error: avr/pgmspace.h: No such file or directory
RUN apt-get -y install  avr-libc

RUN groupadd ajax -g 1000 \
    && useradd  -g 1000 -u 1000 ajax \
    && echo 'ajax:cc1234' | chpasswd  \
    && adduser ajax sudo \
    && usermod -aG sudo ajax \
    && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers \
    && echo '%sudo ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/nopwd

USER ajax
CMD ["/bin/bash"]

經測試,sudo 無效。

要執行 docker,可以建立 docker-compose.yml,或者使用下列命令執行

docker run -it --rm  --user 1000:1000  --name qmk-dev \
 -v `pwd`:/work -v `pwd`:/home/ajax  \
 -w /work \
 qmk-dev   bash


docker-compose.yml

## Teensy development environment

qmk_dev:
  build: .
  working_dir: /work
  volumes:
    - "../qmk_work:/work"
    - "../qmk_work:/home/ajax"
  stdin_open: true
  tty: true
  user: 1000:1000
  entrypoint: /bin/bash

.bashrc

export PS1='\[\033]0;\u@\h:\w\007\]\[\033[01;31m\]qmk_dev@docker\[\033[01;34m\] \w \$\[\033[00m\] '

執行

docker-compose -f docker-compose.yml run --rm qmk_dev

執行 qmk setup

qmk_dev@docker /work $ qmk setup
Ψ Could not find qmk_firmware!
Would you like to clone qmk/qmk_firmware to /home/ajax/qmk_firmware? [y/n] y
Cloning into '/home/ajax/qmk_firmware'...
.....
Ψ QMK home: /home/ajax/qmk_firmware
Ψ Detected Linux.
⚠ Missing or outdated udev rules for 'atmel-dfu' boards. Run 'sudo cp /home/ajax/qmk_firmware/util/udev/50-qmk.rules /etc/udev/rules.d/'.
⚠ Missing or outdated udev rules for 'kiibohd' boards. Run 'sudo cp /home/ajax/qmk_firmware/util/udev/50-qmk.rules /etc/udev/rules.d/'.
⚠ Missing or outdated udev rules for 'stm32' boards. Run 'sudo cp /home/ajax/qmk_firmware/util/udev/50-qmk.rules /etc/udev/rules.d/'.
⚠ Missing or outdated udev rules for 'bootloadhid' boards. Run 'sudo cp /home/ajax/qmk_firmware/util/udev/50-qmk.rules /etc/udev/rules.d/'.
⚠ Missing or outdated udev rules for 'usbasploader' boards. Run 'sudo cp /home/ajax/qmk_firmware/util/udev/50-qmk.rules /etc/udev/rules.d/'.
⚠ Missing or outdated udev rules for 'massdrop' boards. Run 'sudo cp /home/ajax/qmk_firmware/util/udev/50-qmk.rules /etc/udev/rules.d/'.
⚠ Missing or outdated udev rules for 'caterina' boards. Run 'sudo cp /home/ajax/qmk_firmware/util/udev/50-qmk.rules /etc/udev/rules.d/'.
⚠ Missing or outdated udev rules for 'hid-bootloader' boards. Run 'sudo cp /home/ajax/qmk_firmware/util/udev/50-qmk.rules /etc/udev/rules.d/'.
Ψ Git branch: master
Ψ Repo version: 0.16.5
☒ Can't find arm-none-eabi-gcc in your path.
☒ Can't find avrdude in your path.
☒ Can't find dfu-programmer in your path.
☒ Can't find dfu-util in your path.
Would you like to install dependencies? [Y/n] 
......................
Ψ All dependencies are installed.
Ψ Found arm-none-eabi-gcc version 9.2.1
Ψ Found avr-gcc version 5.4.0
Ψ Found avrdude version 6.3-20171130
Ψ Found dfu-util version 0.9
Ψ Found dfu-programmer version 0.6.1
Ψ Submodules are up to date.
Ψ QMK is ready to go, but minor problems were found
qmk_dev@docker /work $ 

測試

qmk_dev@docker /work $ qmk compile -kb clueboard/66/rev3 -km default
Ψ Compiling keymap with make --jobs=1 clueboard/66/rev3:default

QMK Firmware 0.16.5
Making clueboard/66/rev3 with keymap default

avr-gcc (GCC) 5.4.0
.....
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 - 27228/28672 (94%, 1444 bytes free)
qmk_dev@docker /work $ 

.... 待續 ....







2022年3月3日 星期四

DIY - 魔蛋 Magicforce 68 鍵盤加裝小紅點 Trackpoint

動機

自己原先習慣使用的是沒有數字鍵的 80% 鍵盤,也稱 tenkeyless 鍵盤,簡稱 TKL 鍵盤。最近看到很多分享 60%的小鍵盤,原來覺得好像會不方便,可是想想 F1~F12的功能鍵根本不太用到,少了應該也還好。不過,考慮到自己的使用習慣,以及可以使用一般的鍵帽,魔蛋 68鍵 (Magicforce 68) 鍵盤是比較適合的。

但我一定要有小紅點才行,這只能去找舊鍵盤來改,拆了才不會心痛。目標是 68鍵,才能用一般的鍵帽。後來找到魔蛋 68 Magicforce,一口氣把淘寶的 3把都買回來,萬一弄壞了還有備用的。有些使用的不是 Cherry 軸,只好又買了專門用來拆軸的垃圾鍵盤,藉以取得 Cherry 軸。

Magicforce 68 有無燈和有燈兩個版本,兩種都買了。無燈是較早期的版本,連防沖的二極體都沒用,要改裝就得找接出來的信號腳比較多的開發板。還好後來 QMK 的 Trackpoint 有支援 STM 32 的開發板,接出來的信號腳,扣掉 USB 信號用掉的 2支腳,還有 30條信號線可用。無燈的版本需要用到 29條信號線,剛剛好。

後來又看到正熱的 Raspberry Pi Pico,RP2040 相容開發板,IO 接腳有 26 支,少了一些,只比 Teensy 2.0 多一支 PIN,但也可以試試看。

有燈版本的 Magicforce 68

先動手改的是有燈的版本,原先使用的 HT68FB550 MCU,沒能力修改它的 firmware,只好拆掉改用 Teensy 2.0,控制鍵盤和連接 Trackpoint 模組。必須將鍵盤矩陣稍微改一下,減少控制信號,不然 Teensy 的輸出會不夠用。

使用 QMK 的鍵盤程式,在使用上比想像的簡單,資料很多。

改好的成品如下面的照片。鍵帽是另外買新的,因為我要倉頡輸入法。




控制器部分的相片


先留個矩陣圖


HT68FB550 MCU 的接腳


背光經由 Q2 的 FET 控制。

原來的電路,矩陣的 ROW 用到 6個pin,COL 用到 16個 pin,總共 22個 pin。

假如要加背光,再改藍牙,就必須調整矩陣。參考 Ducky 的電路,ROW 可以增加到 8個pin,COL 要減到變成 12 個控制線才行。這樣要改好多線啊,真的有點辛苦。

調整後的矩陣圖,在考量儘可能減少更動線路的情況下,調整如下。其中標註 * 者為移動後的位置。




ROW: 5條線,COL: 14 條線,總共 19條線。參考 HHKB 鍵盤,不要 Caps Lock,當作 Control 鍵用。

修改 rules.mk

修改 magicforce68_trackpoint.h,有幾個按鍵 #define LAYOUT(....) 的參數就要定義那麼多個。

修改 keymap.c,const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] 對應的所有按鍵。定義其他 layer時,才可以有 '_______'。

最後跳線完成的相片


無燈版本的 Magicforce 68

無燈版本的 Magicforce 68 沒有二極體的防衝設計。原本想放棄,可是想想聯想的小紅點鍵盤也都是沒有防衝設計,只用來寫程式,是沒有什麼差別的。打電動才需要防衝設計,小紅點也不可能拿來打電動,用小紅點打電動太不實際了。所以還是幫它加裝 Trackpoint,而且這也是第一次自行設計,用 3D列印打印外殼。

最後完成的外觀圖如下。

改裝後的電路板,如下。

STM32F103 開發板,比 Teensy 2.0 大了不少,用自己印的外殼,只要把外殼設計稍大一些,就可以塞得下。Trackpoint module 也是用比較早期的模組,體積比較大,但控制桿很粗,感覺比較牢靠。後來買的小紅點模組,體積很小,如上面無燈版本改的那個,不用破壞外殼也裝得下。缺點是那根控制桿很容易掉,自己再黏也是不怎麼牢,很容易又掉。

無燈版的鍵盤矩陣如下。


R0 (A9)

R1 (A10)

R2 

(B5)

R3 

(B4)

R4 (B14)

R5 (B6)

R6 

(B7)

R7 

(B9)

R8 

(C14)

C0 (C13)

1

Q

A

Z

Tab




Esc 

C1 (B8)

2

W

S

X

Caps





C2 (C15)

3

E

D

C






C3 (B15)

4

R

F

V

T

5


B

G

C4 (A1)

7

U


M

Y

6

J

N

H

C5 (A0)

8

I


<

]

=

K



C6 (B13)

9

O


>



L



C7 (A3)

0

P



[

-

;

?

"

C8 (A2)




Enter

Back


|\



C9 (A4)






Ins


R_arr


C10 (A5)

End





Home




C11 (B0)






Del


D_arr

Space

C12 (A6)








L_arr

U_arr

C13 (A7)




Ctr_R


Ctr_L




C14 (B12)







Alt_R

Fn

Alt_L

C15 (B3)





Shf_L


Shf_R



C16 (A15)





Win_L





括弧內為控制板的 pin 代碼。接 trackpoint module 的 pin 為 PS2-CLK: B8,PS2-DAT: B9。控制大小寫燈號的是 A8。

USB 的 2 條訊號線為,A11 - D-,A12 - D+,可以直接從這兩個 pin 接到 USB 接頭,不用再辛苦的改 micro USB 的接頭。




網誌存檔