完全自作キーボードへの道4:キーマトリックスでキーを増やす編

Arduino 2x2 Key matrix

 
 
前回、キーは一つですが一応はPC用のデバイスとしてのキーボードが作成できました。さすがにキー1つだけではキーボードを作ったと胸を張れないので、キーを増やしていきます。

オリジナルキーボードを作ってみる その6「プログラムを修正」 – ゆかりメモ
http://eucalyn.hatenadiary.jp/entry/original-keyboard-06

教科書は上記、いつものゆかり氏の記事です。
単純にキーを1つ増やして2キーにする分には全く問題ありませんでした。5Vからスタートする全く同じような回路が増えるだけです。終着点となるピンは分け、それぞれ3番ピン、4番ピンへと繋ぎます。プログラムでそれぞれがHIGHならKeyboard.pressを送信します。

これで何ら問題ないのですが、この方法だとキーの数だけピンが必要となり、Arduinoのピンが足りなくなります。そこで登場するのがキーマトリックスという方法だそうです。

 
 
 
オリジナルキーボードを作ってみる その7「キーマトリックス」
http://eucalyn.hatenadiary.jp/entry/original-keyboard-07

キーを行列状に配置し、それぞれの行、列にピンを繋ぎます。4個のキーの場合、2行2列で4個のピンが必要です。これだとピンの数とキーの数が同じなのであまり意味はありませんが、その考え方で増やしていくと、25個のキーであれば5行5列、ピンは10個で済みます。
Arduino Microだとピンが20個あるので、フルキーボードは難しそうですが、60%キーボードなら余裕ですね。

 
2x2 key matrix
仕組みとしては、上図のように回路を繋げます。わかりやすいよう、スーファミ風のボタン配置にしました。

 
2x2 key matrix: first reading
まずPin 3をHIGH, Pin 4をLOWとし、Pin 5, Pin 6を読み取ります。この時A, Bボタンには電気が来ていない(LOW)ので、X, Yボタンの状態がわかります。

 
2x2 key matrix: second reading
次に先程とは逆にPin 4のみHIGHとします。同様にPin 5, Pin 6を読み取りますが、今回はA, Bボタンの状態がわかるというわけです。
これを1ループの中で切り替えて行うことで、X, Y, A, B全てのボタンの状態が読み取れるというわけだそうです。賢い。

 
 
仕組みはよくわかりましたが、まだ問題があるそうです。ゆかり氏の記事の「回路の改良」というところを御覧ください。電気は線が繋がっていれば縦横無尽に流れるので、下記のような問題があるそうです。

 
2x2 key matrix: without diodes
Pin 4をHIGHにして、A, Bボタンの状態を読み取ろうとしています。この時もしB及びX, Yが両方押されていた場合、Pin 4からBボタンを経由した電気は、Pin 5へ向かうと同時にYボタンにも向かい、Yボタン、Xボタンを経由してPin 6へ到達してしまいます。
つまり、Aボタンが押されていないにも関わらず、Pin 6はHIGH、押されていると読み取られてしまうわけです。

 
2x2 key matrix: with diodes
そこで「ダイオード」という部品を取り付けます。上図で赤い矢印になっているのがダイオードで、それぞれのスイッチを出たところに追加します。
このダイオードは、電気を一方向にしか通さないそうです。つまり、上図赤い矢印の部分が一方通行になります。そうすると先程問題だったX, Yボタンを経由してPin 6へ到達してしまっていた電気が、Yボタンの手前のダイオードによってき止められます。これでAボタンが押されていないにも関わらず押下判定されてしまう問題は解決しました!

 
 
Diodes on Planck PCB
ちなみに、このダイオードというパーツはキーボードの基盤にはだいたい付いているみたいです。写真はPlanckの基盤ですが、D33、D34…とある部分がダイオードだと思われます(当て推量で確信はないですが)。これはMiniVanのPCBも同様で、スイッチをハンダ付けするだけのDIYキットに含まれるPCBの場合、スイッチ以外に必要なダイオードや抵抗が既に取り付けられています。
ですので、今度挑戦しようと思っている30 key keyboard “Gherkin”の場合は、何も付いていない生のPCBのため、ダイオードを自分で取り付ける必要があります。

 
 
というわけで、キーマトリックスの考え方とダイオードというパーツの意味がわかりました。あとは行数、列数を増やしていけば必要な数のキーが確保できるのですが、読み取りピンの手前にある抵抗からGNDへの線、これを省略してスッキリさせる方法があるそうです。次回はその辺の「プルダウン抵抗」「プルアップ抵抗」なるものをやってみます。

これまでの完全自作キーボードへの道はこちらです。
http://romly.com/archives/tag/build-my-own-keyboard

1件のコメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください