ワケあって、あるソフト用のショートカット専用キーボードを、3台ほど作ることになりました。
このキーボードを作る様子を、構想編とビルド編の2回に分けてお送りします。
- キー配置を決める
- 材料費をケチってDigisparkクローンを使う
- 使えるピンが少ない...
- アナログ入力で読もう
- Excelでシミュレーションする
- Rxは先に決めておく
- 最適なRsを探索する
- 回路シミュレーターで確認
まず、自作キーボードを作るためには、考えなきゃならないことが色々あります。
- コントローラー
- 基板or手配線
- キーマップ
- キースイッチ
- キーキャップ
- ケース
- 光らせるならLED
スイッチやキーキャップは、前にキーボードを作ったときの余分を使うつもりです。
ケース周りはビルド編で触れるとして、構想編では、主にコントローラーまわりについて検討してみます。
キー配置を決める
今回必要なキーは、次の6つです。
Alt + S
Ctrl + G
Ctrl + S
Ctrl + D
Ctrl + Del
Ctrl + Alt + 1
これを2つのレイヤーに分け、入力キー3つ + MODキー1つの、4キー構成で作りたいと思います。 (Modキーとは、CtrlやShiftのように、同時押しで他のキーの機能を変えるためのキーです)
キーマップはこのようになる予定、左手用です。
よく使うショートカットがデフォルト(黒字)の3つ、よく使うけれど誤操作を防ぎたい操作を、MODキーとの同時押し(赤字)に割り当てました。
材料費をケチってDigisparkクローンを使う
自作キーボードのコントローラーには、Arduino Pro Micro&QMKファームウェアを使うのが主流ですが、今回は、タイトルの通りDigisparkを使ってみます。
Attiny85という8ピンのマイコンが載っていて、V-USBというプログラムによってUSB-HID(キーボードやマウス)として振る舞うことができるマイコンボードです。
オリジナルは8〜900円くらいですが、クローン品はAliexpressで160円程度です、安い! Pro Microの廉価コピーのほぼ半額です。
基板自体がUSB-AオスになっていてPCに直挿しできるタイプと、micro-Bメス端子が付いているタイプがあるので、今回は後者を使います。
お急ぎの場合は、Amazonでも300円/個程度で買えます。
まあ安いなりに罠があって、P5がリセットピンになっているのでI/Oとしては使えないことに注意。ちなみに、基板にrev3のシルクがあれば、それはクローンです。
使えるピンが少ない...
さて、Digisparkのピンアサインはこちら。
P5はリセットピン設定で戦力外、P3とP4はUSB通信で使うので、I/Oとして使えるのはP0〜P2の3つです。
そのうえ、P1は内蔵LEDに繋がっていて入力ピンには不向きなので、使えるピンは実質2つだけ。
2ピンだとキーマトリクスを組んでも意味ないし…さて、どうやって4つのスイッチを読むか?
アナログ入力で読もう
さいわい、P2がアナログ入力として使えるので、抵抗の分圧と合成を利用して、複数キーのON/OFFをアナログ値として読むという技を使ってみようと思います。
スイッチでグランドに落とす回路が一般的なようですが、今回は抵抗と並列にスイッチを入れて、バイパスする回路にしてみます。
詳しくは下で書きますが、狙い通りに動けば、各キーのON/OFFを簡単な計算で認識できるはずです。
Excelでシミュレーションする
Excelで簡単なシミュレーターを作って、ちょうど良い抵抗値を求めていきます。
必要な計算式はこちら。
~
の合成抵抗
にかかる電圧
を求める式は
をanalogRead()した値
は
から
を逆算する式は
それをデコードして、キーのON/OFFデータにするには
そして、ひととおりExcelに入れた様子がこちら。
赤字の6 (0110)〜13 (1101)が、実際の操作で使うキー状態です。
Rxは先に決めておく
このままではちょっと変数が多すぎるので、は定数にして、それに合わせて
を調整します。
多少雑にやってもなんとかなると思うので、ためしに~
をそれぞれ次のように決めました。
2倍の等比数列にしてあるのは、合計値を4ビットの2進数に変換すれば、各キーのON/OFFを個別に取り出せるはず、という考えからです。
じつは、こんな実数でキリのいい値の抵抗は売っていないので、ビルド編の方でちょっと工夫します。
最適なRsを探索する
さて、残った変数の抵抗値は、使いたい6~13の範囲が美味しくなる値を、人力局所探索法で探します。
美味しさの判定基準は、この2項目です。
- なるべく傾き(ステップごとの電圧差)が大きい
- アナログ入力の中央値(512)に近い
結果、9kΩあたりに収束しました、その時の値がこちら。「スイッチ状態」は、右から1,2,4,8kΩのバイパスで、1がバイパスしている状態です。
分解能10bitでじゅうぶん読み取れそうです。
スイッチ状態 | Rx | 電圧 (1) | analogRead値 (2) | Rx逆算結果 (3) | デコード結果 (4) |
---|---|---|---|---|---|
1110 | 1000 | 0.500 | 102 | 995.662 | 1 |
1101 | 2000 | 0.909 | 186 | 1997.613 | 2 |
1100 | 3000 | 1.250 | 256 | 3000.000 | 3 |
1011 | 4000 | 1.538 | 315 | 3998.590 | 4 |
1010 | 5000 | 1.786 | 366 | 5006.079 | 5 |
1001 | 6000 | 2.000 | 410 | 6009.772 | 6 |
1000 | 7000 | 2.188 | 448 | 7000.000 | 7 |
0111 | 8000 | 2.353 | 482 | 8003.690 | 8 |
0110 | 9000 | 2.500 | 512 | 9000.000 | 9 |
0101 | 10000 | 2.632 | 539 | 10002.060 | 10 |
0100 | 11000 | 2.750 | 563 | 10991.320 | 11 |
0011 | 12000 | 2.857 | 585 | 11993.170 | 12 |
0010 | 13000 | 2.955 | 605 | 12995.230 | 13 |
0001 | 14000 | 3.043 | 623 | 13982.540 | 14 |
0000 | 15000 | 3.125 | 640 | 15000.000 | 15 |
あと、今回は不要なので詳細は省きますが、計算範囲を拡張してみると、7キーまでなら(計算上は)なんとか読み取れそうな感じです。(あとから抵抗の誤差を入れて計算してみたら、±1%の金属被膜抵抗で6キーが限界かも)
この時のの値は22kΩでした。
回路シミュレーターで確認
ためしに、回路シミュレーターで動かしてみると、ちゃんと計算通りの数字が出てきました。
抵抗計算に、こんな高度なツールを使う必要はまったくないけれど、ちゃんと動く感が出るとモチベーションが上がりますね。ここで実際に動かせます。
次回はこの検討結果をもとに、実際にキーボードをビルドします、お楽しみに!