16本のボタンを8本のワイヤで接続するにはどうすればよいですか?


9

こちらが商品です。私は考えを理解しています。これらの16個のボタンは4x4マトリックスを使用しています。行は4行、列は4行、ケーブルは8本です。

ここに画像の説明を入力してください

だが:

  1. これはマルチプレクサなしでどのように機能しますか?

  2. これは複数のボタンの正確な押下を検出できますか?ボタンが同じ行または同じ列を使用していても?例:(2,2)(2,3)、(3,2)、および(3,3)の位置にあるボタンが同時に押された場合。

  3. それはどのように機能しますか?


7
これは、「キーパッドの多重化」などのGoogle検索で見つかる一般的な知識です。これを投稿する前に、まず試してみませんでしたか?
TonyM 2017年

3
@TonyMもちろん、私は多くの検索を行い、数日前に自宅に到着した74HC164マルチプレクサチップをいくつか注文しました。これを見つけたとき、私はすべてをこのマルチプレクサチップで配線しようとしていました。次に、「マルチプレクサなしでこれがどのように機能するのか」と思っていました。
Basj

1
左側のデバイスには、内部に多重化のコードが必要です
Marcelo Espinoza Vargas

3
@TonyMこれを指摘してくれてありがとう。謎を解く代わりにPDFをリンクできますか;)?キーパッドなど以外のキーワードで検索したのかもしれませんが、おそらく見つかりませんでした。
Basj

1
@Basj:複数のプレス機を持っていることは問題ではありません。4行すべてを次々にスキャンします。1行目でボタンが押されているのが見つかった場合は、そのことに注意してください。3行目については、そこで別のボタンが押されていることに気づきます。最後に、両方のボタンを取得します。他の人がボタンを押すよりも大幅に速くスキャンできれば、見逃すことはありません。
ガーボル

回答:


24
これはマルチプレクサなしでどのように機能しますか?

そうではありません。キーパッドボードにはスイッチしかないようですが、おそらく見えないダイオードがいくつかあります。ただし、左側のボードはプロセッサが搭載されているように見えます。ほとんど間違いなく、多重化はファームウェアで行われています。

多重化アルゴリズムは次のように機能します。

  1. 1つの行を高く、他の行を低くします。

  2. 列ラインでパッシブプルダウンを有効にします。

  3. どの列線が高いかを確認します。それらの列行と1つのアサートされた行行との交点にあるボタンが押されます。その行の他のボタンが解放されます。

  4. 手順1に戻り、次の行を順番にアサートします。

上記のプロセスは十分に速く繰り返されるので、すべてのボタンは、人間の観察者にとって瞬時に感じる時間内にチェックされます。この文脈での「瞬時」の人間の限界は約50ミリ秒です。ローエンドのマイクロコントローラーでさえ、4x4キーパッドをそれよりはるかに短い時間でスキャンできます。

これは複数のボタンの正確な押下を検出できますか?

多分そう。1つの方法は、各ボタンと直列にダイオードを配置することです。それらは、表示するボードの裏側にある可能性があります。ダイオードを使用すると、上記のアルゴリズムが機能します。

別の方法は、抵抗をラインと直列に配置し、それらのアナログ電圧を測定することです。複数のボタンが複数の行/列の行を一緒に短絡している場合でも、どのボタンが押されているかを最終的に把握できます。これには、ダイオードを使用する場合のようなデジタル入力だけでなく、マイクロ内のA / D入力が必要です。


1
ありがとう。それでは、同時に複数のプレスはどうですか?注:左側のボードはRaspberryPiです。
Basj

1
@ヘイマンはなぜそうなのですか?例を挙げていただけますか?ダイオードがないときに、(1,2)、(2,2)、および(3,3)が同時に押されると問題になるのはなぜですか?多分あなたは小さな回路図を持っていますか?この点は非常に重要なので、@ Hayman専用の回答に値するでしょうか?
Basj

8
「左側のボードにはプロセッサが搭載されているように見えます」の+1。とても気に入りました。
Enric Blanco

3
@Basjそれをいじってみれば明らかです。ボタンを押すたびに、行を列に接続します。行と列が接続されているときはいつでも、交差点のキーは押されたものとして登録されます。ただし、3つ以上のキーを押すと、行と列を間接的に接続できます。
ホッブズ2017年

2
@Basj この写真を見てください。赤い線はロジックハイレベルを示します。「x」で示された3つのボタンを押したままにすると、それらをトレースして、信号が流れる経路を確認できます。最初に行1が選択され、高に設定されています。ボタン1,1を押すと、最初の列が高になります。ボタン1,2を押すことにより、行2を高くしました。次に、行2の他のボタンを押すと、別の列が高くなります。これの問題は、μCがおかしい、行1が高く設定されていること、列3が高くなっていることがわかっているため、ボタン1,3が高いと考えられる
Doodle

9

ダイオードなし...幻の長方形を取得します。

たとえば、例では(2,2)(2,3)、(3,2)、および(3,3); 長方形を選んで皮肉な例を選びました。あなたがいる場合、実際にすべての4つのキーを押し、それが動作します。ただし、長方形の3つのコーナーを押すと、4番目のコーナーも押されていないように見えますが、押されていないように見えます。

そのキーパッドは、キーボードのデータ入力用であることは明らかです。ユーザーの規則は、一度に1つのキーを押すことです。たとえば、ガソリンスタンドのクレジットカード入力キーパッドに「シフト」キーがないことに気付きました。

ただし、S1をシフトキーに、S3をAlt-Shiftキーにして、ユーザーが両方を適切に押しながらS13を押すと、S15も押されたように見えます。


1
実際、ほとんどのデータ入力キーボードは、一度に2つ以上のキーを押すことを想定していないため、問題はありません。ミュージカルキーボードは別の話です。一度に多くのキーを押すことができるからです。それらのほとんどには、ダイオードまたは各キーへの独立した配線があります。しかし、中古のショップ(価格は9ユーロ)で、一度に押す複数のキーに適切に対応していない音楽用キーボードが1つ見つかりました。その結果、予測不能で迷惑な結果が発生しました。
Level River St

キースイッチは、ダイオードが組み込まれているタイプの場合もあれば、その下にダイオードが隠れている場合もあります。
rackandboneman 2017年

1

連続スキャンなしでそれを行う方法は次のとおりです。

  • すべてのドライバーを高に設定する
  • 受信回線でパッシブプルダウンを有効にする
  • ラインの1つがハイになる(またはレベルが変化する)ことを検出するためにピン変更割り込みを設定する
  • これが発生したら、キーパッドスキャンを有効にします。
  • 通常どおりスキャンし、キーの押下を処理する
  • イベントのないタイムアウトの後、スキャンを停止し、最初の箇条書きで再起動します

0

私はこれをベア言語の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ビットがあります。不要な割り込みがトリガーされる可能性があるため、ポートを再構成する前に割り込みを無効にすることを忘れないでください。重複割り込み処理を防ぐために、割り込みルーチンを終了するときに割り込みフラグをクリアする必要がある場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.