この記事はキーボード #1 Advent Calendar 2022の8日目の記事です。

昨日は、千葉千夏/あずさんの 2022年は自作キーボードの設計を妄想し続けた|千葉千夏/あず|noteでした。 作りたいものを書きだすと夢が広がっていいですね。 また、湯呑み型キーボードも作っていただいてありがとうございます。

今年は3つのカレンダーがあるようです。


今年も変則マトリクスを使ったキーボードを沢山作った。 変則マトリクスを使ったキーボードは、 設計で許容される余裕が通常のマトリクスより狭い場合がある、 今回はそれがどの程度なのかを計測したいと思う。

回路中の重要なパラメータとしてVthとVfがある。

Vthはキーが押された事をマイコンが判定する電圧。 Vfは回路中のダイオードがおこす電圧降下の電圧だ。

これらが各マトリクスの要求範囲に入っていないとキーボードは正常に動作せず、 押しても認識されなかったり、 ゴーストが発生したりする可能性がある。

今回は、各回路のVthとVfの関係を示し、実際にこのVthとVfを計測する。

変則マトリクスとは

マトリクス自体に関しては、 キーボードのマトリクス方式の分類を読んで欲しい。

通常のマトリクス

マトリクスの図

まずは、比較用の通常マトリクス。Vf < Vth である必要がある。

倍マトリクス

倍マトリクスの図

キーが押されたらダイオード1つを通って繋がる。 ダイオード3つ通って繋がったのがLow扱いされるとゴーストがでる。 そのため、Vf < Vth < Vf*3 である必要がある。

二乗マトリクス

(図は省略)

キーが押されたらダイオード1つを通って繋がる。 ダイオード2つ通って繋がったのがLow扱いされるとゴーストがでる。 そのため、 Vf < Vth < Vf*2 である必要がある。 一般にこれを満たすのは難しい事が知られている。

改良二乗マトリクス

二乗マトリクスの図

キーが押されたらダイオード2つを通って繋がる。 ダイオード4つ通って繋がったのがLow扱いされるとゴーストがでる。 Vf*2 < Vth < Vf*4 である必要がある。

スレッショルド電圧 (Vth)

ここでは、GPIOを入力モードにした時に、Lowと判定される一番大きい電圧と定義する。

計測方法

GPIOのうち1つを入力にし、それがLoかHighかを出力するプログラムを書いた。 Arduinoだと次のようなコードだ。

void setup() {
    pinMode(1, INPUT);
    pinMode(2, OUTPUT);
}

void loop() {
   digitalWrite(2, digitalRead(1) == HIGH);
}

実験用電源を使って電圧を変える。 別途テスタで電圧を計測しながら計測する。

電源電圧も多分に影響するため、 チップの電源電圧も同時に計測する。

ATMega32u4

データシートの保証値は1.9V以下0.9V以上(5V動作時) 経験上1.5-1.6Vぐらいにある。

今回は電源4.73V環境下で計測し、 Vthは1.45V-1.56Vになった。

1.39Vから1.5Vであるという報告がある。 1.40-1.45Vという報告もある。

RP2040

データシートの保証値は0.8Vから2.0V(3.3V動作時)

今回は電源3.313V環境下で計測し、 Vthは1.26-1.36Vになった。

1.23V-1.34Vという報告がある。 1.28-1.38Vという報告もある。

TODO あとで他のチップも入れる。

ダイオード電圧

ダイオードを回路に挟んで、 順方向電圧をかけた時、 Vfと呼ばれる電圧降下が発生する。

一般にキーボードで使われている、1N4148のVfはデータシートでは1V以下である事が保証されてる。 この値は流れる電流によって決まる。

キーボードの場合、内蔵プルアップ抵抗を使っていると思うので、 この抵抗値は電流に影響を与える。 また、反対側につなぐGPIOのFETも電圧差を作るので、ここも考えたい。

計測方法

今回は1N4148をキーボードで使った時のVfを計測した。

Vf計測方法

回路のように接続し、 ArduinoのコードでOUTPUT+LOWとINPUT_PULLUPを設定、 入力ピンとGNDの間の電圧を計測した。

void setup() {
    pinMode(1, OUTPUT);
    digitalWrite(1, HIGH);
    pinMode(2, INPUT_PULLUP);
}

void loop() {
}

この上で、ダイオードの数を1個から4つ直列まで変えて計測する。

Vcc電圧も同時に記録しておく。

ATMega32u4

電源電圧4.76V

  • Vf*1: 0.513V
  • Vf*2: 1.034V
  • Vf*3: 1.495V
  • Vf*4: 1.963V

RP2040

電源電圧3.316V

  • Vf*1: 0.474V
  • Vf*2: 0.949V
  • Vf*3: 1.418V
  • Vf*4: 1.862V

Vf*3が1.42Vである事が報告されてる。

3.3V動作のチップの方がプルアップ抵抗に来てる電圧が低いため、 また、プルアップ抵抗の抵抗が大きいのか、 VfはATMega32u4より小さくなるようだ。

TODO あとで他のチップも入れる。

まとめ

まとめると次のようになった。

マイコン Vth Vf*1 Vf*2 Vf*3 Vf*4
ATMega32u4 1.45V-1.56V 0.513V 1.034V 1.495V 1.963V
RP2040 1.26V-1.36V 0.474V 0.949V 1.418V 1.862V

Vf*2はVthを超えるのはやはり難しい、 そのため、単純な二乗マトリクスの式 Vf < Vth < Vf*2を満たすのは難しそうだ。

改良二乗マトリクスでは計算にVf*4を使うので、 Vf*2 < Vth < Vf*4はどちらのマイコンも満せてそう。

倍マトリクスは、RP2040では計算式を満たせているが、 ATMega32u4ではVthが高いので、Vf*3では満せていない。 手元でこの組み合わせのコードは動作していたので、 今回の計測方法が悪いのかもしれない。 電源電圧が5Vより若干低かった事や、 選択していないラインから流れてくる電流の影響が考えられる。 今後動作しているキーボードで測定してみたい。

改良二乗マトリクスは動作するが、 倍マトリクスでは動作しない場合、 改良二乗マトリクスで行った改良を倍マトリクスに施した、 改良倍マトリクスをするというアイディアもありえるかもしれない。

今回、時間がなく、2種類のマイコンでしか調べられなかった。 また、今後、もっと沢山のマイコンで、この計測を行いたい。


明日9日は、t-miyajimaさんの(多分)日本一重い自作キーボード Ponshu70 のケースを根性で手彫りしている最中に二次創作小説の締切を守れなかったお話です。

今回の記事は3mk(2021年版)で書きました。