こんにちは。自作キーボード流行っていますね。(2018年12月のキーボード記事と同じ導入)
私もこの流れに乗ってキーボードを作りました。
QMK1でのファームウェア作成から書き込みまでをWSL2でやってみたのでそれを紹介したいと思います。
経緯
QMKのWindowsでの環境構築ではMSYSが必要とのことだったんですが、
qmk_firmwareのリポジトリを眺めていたところ、Docker Quick Startを発見しました。
末尾にWindowsでdocker使うの面倒なので非推奨 みたいなことが書かれていますが、
WSL2ならdockerがちゃんと動くので問題ないかなと思いWSL2でやってみることにしました。
書き込みについてはQMK_Toolboxを使おうと思っていたんですが、これもWSLでavrdudeを簡単に使う為の奴を発見したので、
もう全部WSL2でいいんじゃないかな、と思いWSL2で全部やってみることにしました。
前提
- キーボードは後述するあらかじめ作っておいたものを対象にします
- マイコンはPro Micro2を、ファームウェアはQMKを使います
- Winsows10 + WSL2 でやります
- QMK CLIは使わず、dockerを使っていきます
- dockerは入っている前提で進めます
- WSL2と限定していますがWSL1でもほぼ同じことができます
- dockerの為にWSL1を管理者権限で実行するのが面倒だったので今回はWSL2にしました
- QMK CLIは使わず、dockerを使っていきます
対象とするキーボード
もともとはキットを使わないキーボードの自作が目的だったので、別途作っておいた、
「Pro Microを使った3行3列の9キーキーボード」
を対象とします。
行のピン割り当ては{ D4, C6, D7 }
、列のピン割り当ては{ E6, B4, B5 }
としています。
名刺サイズ3なので 名前を meishi_bps
とします。
記事の本題ではないのでこれ以上の情報は端折ります。
(でもモデリングと3Dプリンタでの調整と空中配線ちょっと頑張りましたというのは表明したいので画像は載せます。)
ファームウェア作成~ビルドまで
今回は~/qmk
で作業することとして進めます。
qmk_firmwareをクローンし、ファームウェアのテンプレートを作成
対話形式でキーボード名、キーボードタイプ、作者名を聞かれるので、今回はmeishi_bps
、avr
(デフォルト)、miyason
としました。
$ cd ~/qmk
$ git clone --recurse-submodules https://github.com/qmk/qmk_firmware.git
$ cd ~/qmk/qmk_firmware
$ ./util/new_keyboard.sh
Generating a new QMK keyboard directory
Keyboard Name: meishi_bps
Keyboard Type [avr]:
Your Name [*** ****]: miyason
Copying base template files... done
Copying avr template files... done
Renaming keyboard files... done
Replacing %YEAR% with 2020... done
Replacing %KEYBOARD% with meishi_bps... done
Replacing %YOUR_NAME% with miyason... done
Created a new keyboard called meishi_bps.
To start working on things, cd into keyboards/meishi_bps,
or open the directory in your favourite text editor.
~/qmk/qmk_firmware/keyboards/meishi_bps
に作成されたテンプレートをmeishi_bpsで動作するように編集
- config.hの行の設定(
MATRIX_ROWS
、MATRIX_ROW_PINS
)と列の設定(MATRIX_COLS
、MATRIX_COL_PINS
)を以下に変更
/*(抜粋)~/qmk/qmk_firmware/keyboards/meishi_bps/config.h */
#define MATRIX_ROWS 3
#define MATRIX_COLS 3
#define MATRIX_ROW_PINS { D4, C6, D7 }
#define MATRIX_COL_PINS { E6, B4, B5 }
- meishi_bps.hの
LAYOUT
の設定を以下に変更
/*(抜粋)~/qmk/qmk_firmware/keyboards/meishi_bps/meishi_bps.h */
#define LAYOUT( \
k00, k01, k02, \
k10, k11, k12, \
k20, k21, k22 \
) \
{ \
{ k00, k01, k02 }, \
{ k10, k11, k12 }, \
{ k20, k21, k22 } \
}
- keymap.cの
keymaps
を以下に変更(とりあえずabcdefgと打てるようにしました)
/*(抜粋)~/qmk/qmk_firmware/keyboards/meishi_bps/keymaps/default/keymap.c */
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Base */
[0] = LAYOUT(
KC_A, KC_B, KC_C,
KC_D, KC_E, KC_F,
KC_G, KC_H, KC_I
),
};
ビルド
この記事の根幹の一つなのに簡単すぎて一行。
$ ~/qmk/qmk_firmware/util/docker_build.sh meishi_bps:default
以上で ~/qmk/qmk_firmware/meishi_bps_default.hex
が出来上がっているはずです。これを書き込みます。
書き込み
準備
WSLでavrdudeを簡単に使う為の奴を流用させていただきます。
qmk_toolboxに入っているavrdude.exeとavrdude.confを利用する形に修正しました。
# avrdude.sh
TOOLBOXDIR='/home/miyason/qmk/qmk_toolbox/'
MODECMD='/mnt/c/Windows/System32/mode.com'
COMPORT1=$(${MODECMD}|grep -o 'COM[0-9]*')
COMPORT2=""
while [ "$COMPORT2" = "" ];do
sleep 0.5
printf "."
COMPORT2=$(${MODECMD}|grep -v $COMPORT1 |grep -o 'COM[0-9]*')
done
echo $COMPORT2
${TOOLBOXDIR}windows/QMK\ Toolbox/avrdude.exe -C ${TOOLBOXDIR}common/avrdude.conf -c avr109 -p m32u4 -P ${COMPORT2} -U flash:w:$*
WindowsコマンドとLinuxコマンドが合わさり最強に見える。
というわけで使っていきます。
引き続き~/qmkで作業することにし、
avrdude.exeの入手先としてqmk_toolboxをクローンし、avrdude.exeに実行権限を付与します。
修正したavrdude.shを~/qmkに配置し、実行権限を付与します。
$ cd ~/qmk
$ git clone https://github.com/qmk/qmk_toolbox.git
$ chmod +x ~/qmk/qmk_toolbox/windows/QMK\ Toolbox/avrdude.exe
$ vi ~/qmk/avrdude.sh # 上記入力
$ chmod +x ~/qmk/avrdude.sh
書き込み作業
qmk_firmwareに移動し、作ったhexファイルを対象としてavrdude.shを実行します。
$ cd ~/qmk/qmk_firmware
$ ../avrdude.sh meishi_bps_default.hex
# 待機状態になり、. が延々と表示される状態になる
ProMicroのRSTとGNDを手ごろな針金でちょんちょん触ってショートさせ4、ブートローダーモードに切り替えます。
※ブートローダーモードに入る為のショート回数は1回のものと2回のものがあるようです。販売元だったり製造元だったりで変わる様子。
ブートローダーモードになると自動で書き込みが始まります。以下のようになれば成功です。
.
.
.
COM3
Connecting to programmer: .
Found programmer: Id = "CATERIN"; type = S
Software Version = 1.0; No Hardware Version given.
Programmer supports auto addr increment.
Programmer supports buffered memory access with buffersize=128 bytes.
Programmer supports the following devices:
Device code: 0x44
avrdude.exe: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.03s
avrdude.exe: Device signature = 0x1e9587 (probably m32u4)
avrdude.exe: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude.exe: erasing chip
avrdude.exe: reading input file "meishi_bps_default.hex"
avrdude.exe: input file meishi_bps_default.hex auto detected as Intel Hex
avrdude.exe: writing flash (22908 bytes):
Writing | ################################################## | 100% 2.83s
avrdude.exe: 22908 bytes of flash written
avrdude.exe: verifying flash memory against meishi_bps_default.hex:
avrdude.exe: load data flash data from input file meishi_bps_default.hex:
avrdude.exe: input file meishi_bps_default.hex auto detected as Intel Hex
avrdude.exe: input file meishi_bps_default.hex contains 22908 bytes
avrdude.exe: reading on-chip flash data:
Reading | ################################################## | 100% 0.75s
avrdude.exe: verifying ...
avrdude.exe: 22908 bytes of flash verified
avrdude.exe: safemode: Fuses OK (E:CB, H:D8, L:FF)
avrdude.exe done. Thank you.
abcdefghiしか入力できないキーボードの完成です。
感想
WSL2最高ですね。