Keypad(Key Matrix) Control

1.Keypadの入手

マトリックスタイプのキーパッドは、行と列のマトリックスの交差部分にキー(スイッチ)が配置されている構造です。
市販されているキットは、ダイオードの有無により二つのタイプがあります。
1)ダイオード入り
秋月電子
http://akizukidenshi.com/catalog/g/gK-12229/
回路図
http://akizukidenshi.com/download/ds/akizuki/AE-KIT45-KEYPAD4X3.pdf
2)ダイオード無し
Digilent
https://reference.digilentinc.com/reference/pmod/pmodkypd/start
回路図
https://reference.digilentinc.com/_media/reference/pmod/pmodkypd/pmodkypd_sch.pdf

自作した5x5のキーパッド (ダイオードの有無も確認)
https://os.mbed.com/media/uploads/kenjiArai/keypad_mbed0.jpg

2.ハードウェア結線

回路図をPDFファイルとして掲載します。
https://os.mbed.com/media/uploads/kenjiArai/keypad_med.pdf
PmodKYPDの接続は、ダイオード部分がショートしているSimple構造と考えてください。
秋月キットはダイオードが接続されているので、Recommend(回路図通り)となります。
ライプラリ内の呼び方、回路図の名称などの関連は下記の通りです。

Lib. name回路図秋月PmodKYPD
kxX_OUTXCOL1
kyY_OUTYCOL2
kzZ_OUTZCOL3
kwW_OUTCOL4
kvV_OUT
kaA_INAROW1
kbB_INBROW2
kcC_INCROW3
kdD_INDROW4
keE_IN

3.ライブラリとサンプルプログラム

Import libraryKeypad

3x4 keypad library (Extended not only 3x4 but 4x4,4x5 and 5x5 keys)


Import programKeypad_input

test program for keypad(Extended not only 3x4 but 4x4,4x5 and 5x5 keys)


Import programKeypad_input_OS2

Keypad program runs on OS2. Extended not only 3x4 but 4x4,4x5 and 5x5 keys.


4.ライブラリの動作原理

25キー(5x5)を例に説明します。
5つのポートを出力に設定しますが、過大電流防止防止のためCPUのポートのソース側のFET(P-ch(CMOSの電源に近い側))をOFFにしたOpenDrainモードにします。
過大電流防止防止の必要性に関しては、別項で説明します。
他の5つのポートは、入力に設定します。
外部でプルアップ抵抗がなくても動作するように、入力端子はPullUpモードとします。
コンストラクタが呼ばれた時の初期化ルーチンで、上記のポートの初期設定と合わせて、2mS周期で起動するスキャン用のプログラムを呼び出す準備をします。
この2mS周期で呼び出されるscan()関数が、ライブラリ機能の重要な部分です。

scan関数の機能は、2mS毎に下記の様な動作をします。
1)出力ポート5本の一つをLow(0)にします(シンクN-ch FETをON)。
2)入力ポート5本の状態を入力し、今までの状態と最新状態を比較します。
3)状態は、合計4つの状態となります。
① OFF_state → OFF状態(キーが押されていない状態)
② OFF_to_ON_transient → キーが押され始めた状態
③ ON_state → ON状態(キーが押され続けている状態)
④ ON_to_OFF_transient  → キーが離され始めた状態
状態遷移は、①からは②のみ、②からは①か③へ、③からは④のみ、④からは③か①のみの遷移で、これ以外は遷移をさせません。
4)出力ポート5本の次の一つのみをLow(0)にし、順次状態変化を確認します。
全てのキーそれぞれに上記4つの状態を記憶し、2mS毎に状態を継続して観測し更新していきます。
5)チャタリング防止機能
②と④の状態を取り入れているのは、キー(スイッチ)のチャタリングによるキーの誤検出防止です。
誤検出で出やすいのは、同じキーを何度も押されたと判断することです。
操作者は、一度のキー操作と思ってもキーが複数回押されたと判断される可能性があります。
また逆に早い操作をして二度連続に押したときに一回の操作と判断されることもあります。
メカニカルな接点を持つキー(スイッチ)には、チャタリングが多かれ少なかれ必ず発生しますが、ハードウェアとして抵抗とキャパシタの時定数を利用して対策することも現実的な方法です。
しかしキーマトリックス方式では、ハードウェアチャタリング防止はデメリットが多く組み合わせが出来ません。
②と④は、安定した二つの状態(①OFFと③ON)の間で、時間的な変化を観測します。
例えば、①OFFから②に入ると、②の中で最新の状態を観測し瞬間値がONであればカウンタを1カウントマイナスし、OFFであれば1カウントプラスをして上下限値に到達したかを判断します。
これで、②の状態でカウントが最小値に到達したら③に移行します。
②でカウンタが最大値となれば充分な時間押されていないと判断し①に戻ります。
6) ②の状態から③に最初に変化した場合に、キーが押されたと判断し、キーバッファにFIFO形式で蓄えられます。
このキーバッファをユーザープログラムから読むことにより、キーデータを取得します。
7) この②から③への状態変化以外は、内部情報としては重要ですがユーザー側には一切公開していません。

5.ダイオードの有無による違い

キーが常に一つしか押されない場合には、ダイオードの有無は関係ありません。
キーが同時に二つ以上押されて、それが5つのポートの二つ以上に跨ると、ダイオードの有無で動作に差が出ます。
1)過大電流防止
出力ポートは、一つだけLow(0=ソースFETをON)にしますので、他の4つはHi(1)を保つ事になります。 CPUの出力ポートがCMOSでシンクとソースの両方ができるDigitalOutのポート設定では、HiのポートとLoとなっているポートが、キーを回路として接続されてしまう状態が発生します。
この状態で、HiポートからLoポートへの電流経路で過大電流が流れる可能性が発生します。
このライブラリでは、HiポートがOpenDrainモードになっているため、プルアップ抵抗を流れる電流が最大電流に制限されます。
2)Nキーロールオーバー
先ずは、下記を参照願います。
https://minekoa.hatenadiary.org/entry/20121215/1355603940
ダイオードがあれば、Nキーロールオーバー(極端な話、25個すべての状態は判別可能)が機能するが、ダイオードなしでは2キーロールオーバーに限定されます。
このライブラリでは、殆ど同時にキーが押されると厳密に言えば正確なキー操作の順序は捉えられません。
しかし、多少の時間的順序の入れ違いがあっても、キー操作の有無は判断出来ます。
ダイオード無しで3キー以上の同時操作は誤動作することは明白で、仕様(ソフトでは対応不可)と言うしかありません。
尚、サンプルプログラム内にkey_complex.cppが入っていますが、これを動作させるにはダイオード装着が必要です。
通常の使い方では、各キーはOFFをアイドル状態として使用しますが、このサンプルではキーマトリックス内にON/OFFのどちらでも定常状態に出来るスイッチを組み入れることが出来ます。
スイッチのON/OFF状態は、read_state()で読み出します。

6.CPU占有率

2mS毎にscan()関数が呼ばれるので、CPUを下記のように占有します。

Mbed CPU TypeExecution TimeCPU occupancy
Nucleo-F446RE10uS0.5%
Nucleo-L152RE50uS2.5%
FRDM-K64F28uS1.4%

占有率を下げるのは、起動周期2mSを伸ばすか、キーの数を少なくすることが有効です。


Please log in to post comments.