West Gate Laboratory

人生を少しでも,面白く便利にするモノづくり

自作キーボードを手動CNCコントローラにしてみた

はじめに

先日、Deign Solution Forumというイベントで講演をしたのですが、同時開催された抽選でなんと自作キーボードキットのSHIROが当たりました。

f:id:kaname_m:20210328095050j:plain

素 - Shiroyushakobo.jp

せっかくの初自作キーボードなので有効活用しようと思い、昨年末購入したCNCフライス、Kitmill CL100の手動コントローラにしてみました。

自作キーボードに不慣れなこともあって、実際に使えるようになるまで色々手間取ったので備忘録がてら工程を記しておきます。

ファームウェアの作成

SHIROにはAVRマイコン(ProMicro)が搭載されており、ファームウェアを書き込んでPCに接続するとキーボードとして認識されます。
自分の好きなキーマップで動作させるには、AVRマイコン用のファームウェアを作成する必要があります。

方法には大きく2種類があります。私は後述の理由により②を使いました。

1.QMK Configuratorを使う

2.QMK Firmwareをダウンロードし、自分でビルドする

QMK Configurator

QMK Configuratorでは、様々な自作キーボードのファームウェアGUIで自動的に作成することができます。

config.qmk.fm

上記のページでKEYBOARDにSHIROを選択し、好きなキーの位置に好きな機能を割り当てることができます。
割当が完了したら、右上のCOMPILEを押すとファームウェアコンパイルされ、終わり次第ダウンロードが可能になります。

f:id:kaname_m:20210327140031p:plain
コンパイル中はイモが回転するナイスなページ

ただ、今回CNCの操作をするために、Ctrl+Shift+Dというキーマップを使いたかったのですが、CtrlとShiftとキーを組み合わせる方法が見当たらなかったので、後述の自分でビルドする方法を使いました。
(QuantumにあるMod key combinationsというのがいわゆるShiftとかCtrlとかAltとかとキーを組み合わせる機能なのですが、その中にShift+Ctrlが見当たりませんでした)

QMK Firmware

上記の通りQMK Configuratorでは所望の機能が使えなさそうだったので、QMK Firmwareを使って自分でファームウェアをビルドすることにしました。

ファームウェアをビルドするにはまずは開発環境を作る必要があります。makeが使える環境で以下のリポジトリをクローンします。

github.com

私は普段Windows機のため、WSL上にクローンしました。

クローンできたら、qmk_firmware/keyboards/shiro/keymaps/に移動します。ここに自分用のキーマップを作成します。 デフォルトではdefaultとcheckというキーマップが入っています。defaultのキーマップは以下のようになっています。
layer_numberでレイヤごとに別機能が割り当てられていて、レイヤ自体はキーボード上部の3つのキーで切り替えられるようになっているようです。
KC_*というのがたくさんありますが、これがキー割り当てです。KC_ESCはエスケープを表します。

enum layer_number {
  _NUMBER = 0,
  _CURSOL,
  _MOUSE
};

#define NUMBER TO(_NUMBER)
#define CURSOL TO(_CURSOL)
#define MOUSE  TO(_MOUSE)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [_NUMBER] = LAYOUT(
    NUMBER,   CURSOL,   MOUSE,
    KC_P7,    KC_P8,    KC_P9,
    KC_P4,    KC_P5,    KC_P6,
    KC_P1,    KC_P2,    KC_P3,
    KC_P0,    KC_BSPC,  KC_ENT
  ),
  [_CURSOL] = LAYOUT(
    NUMBER,   CURSOL,   MOUSE,
    KC_HOME,  KC_UP,    KC_PGUP,
    KC_LEFT,  KC_ESC,   KC_RIGHT,
    KC_END,   KC_DOWN,  KC_PGDN,
    KC_DEL,   KC_BSPC,  KC_ENT
  ),
  [_MOUSE] = LAYOUT(
    NUMBER,   CURSOL,   MOUSE,
    KC_CUT,   KC_COPY,  KC_PSTE,
    KC_UNDO,  KC_FIND,  KC_AGIN,
    XXXXXXX,  XXXXXXX,  XXXXXXX,
    KC_DEL,   KC_BSPC,  KC_ENT
  ),
};

