小さなArduino互換機Digisparkで自作キーボードを作る話 構想編—アナログ入力で複数キーを読む方法について—

ワケあって、あるソフト用のショートカット専用キーボードを、3台ほど作ることになりました。

このキーボードを作る様子を、構想編とビルド編の2回に分けてお送りします。

f:id:at_you_key:20200218124543j:plain

完成予想図

まず、自作キーボードを作るためには、考えなきゃならないことが色々あります。

  • コントローラー
  • 基板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(キーボードやマウス)として振る舞うことができるマイコンボードです。

qiita.com

オリジナルは8〜900円くらいですが、クローン品はAliexpressで160円程度です、安い! Pro Microの廉価コピーのほぼ半額です。

AliExpress.com Product - 1pcs Digispark kickstarter development board ATTINY85 module for Arduino usb

基板自体がUSB-AオスになっていてPCに直挿しできるタイプと、micro-Bメス端子が付いているタイプがあるので、今回は後者を使います。

お急ぎの場合は、Amazonでも300円/個程度で買えます。

まあ安いなりに罠があって、P5がリセットピンになっているのでI/Oとしては使えないことに注意。ちなみに、基板にrev3のシルクがあれば、それはクローンです。

使えるピンが少ない...

さて、Digisparkのピンアサインはこちら。

P5はリセットピン設定で戦力外、P3とP4はUSB通信で使うので、I/Oとして使えるのはP0〜P2の3つです。

by MortenAaserud

そのうえ、P1は内蔵LEDに繋がっていて入力ピンには不向きなので、使えるピンは実質2つだけ。

2ピンだとキーマトリクスを組んでも意味ないし…さて、どうやって4つのスイッチを読むか?

2×(2-1)のマトリクス

アナログ入力で読もう

さいわい、P2がアナログ入力として使えるので、抵抗の分圧と合成を利用して、複数キーのON/OFFをアナログ値として読むという技を使ってみようと思います。

synapse.kyoto

スイッチでグランドに落とす回路が一般的なようですが、今回は抵抗と並列にスイッチを入れて、バイパスする回路にしてみます。

詳しくは下で書きますが、狙い通りに動けば、各キーのON/OFFを簡単な計算で認識できるはずです。

Excelでシミュレーションする

Excelで簡単なシミュレーターを作って、ちょうど良い抵抗値を求めていきます。

必要な計算式はこちら。

RaRdの合成抵抗Rxにかかる電圧Vxを求める式は

 \displaystyle
Vx=\frac{Rx}{Rx+Rs}\times{Vs}\tag{1}

VxをanalogRead()した値Dx

 \displaystyle
Dx=\frac{Vx}{Vs}\times 1024 \tag{2}

DxからRxを逆算する式は

  \displaystyle
Rx=\frac{Rs}{\frac{1024}{Dx}-1} \tag{3}

それをデコードして、キーのON/OFFデータにするには

  \displaystyle
(byte)round(\frac{Rx}{Ra}) \tag{4}

そして、ひととおりExcelに入れた様子がこちら。

赤字の6 (0110)〜13 (1101)が、実際の操作で使うキー状態です。

Rxは先に決めておく

このままではちょっと変数が多すぎるので、Rxは定数にして、それに合わせてRsを調整します。

多少雑にやってもなんとかなると思うので、ためしにRaRdをそれぞれ次のように決めました。

Ra=1k\Omega,\quad Rb=2k\Omega,\quad Rc=4k\Omega,\quad Rd=8k\Omega

2倍の等比数列にしてあるのは、合計値を4ビットの2進数に変換すれば、各キーのON/OFFを個別に取り出せるはず、という考えからです。

じつは、こんな実数でキリのいい値の抵抗は売っていないので、ビルド編の方でちょっと工夫します。

最適なRsを探索する

さて、残った変数Rsの抵抗値は、使いたい6~13の範囲が美味しくなる値を、人力局所探索法で探します。

美味しさの判定基準は、この2項目です。

  • なるべく傾き(ステップごとの電圧差)が大きい
  • アナログ入力の中央値(512)に近い

f:id:at_you_key:20200218093952g:plain

結果、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キーが限界かも)

7キーだと0〜127の範囲

この時のRsの値は22kΩでした。

回路シミュレーターで確認

ためしに、回路シミュレーターで動かしてみると、ちゃんと計算通りの数字が出てきました。

抵抗計算に、こんな高度なツールを使う必要はまったくないけれど、ちゃんと動く感が出るとモチベーションが上がりますね。ここで実際に動かせます。

次回はこの検討結果をもとに、実際にキーボードをビルドします、お楽しみに!