ヒトは知識ゼロから自作キーボードを作れるか?
筆者のレベル
ソフトウェア
大学の研究でCを書いていた程度、国立研究所でスパコン向けにC++を書いていた程度、民間企業でWeb開発をしている程度
ハードウェア
大学の授業でマイコンで遊んでいた程度
座学
理論
作り方
PCB設計
無線化
ソフトウェア
PCB(プリント基板)設計
レイアウト
作る時の留意点
Keyboard Layout Editorではキーサイズ1×1で作ってai03さんのジェネレータでキーキャップのサイズを指定すると綺麗に出力できる
Themis V1
PCB
footprint検索に便利
配線と外枠まで
納品前のGerberチェック
マウント用の穴とベタグランド
キーが干渉しないかチェック、18×17で組んだのでChocFoxキーキャップがぴったり
はんだ付け後の状態、やってみてわかったのはSMDの方がはんだ付けが簡単で足を切らなくていいので楽
ただTHTだとPCB設計中にviaとしての役割も担えるので便利は便利(viaを綺麗に配置する方法を知らないだけと言われればそう)
キースイッチとキャップをはめた状態で試打
まず親指の一番内側のキーを1.5Uにしようと思ってたけど90°回転させないといけないのを見落としていた
縦コンボは押せるけど最適ではなさそうなのでちゃんと動いたらChicago StenoかKLP Lameを検討したい
なお何も考えずにPro Microを表裏逆にピンソケットに付けてしまった(本当に頭がバグってた)ので後日つけなおし
QMKを設定するときに便利だったピンの名称
できた、2024-09-22に完成、10日あれば作れる
分割キーボードではTRRSケーブルを使って VCC/GND/SDA/SCLを繋ぐらしい
シフトレジスタを用いた出力ピン増設
あるピンの入力がクロック信号ごとにHIGHかLOWか(シリアル信号)によってレジスタに書き込んでLATCHピンに入力を与えるとレジスタのビット値に対応する出力ピンがHIGH/LOWになったり(パラレル信号)、逆に複数の入力ピンのHIGHかLOWか(パラレル信号)をクロック信号ごとに出力する(シリアル信号)仕組み
前者をSIPO、後者をPISOという
マイコンボードのピン的にはそれぞれMOSI/MISO線を使う、MISO線はクロックごとに入力を走査する必要があり電力消費が大きいというデメリットがある
キーボードの用途では例えば75%で80キーとちょっと
例としてseeed XIAO BLEにアナログスティックを2つ繋ぎつつLiPoバッテリーを充電できるようにするとアナログ線5本が必要で残るピンの数は6本、3×3=9キーまでしか配置できない
しかしSIPOのシフトレジスタを使えばシリアル信号、クロック信号、レジスタロック(ラッチ)信号の三本のピンを8本に増やすことができる
さらにシフトレジスタのシリアル出力とマイコンのクロック・レジスタロックを他のシフトレジスタに繋いでやれば+8本、3本のピンを16本に増やすことができる
ここから知識ゼロでゲームパッドを作れるのか?編
6/9-dof センサからの姿勢推定
propsoed
の誤字あり
同じく5.5内に convergene
teh
experimetns
などの誤字あり、おもろい
vendor id?の設定
ここまでの軌跡
- とりあえず適当にHID Reportをでっちあげてみる(敗北)
- インターネットにあるHID Reportを参考に書いてみる(GamePad Testerは認識するがFF14が認識しない
- Vendor IDとProduct IDを無理やり設定してみる(ここで丸一日溶かす、単純に検索するとSDPでやる方法しか出てこない、なんかよくわからないけどGATTでできるらしいと知る、仕様書を漁ったら見つかる、CircuitPythonのコードを読んで実装を追加、PRを出してマージされる、FF14が認識するようになるが入力には反応しないの)
- WindowsにBLEで繋ぐと明らかにリファレンスのGuliKit KK3 Maxと挙動が違うのでHID Reportの形式が微妙に違うと信じたいが、rreport ID 2-3を実装しないといけなくなるとCircuitPythonの根元に手を入れることになるので大変
- 一旦BLEの通信内容をWiresharkでSniffingしてみたいがなんか出てこない
なんかうまくsniffingできなかったけど便利Webサイトは見つけた
既存のHIDで 0x01 レポートは良さそうなので 0x02-0x04 レポートが定義できないのが問題そう