自作キーボードを手動CNCコントローラにしてみた
はじめに
先日、Deign Solution Forumというイベントで講演をしたのですが、同時開催された抽選でなんと自作キーボードキットのSHIROが当たりました。
せっかくの初自作キーボードなので有効活用しようと思い、昨年末購入したCNCフライス、Kitmill CL100の手動コントローラにしてみました。
抽選で当たった自作キーボードを有効活用して、CNC手動コントローラにしてみた
— 水田かなめ (@kmizta) March 28, 2021
操作もだんだん慣れてきた pic.twitter.com/d16c1oytDo
自作キーボードに不慣れなこともあって、実際に使えるようになるまで色々手間取ったので備忘録がてら工程を記しておきます。
ファームウェアの作成
SHIROにはAVRマイコン(ProMicro)が搭載されており、ファームウェアを書き込んでPCに接続するとキーボードとして認識されます。
自分の好きなキーマップで動作させるには、AVRマイコン用のファームウェアを作成する必要があります。
方法には大きく2種類があります。私は後述の理由により②を使いました。
1.QMK Configuratorを使う
2.QMK Firmwareをダウンロードし、自分でビルドする
QMK Configurator
QMK Configuratorでは、様々な自作キーボードのファームウェアをGUIで自動的に作成することができます。
上記のページでKEYBOARDにSHIROを選択し、好きなキーの位置に好きな機能を割り当てることができます。
割当が完了したら、右上のCOMPILEを押すとファームウェアがコンパイルされ、終わり次第ダウンロードが可能になります。
ただ、今回CNCの操作をするために、Ctrl+Shift+Dというキーマップを使いたかったのですが、CtrlとShiftとキーを組み合わせる方法が見当たらなかったので、後述の自分でビルドする方法を使いました。
(QuantumにあるMod key combinationsというのがいわゆるShiftとかCtrlとかAltとかとキーを組み合わせる機能なのですが、その中にShift+Ctrlが見当たりませんでした)
QMK Firmware
上記の通りQMK Configuratorでは所望の機能が使えなさそうだったので、QMK Firmwareを使って自分でファームウェアをビルドすることにしました。
ファームウェアをビルドするにはまずは開発環境を作る必要があります。makeが使える環境で以下のリポジトリをクローンします。
私は普段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です。
細かいキーコードの記法についてはこちらを参照ください。
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コントローラにするまでの記録でした。ファームウェアの作成、書き込みなどいろいろ便利ツールが出ているのですが、微妙に私の環境には合わず、結局泥臭いやり方になってしまいましたが、勉強になりました。
いろんな形のキーボードが出ているので、キーボード操作できる機器のオリジナルコントローラとして自作キーボードを使うのは面白いかもしれませんね。