sea side she side

写真と山、資格が好きなアラフォーエンジニアのブログ

キーマトリクス

      2016/04/13

# 2013/01/27 追記・修正

音点字のプリント基板を作るにあたって点字は2字分の12個にしようと決めたわけですが、そうなると点字の検知用スイッチの数も12個に。そうなるとピンの数が足りません…。

ってことでキーボードやテンキーにも使われているキーマトリクスを利用します。

8x8ドットマトリクスLEDの仕組みと同じで、格子状の配線パターンを順にスキャンしていく方式です。これを用いることにより必要だったピン数が12から3x4の7本にまで減らすことができます。

キーマトリクスの仕組みはT-Saitoh@福井高専さんを参考にさせていただきました。

まずは回路図。
20120127_03

縦のラインを出力、横のラインを入力として設定します。ダイオードが入っているのは同時押し対応のためです。ダイオードが入っていないとキーの回り込みが発生し、意図しないキーまで押下されたと判断してしまいます。

まずはSW1、SW2、SW3を読むためにDigital4をHigh、他はLowに落とします。これで、Digital8、Digital9、Digital10を順に読み込めば各SWの状態が判別できます。

20120127_04

次にDigital4をLOWに戻して、Digital5だけをHIGHにします。同様にDigital8、Digital9、Digital10を順に読み込めばSW4、SW5、SW6の状態が判別できます。

20120127_05

これをDigital6、Digital7と繰り返せばSW7、SW8、SW9とSW10、SW11、SW12と読み込みができます。

20120127_06

20120127_07

このテスト回路をブレッドボードで組みます。ジャンパ線だらけで見にくいですね…。

20130126_01.jpg

音点字の回路図ではこんな感じ。スイッチはリード線で配線するので、回路上は2Pコネクタになっています。

キーマトリクス

実際に上の仕組みのテストスケッチは下記の通り。今回はforなどでまとめることはせず、べた書きでそのまま分かるようにしてあります。またスイッチのチャタリング対策もしていません。

<br />
/*----------------------------------------------<br />
 * 関数: setup<br />
 * 概要:<br />
 * ---------------------------------------------*/<br />
void setup() {<br />
  pinMode( 4, OUTPUT);<br />
  pinMode( 5, OUTPUT);<br />
  pinMode( 6, OUTPUT);<br />
  pinMode( 7, OUTPUT);<br />
  pinMode( 8, INPUT);<br />
  pinMode( 9, INPUT);<br />
  pinMode(10, INPUT);</p>
<p>  digitalWrite( 4, LOW);<br />
  digitalWrite( 5, LOW);<br />
  digitalWrite( 6, LOW);<br />
  digitalWrite( 7, LOW);<br />
  digitalWrite( 8, LOW);<br />
  digitalWrite( 9, LOW);<br />
  digitalWrite(10, LOW);</p>
<p>  Serial.begin(9600);<br />
}</p>
<p>/*----------------------------------------------<br />
 * 関数: loop<br />
 * 概要:<br />
 * ---------------------------------------------*/<br />
void loop() {<br />
  digitalWrite( 7, LOW);<br />
  delay(10);<br />
  digitalWrite( 4, HIGH);<br />
  int sw1 = digitalRead( 8);<br />
  int sw2 = digitalRead( 9);<br />
  int sw3 = digitalRead(10);</p>
<p>  digitalWrite( 4, LOW);<br />
  delay(10);<br />
  digitalWrite( 5, HIGH);<br />
  int sw4 = digitalRead( 8);<br />
  int sw5 = digitalRead( 9);<br />
  int sw6 = digitalRead(10);</p>
<p>  digitalWrite( 5, LOW);<br />
  delay(10);<br />
  digitalWrite( 6, HIGH);<br />
  int sw7 = digitalRead( 8);<br />
  int sw8 = digitalRead( 9);<br />
  int sw9 = digitalRead(10);</p>
<p>  digitalWrite( 6, LOW);<br />
  delay(10);<br />
  digitalWrite( 7, HIGH);<br />
  int sw10 = digitalRead( 8);<br />
  int sw11 = digitalRead( 9);<br />
  int sw12 = digitalRead(10);</p>
<p>  Serial.print(sw1);<br />
  Serial.print(sw2);<br />
  Serial.print(sw3);<br />
  Serial.print(sw4);<br />
  Serial.print(sw5);<br />
  Serial.println(sw6);<br />
  Serial.print(sw7);<br />
  Serial.print(sw8);<br />
  Serial.print(sw9);<br />
  Serial.print(sw10);<br />
  Serial.print(sw11);<br />
  Serial.println(sw12);<br />
  Serial.println("");</p>
<p>  delay(100);<br />
}<br />

スイッチをぽちぽち押してみます。同時押しもやってみます。

<br />
000000<br />
000000</p>
<p>001000<br />
010000</p>
<p>000100<br />
000001</p>
<p>010101<br />
101010</p>
<p>111011<br />
100001<br />

それっぽく動いているようです。

 - Make , ,