今回、"cnc"というキーマップを作るため、上記ディレクトリにdefaultのディレクトリをコピーし、名前をcncに変更しました。それができたら、フォルダ内のkeymap.cを修正します。

Kitmill CL100のキー割り当ては以下の通りでしたので、それをキーボードに適当に割り付けました。

機能 割当
+X移動 Right arrow
-X移動 Left arrow
+Y移動 Up arrow
-Y移動 Down arrow
+Z移動 Page up
-Z移動 Page down
高速移動 Shift+何か
スピンドル回転 Ctrl+D
スピンドル停止 Shift+Ctrl+D
緊急停止 ESC
// cnc/keymap.c
enum layer_number {
  _NUMBER = 0,
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [_NUMBER] = LAYOUT(
    KC_ESCAPE,  KC_ESCAPE,      KC_ESCAPE,
    RCTL(KC_D), KC_NO,          RCTL(RSFT(KC_D)),
    KC_LSHIFT,  KC_NO,          KC_PGUP,
    KC_NO,      KC_UP,          KC_PGDOWN,
    KC_LEFT,    KC_DOWN,        KC_RIGHT
  ),
};

レイヤは1つだけにしています。
キーボードの上部3キーに緊急停止、その下にスピンドル開始/停止、下3段にXYZの割当をしています。
RCTL()がRight Control+何かにあたります。Leftでも良いはず。
これは入れ子で書くこともできるので、Ctrl+Shift+Dをやりたければ、RCTL(RSFT(KC_D))と書けばOKです。

細かいキーコードの記法についてはこちらを参照ください。

docs.qmk.fm

keymap.cを編集し、キー割り当てを終えたらコンパイルします。qmk_firmwareディレクトリに戻ってmake shiro:cncします。全て問題なければ.buildディレクトリにshiro_cnc.hexができます。

ファームウェアができたらあとは書き込みなのですが、WSL上では書き込みができないのでhexファイルをWindows上に持ってきます。

ファームウェアの書き込み

ファームウェア(hexファイル)をWindows上に持ってきたらUSB経由で書き込みます。

簡単な方法としては、QMK Toolboxを使えばGUIで書き込める(はず)なのですが、どうにもリセットと書き込みのタイミングが合わず、断念。

仕方ないので、コマンドプロンプトから書き込みます。
コマンドプロンプトから書き込む場合はAVRDudeが必要なので、本家サイトからダウンロード、インストールしておきます。

USBケーブルでSHIROキーボードを接続し、リセットボタンを押すとCOMポートとして認識されますので、そのCOMポート番号をメモっておきます。

ちなみに、PortPopを入れると接続したり切断したときにバルーンが出るのでとても便利です。

github.com コマンドプロンプトで以下のコマンドを打つ「準備」をしておきます。

avrdude -p atmega32u4 -c avr109 -U flash:w:"D:\temp\shiro_cnc.hex":i -P COM2

※パス、COMポート番号は適宜書き換えます。

どうやらブートローダが認識される(書き込める)のはリセットを押してから短い間だけのようなので、一度キーボードを外し、再度接続してキーボードのリセットボタンを押します。
COMポートとして認識されたら、すかさずEnterを押して上記コマンドを打ちます。タイミングがうまく合えば、以下のようなメッセージが出てファームウェアが書き込めます。

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: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e9587
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "D:\temp\shiro_cnc.hex"
avrdude: writing flash (22454 bytes):

Writing | ################################################## | 100% 2.87s



avrdude: 22454 bytes of flash written
avrdude: verifying flash memory against D:\temp\shiro_cnc.hex:
avrdude: load data flash data from input file D:\temp\shiro_cnc.hex:
avrdude: input file D:\temp\shiro_cnc.hex contains 22454 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.67s



avrdude: verifying ...
avrdude: 22454 bytes of flash verified

avrdude: safemode: Fuses OK


avrdude done.  Thank you.

ここまでくれば、晴れてキーボードとして使用することができます。やったね。

まとめ

抽選で自作キーボードが当たったので、それをCNCコントローラにするまでの記録でした。ファームウェアの作成、書き込みなどいろいろ便利ツールが出ているのですが、微妙に私の環境には合わず、結局泥臭いやり方になってしまいましたが、勉強になりました。

いろんな形のキーボードが出ているので、キーボード操作できる機器のオリジナルコントローラとして自作キーボードを使うのは面白いかもしれませんね。