「無限の可能性」というのは、キーひとつひとつのPCBで、(ケースは用意した上で)配線することで好みの配列のキーボードを作成できるPCBのことです。
BOOTHでの商品ページ:https://swanmatch.booth.pm/items/1073225
こちらと ProMicroのおうち を天キー#2で購入して、作ろうと思っているキーボードの試作をしました。作りたいと思っているキーボードは次のようなものです。
- iPadにつないでショートカットを押す用
- 基本、目はiPadを見ていたいので見なくても押せるとよい
- ので、1つの指につき1キーぐらいがよさそう
- ショートカットを入力するだけなのでそんなにキー数はいらない
上記から設計してできたものがこちらになります。
ProMicroのおうちの向き間違えたりしたけど無理矢理リカバーしてできたものがこちら(ケースはfoobarの余ってたやつ) pic.twitter.com/3xIu7frkcR
— ひよ or ひょっしー (@hyoshihara04) 2019年5月5日
次に、順番にやったことを書きます。
どんなキー配置にするか決める
1つの指につき1キーにしたいので、自動的にキーは5つになります。私は右手で使いたいので、右手の指の位置で押しやすい位置にキーを配置することになります。今回は試作ということもあり、前に作ったfoobar のフロントプレートとボトムプレートが余っていたので、フロントプレートのキーが入る位置に合わせてキーを配置しました。(実際の配置は↑の写真参照)
キーマトリックスを決める
キーマトリックスについては オリジナルキーボードを作ってみる その7「キーマトリックス」 がわかりやすいです。
どうしてこうしたのか全く覚えてないのですが、最終的には次のような配置になりました。
多分指の位置と配線のしやすさを考えてみたんだと思います。
PCBにダイオードをはんだ付けし、フロントプレートにはめてキースイッチをはんだ付けする
このあたりは GitHubにある無限の可能性などの説明 のままです。
まずキー1つ1つになるようにPCBを切った(割った)ら、ダイオードをはんだ付けします。
次いに、キースイッチをプレートにはめ、さきほどダイオードをはんだ付けしたPCBをはめ、キースイッチの足とはんだ付けします。
なお今回はLEDは使用しません。なおダイオードやキースイッチは、別の自作キーボードキットを作ったときのあまりがあったのでそれを使いました。
配線を決めてはんだ付けする
その後、ウレタンエナメル線を使ってPCBでつなぐところ同士を配線します。
だいぶ汚くて申し訳ないのですが、実際に配線作業するときは↓のようにPCBのどことどこを繋げるかを線で書いて、1個ずつチェックしながら行いました。
ウレタンエナメル線は https://www.amazon.co.jp/dp/B00JJHIMSW を使いました。ウレタンの被膜をはんだで溶かすの難しい。こて先にはんだをつけてその中に浸して盛るみたいなイメージでやってました。あと割と熱いのでやけどに注意。
また、ちゃんとはんだ付けできてるか不安だったので、1箇所配線するたびに導通してるをかテスターで確認していました。全部配線してからでもいいかもですが、もし問題があったときに影響範囲が絞りこめるので、多少面倒でも1箇所ずつやりました。
ProMicroのおうちに必要なものをはんだ付けして配線
GitHubにある無限の可能性などの説明 を参考に、ProMicroのおうちに必要なものをはんだ付けします。ただし、リセットスイッチは手持ちに余っているのがなかったので省きました。ピンセットとかでショートさせればいいのでいいかなと。
その後、さっき配線した無限の可能性のPCBと必要なピン同士を配線します。が、ここでうっかりProMicroのおうちの向きを左右逆にしてしまったので、モゲ防止に他のキーボードに繋いでいたL字のProMicroのコネクタを使ってリカバリ(?)しました。本来なら一旦配線を全部はずしてやり直したほうがいいのですが、全部配線してから気づいたのでまあいいかと。。
配線が終わったので、次はProMicroに書き込むファームウェアを作ります。
ファームウェア作成
ファームウェアはQMKを使います。ここからはqmkのビルドなどができるように環境設定ができている前提で書きます。 なお環境はmac mojaveです。(とはいえあまり違いはないはず)
まず、ターミナルでqmkのリポジトリに移動してから、次のスクリプトを実行します。
$ ./util/new_keyboard.sh
すると Keyboard Name
を聞かれたので、ここでは fumi9
と入力しました。(キーボード名だけ先に決めてあるという状況だったのでそのままその名前を使いましたが、今回は試作なのでもっと適当でよかったかも)
Enterを押すと Keyboard Type
を聞かれたのでそのままEnterを押しました。今回デフォルトで選ばれた avr
はマイコンの総称で、ProMicroに乗ってるATMega32U4もavrのマイコンです。
これで keyboards/
ディレクトリの下に fumi9
というディレクトリができ、その中にいくつかファイルが作成されました。その中の一部を修正します。このあたりは 自作キーボード設計入門 を参考にしました。
rules.mk
ここはMCU名などのハードウェアに関する設定や、ファームウェアでどんな機能を有効にするかなどの設定をします。今回はファイル末尾の hoge_ENABLED
だけを一部変更しました。
config.h
MATRIX_ROWS
, MATRIX_COLS
, MATRIX_ROW_PINS
, MATRIX_COL_PINS
を実際の配線に合わせて設定します。本来なら VENDOR_ID
なども修正したほうがいいですが動作には問題ないです。
ピンの名前は sparkfunのサイトから DOCUMENTS
> Graphical Datasheet
とたどって出てきたPDFを参照します。
fumi9.h
LAYOUT
を設定します。(私は面倒だったので上記の本にある LAYOUT_KC
は省きました)
LAYOUT
の設定の仕方はコード内のコメントにもある通り、2つ要素を設定します。
1つ目の要素はキーの配置を表し、後述の keymap.c ではこの順番でキーを指定してキーマップを定義します。そのため、実際の物理的なキー配置に合わせるとよいです。 k00
とかの値は2つ目の要素の指定で使います。なんで k\d\d
なのかわかってないけど多分そういうものです。今回は左手の指の順番にしています。
2つ目の要素はそのキーがキーマトリックス的にどの位置にあるかを指定します。1つ目の要素で並べたキーのキーマトリックス上での配置を表します。上で示したキーマトリックスの写真での紫色の文字が対応しています。
(最初は1つ目の要素もキーマトリックスの配置じゃないと駄目だと思い込んでて無駄に苦労したのをメモしておく)
keymaps/default/keymap.c
実際にキーマップを設定します。キー配置は先ほど設定した LAYOUT
の1つ目の要素の順に並べます。
また、今回、単押しだとModifier(CmdとかShiftとか)付きのキータップ、長押しだとレイヤー切り替えにしたかったので、下記記事を参考にして実装しました。
QMK Firmware で Raise/Lower と変換/無変換を同じキーに割り当てる
なお、最初はqmkのmacroの仕組みを使って実装しようと思っていたのですが、qmkのドキュメント を見るかぎり、macroはdeprecatedらしいので書いてあるとおりSEND_STRING()
などを使って実装しました。実装箇所は https://github.com/yoshihara/qmk_firmware/blob/4b9f5cd499305a5b519d3ccdbf19015c13785aa8/keyboards/fumi9/keymaps/default/keymap.c#L51-L95 になります。
ビルドと書き込み
編集が終わったらビルドと書き込みをします。ProMicroのおうちに付けたProMicroとPCをケーブルで繋ぎます。 以下のコマンドを実行してビルドから書き込みをします。ビルドに失敗する場合はエラーで止まります。
$ make fumi9:default:avrdude
リセット待ちになるまで待ちます。今回はピンセットでリセットスイッチを付けるランドをつないでショートさせ、リセットしました。エラーなく書き込みが終了したら、キーを押してみて指定したキーマップどおりにキー入力ができるか確認します。私は karabiner-elements
についてくる EventViewer
を使いました。もし入力できない場合は以下の原因が考えられます。(他にもあるかもしれない)
- はんだミス(ちゃんとはんだ付けされておらず導通してないなど)
- 部品が壊れている(他の原因と比べて起きにくい気はするけどないことはない)
- 配線ミス(つなぐところを間違えている)
- ファームウェアがおかしい(ピン設定を間違えているなど)
動作確認して完成
動作確認がとれたらボトムプレートをスペーサーとねじでプレートにつけて完成です。(今回はfoobarなのでM2の小ねじとスペーサーを使っています)
まとめ
自分でキーボードの設計してみたいとは思っているのですが、1つのキーボードを作るまでには設計やらなんやら色々あるので、手配線でできる無限の可能性で試せてよかったです。実際に使ってみてますが、機能的にはこれで困ってないです。ただ私は設計すること自体が目的みたいなところがあるので、今回のを踏まえて改めて基板を設計してみようと思いました(まずkicadの勉強から)