こちらが商品です。私は考えを理解しています。これらの16個のボタンは4x4マトリックスを使用しています。行は4行、列は4行、ケーブルは8本です。
だが:
これはマルチプレクサなしでどのように機能しますか?
これは複数のボタンの正確な押下を検出できますか?ボタンが同じ行または同じ列を使用していても?例:(2,2)(2,3)、(3,2)、および(3,3)の位置にあるボタンが同時に押された場合。
それはどのように機能しますか?
こちらが商品です。私は考えを理解しています。これらの16個のボタンは4x4マトリックスを使用しています。行は4行、列は4行、ケーブルは8本です。
だが:
これはマルチプレクサなしでどのように機能しますか?
これは複数のボタンの正確な押下を検出できますか?ボタンが同じ行または同じ列を使用していても?例:(2,2)(2,3)、(3,2)、および(3,3)の位置にあるボタンが同時に押された場合。
それはどのように機能しますか?
回答:
これはマルチプレクサなしでどのように機能しますか?
そうではありません。キーパッドボードにはスイッチしかないようですが、おそらく見えないダイオードがいくつかあります。ただし、左側のボードはプロセッサが搭載されているように見えます。ほとんど間違いなく、多重化はファームウェアで行われています。
多重化アルゴリズムは次のように機能します。
上記のプロセスは十分に速く繰り返されるので、すべてのボタンは、人間の観察者にとって瞬時に感じる時間内にチェックされます。この文脈での「瞬時」の人間の限界は約50ミリ秒です。ローエンドのマイクロコントローラーでさえ、4x4キーパッドをそれよりはるかに短い時間でスキャンできます。
これは複数のボタンの正確な押下を検出できますか?
多分そう。1つの方法は、各ボタンと直列にダイオードを配置することです。それらは、表示するボードの裏側にある可能性があります。ダイオードを使用すると、上記のアルゴリズムが機能します。
別の方法は、抵抗をラインと直列に配置し、それらのアナログ電圧を測定することです。複数のボタンが複数の行/列の行を一緒に短絡している場合でも、どのボタンが押されているかを最終的に把握できます。これには、ダイオードを使用する場合のようなデジタル入力だけでなく、マイクロ内のA / D入力が必要です。
ダイオードなし...幻の長方形を取得します。
たとえば、例では(2,2)(2,3)、(3,2)、および(3,3); 長方形を選んで皮肉な例を選びました。あなたがいる場合、実際にすべての4つのキーを押し、それが動作します。ただし、長方形の3つのコーナーを押すと、4番目のコーナーも押されていないように見えますが、押されていないように見えます。
そのキーパッドは、キーボードのデータ入力用であることは明らかです。ユーザーの規則は、一度に1つのキーを押すことです。たとえば、ガソリンスタンドのクレジットカード入力キーパッドに「シフト」キーがないことに気付きました。
ただし、S1をシフトキーに、S3をAlt-Shiftキーにして、ユーザーが両方を適切に押しながらS13を押すと、S15も押されたように見えます。
私はこれをベア言語のAtmel AVRマイクロコントローラーのアセンブリ言語で行いました。
簡単にするために:キーパッド行:Arduinoピン4、5、6および7(AVRピンPD4、PD5、PD6およびPD7)を使用しますキーパッド列:Arduinoピン8、9、10および11(AVRピンPB0、PB1、PB2およびPB3を使用します)プルアップを有効にして行ピン入力を作成します。列ピンを出力にし、それらにゼロを出力します。すべての行および列ピンでピン変更割り込みを有効にします。 http://playground.arduino.cc/Main/PinChangeInterrupt
キーパッドのボタンを押すと、ロウピンがローになります。割り込みルーチンは、行ピンを読み取り、どのピンがローであるかを見つける必要があります。上位4ビットは3つの1と1つの0でなければなりません。uint8_t 8ビット変数を使用する場合、16または(var >> 4)で除算して、4ビットを数値の下位ビットに配置できます。ビットごとのORを使用できます。240を使用した操作で上位4ビットを1に設定し、ビット単位のNOT〜操作ですべてのビットを反転して、ボタンを押した行を表すビットセットを1つだけにします。この番号を0、1、2、または3として
保存します。ピン構成を切り替えます。
プルアップを有効にして列ピン入力を作成します。行ピンを出力にし、ゼロを出力します。列ピンを読み取り、どのピンがローであるかを見つけます。数値を右にシフトする必要がないことを除いて、この値を使用して同様の操作を行います。var ^ 240および^ varの後には、キーを押した列を表す1ビットがあります。不要な割り込みがトリガーされる可能性があるため、ポートを再構成する前に割り込みを無効にすることを忘れないでください。重複割り込み処理を防ぐために、割り込みルーチンを終了するときに割り込みフラグをクリアする必要がある場合があります。