Tech Racho エンジニアの「?」を「!」に。
  • IT Tips

WSL2だけで自作キーボードを楽しみたい

こんにちは。自作キーボード流行っていますね。(2018年12月のキーボード記事と同じ導入)
私もこの流れに乗ってキーボードを作りました。
QMK1でのファームウェア作成から書き込みまでをWSL2でやってみたのでそれを紹介したいと思います。

経緯

QMKのWindowsでの環境構築ではMSYSが必要とのことだったんですが、
qmk_firmwareのリポジトリを眺めていたところ、Docker Quick Startを発見しました。

末尾にWindowsでdocker使うの面倒なので非推奨 みたいなことが書かれていますが、
WSL2ならdockerがちゃんと動くので問題ないかなと思いWSL2でやってみることにしました。

書き込みについてはQMK_Toolboxを使おうと思っていたんですが、これもWSLでavrdudeを簡単に使う為の奴を1発見したので、
もう全部WSL2でいいんじゃないかな、と思いWSL2で全部やってみることにしました。

前提

  • キーボードは後述するあらかじめ作っておいたものを対象にします
    • マイコンはPro Micro2を、ファームウェアはQMKを使います
  • Winsows10 + WSL2 でやります
    • QMK CLIは使わず、dockerを使っていきます
      • dockerは入っている前提で進めます
    • WSL2と限定していますがWSL1でもほぼ同じことができます
      • dockerの為にWSL1を管理者権限で実行するのが面倒だったので今回はWSL2にしました

対象とするキーボード

もともとはキットを使わないキーボードの自作が目的だったので、別途作っておいた、
「Pro Microを使った3行3列の9キーキーボード」
を対象とします。

行のピン割り当ては{ D4, C6, D7 }、列のピン割り当ては{ E6, B4, B5 }としています。
名刺サイズ3なので 名前を meishi_bps とします。

記事の本題ではないのでこれ以上の情報は端折ります。
(でもモデリングと3Dプリンタでの調整と空中配線ちょっと頑張りましたというのは表明したいので画像は載せます。)

ファームウェア作成~ビルドまで

今回は~/qmkで作業することとして進めます。

qmk_firmwareをクローンし、ファームウェアのテンプレートを作成

対話形式でキーボード名、キーボードタイプ、作者名を聞かれるので、今回はmeishi_bpsavr(デフォルト)、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_ROWSMATRIX_ROW_PINS)と列の設定(MATRIX_COLSMATRIX_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
    ),
};

ビルド

この記事の根幹の一つなのに簡単すぎて一行。

$ ./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.

abcdefgしか入力できないキーボードの完成です。

感想

WSL2最高ですね。

参考



  1. 自作キーボードといえばこれってぐらい一般的に使われているファームウェアです。 
  2. ProMicro 回路図で検索するとキーボードの回路図が出るぐらい自作キーボードで一般的に使われているマイコンボードです。 
  3. もしまたmeishi展が開催されたら参加したいなぁ、という思いで名刺サイズかつ足無しの造形にしたんですが、PCBを作る時間がなかなか出てこない。 
  4. リセットスイッチぐらい実装しておけばよかった。 

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。