メカニカルスイッチは押した状態と放した状態の間の移行が単純ではないことが良くあります。
理想的な世界では、スイッチを押すと、デジタルピンが次のようになることが期待されます: (X 軸は時間を表します
voltage +----------------------
^ |
| |
| ------------------+
----> time
しかし実際の世界では、値が最終的に落ち着くまでに 0 と 1 の間を行ったり来たりする接点バウンスを見ることになるでしょう。(訳注:日本語では、バウンスとチャタリングを区別せずにチャタリングと呼んでいることが多いようです。)
+-+ +--+ +-------------
| | | | |
| | | | |
+-----------------+ +-+ +-+
スイッチが落ち着くまでにかかる時間は、スイッチの種類や経年、押す技術によって異なる場合があります。
デバイスが接点バウンスを緩和しないことを選択した場合、スイッチが押された時に起きるアクションが複数回繰り返されることがよくあります。
接点バウンス(「デバウンス」)を処理する方法はたくさんあります。RC フィルタのような追加のハードウェアを採用する方法もありますが、ソフトウェアでデバウンスを行う様々な方法もあり、よくデバウンスアルゴリズムと呼ばれます。このページでは、QMK で利用できるデバウンスメソッドについて説明します。
技術的には接点バウンス/接点チャタリングとは見なされませんが、一部のスイッチテクノロジーはノイズの影響を受けやすく、キーの状態が変化していない時に、時々短くランダムに 0 と 1 の間を行き来する様子がデジタル回路によって読み取られる場合があります。例えば:
+-+
| |
| |
+-----------------+ +--------------------
多くのデバウンスメソッド(全てではないですが)は、デバイスにノイズ耐性を持たせます。 ノイズの影響を受けやすい技術を使っている場合は、ノイズを緩和するデバウンスメソッドを選択しなければなりません。
時間の単位: タイムスタンプ (ミリ秒) vs 周期 (スキャン)
config.h
マクロを介して選択できるようになるでしょう。対称 vs 非対称
sym_*
asym_*
の後に、キーダウン、キーアップの順に使っているアルゴリズムタイプの詳細が続きます。イーガー vs デファー
sym_eager_*
asym_eager_*_*
: キーダウンはイーガーアルゴリズムを使いますasym_*_eager_*
: キーアップはイーガーアルゴリズムを使いますsym_defer_*
asym_defer_*_*
: キーダウンはデファーアルゴリズムを使いますasym_*_defer_*
: キーアップはデファーアルゴリズムを使いますグローバル vs キーごと vs 行ごと
*_g
*_pk
*_pr
QMK はデバウンス API を介して複数のデバウンスアルゴリズムをサポートします。
DEBOUNCE_TYPE | 説明 | 他に必要なもの |
---|---|---|
未定義 | デフォルトのアルゴリズム、現在のところ sym_defer_g を使います | 無し |
custom | 独自のデバウンスコードを使います | SRC += debounce.c で独自の debounce.c を追加し、必要な関数を実装します |
その他 | quantum/debounce/* から他のアルゴリズムを使います | 無し |
分割キーボードについて: デバウンスコードは分割キーボードと互換性があります。
キーボードは、rules.mk
に次の行を追加することで、既に実装されているデバウンスメソッドの1つを選択できます:
DEBOUNCE_TYPE = <アルゴリズムの名前>
アルゴリズムの名前は次のいずれかです:
sym_defer_g
- キーボードごとにデバウンスします。状態が変化すると、グローバルタイマが設定されます。DEBOUNCE
ミリ秒の間何も変化がなければ、全ての入力の変更がプッシュされます。
sym_eager_pr
- 行ごとにデバウンスします。状態が変化すると、応答は即座に行われ、その後その行は DEBOUNCE
ミリ秒の間入力されません。
NUM_KEYS
の 8ビットカウンタの更新に高い計算コストがかかる、もしくは低スキャンレートのキーボード用で、各指は通常一度に1行しか叩かないようになっています。これは ErgoDox モデルに適しています; マトリックスは90度回転しているため、その「行」は実際には「列」であり、通常の使用では各指は一度に1つの「行」にしか当たりません。sym_eager_pk
- キーごとにデバウンスします。状態が変化すると、応答は即座に行われ、その後そのキーは DEBOUNCE
ミリ秒の間入力されません。sym_defer_pk
- キーごとにデバウンスします。状態が変化すると、キーごとのタイマーが設定されます。DEBOUNCE
ミリ秒の間そのキーに変化がなければ、キーの状態の変更がプッシュされます。sym_defer_pr
sym_eager_g
asym_eager_defer_pk
独自のデバウンスアルゴリズムを実装するためのオプションがあります。次のようにします:
rules.mk
に DEBOUNCE_TYPE = custom
を設定します。rules.mk
に SRC += debounce.c
を追加します。debounce.c
を追加します。例については、quantum/debounce
にある現在の実装を見てください。quantum/debounce
に追加することを検討してください。