学生さんと一緒に仕事(プレゼミや卒業研究の開発)していると、自分だけではやらないことに携わるキッカケがよくあります。それがまた勉強になって次のアイデアの源泉になることもあります。
今年も情報学プロジェクトという通年授業でゲームコントローラ&ゲーム開発を進めていまして、2人4チームで進めているのですが、そのうちの1チームが電話機をコントローラにしたいと言い出し、どこからか持ってきた既存の電話機を分解してコントローラにしようと四苦八苦していました。
私はとりあえず回路を解析するのは大変だからタクトスイッチを埋め込んでスイッチを3Dプリンタで作ったら?とこれまでアドバイスしてきたのですが、それでも何とか頑張ろうとする姿に引きずられて一緒に調べてみました。
マトリクススイッチはこれまでも見たことはあるし回路もトラ技とかで見かけたことはあるにはあったのですが、いかんせん興味がなくてスルーしていました。なんか複雑そうな回路だな。。。と。
まず、基本を理解しなければなりません。いくつかわかりやすい記事がありました。以下がその1つです。ありがとうございます。なぜダイオードがついているのか理解できました。
スキャンするってそういうことなんですね。。。複数個のボタンをつないで、それぞれのボタンのもう一方の端子を読み取ると、どのボタンが押されているかわかります。複数個のボタンをつなぐ回路を複数にわけて順に活性化(HIGHまたはLOW)にすることで、IOを減らすことができるっていうことです。言葉で説明しても何ともわかりにくいですね。
学生さんが持ち込んだ電話機にはボタンが22個ついていました。ボタン直下にある基盤には11本の端子がありました。マトリクス方式ではボタンの数の半分のIOで済むようになるという利点があると書かれています。活性化用の端子と読み出し用の端子が必要なのでそれぞれ5本ずつくらいになるということかと思います。
ちなみにパターンは以下の通りです。なかなか複雑ですが1つ1つのスイッチに着目すればどの端子に結線されているか読み取ることはできます。
あとはどうやってArduinoでこのスイッチの押下状態を読み取るか?になります。一応これでも電気工学科出身なんですが。。。実践となるとやったことのある回路しか考えられません。お恥ずかしい。
絵にすると以下。Arduino(Nano)でD3をLOWにしておきます。要はGNDです。その上でD2をINPUTではなくINPUT_PULLUPにしておきます。タクトスイッチの実装でよく出てくる説明ですが、INPUTにするとスイッチを押す前はD2に何も繋がっていないため(開放)電圧は不定になります。なので、スイッチが押す前に5Vに引き上げるためプルアップ抵抗を入れておきます。これをArduinoではINPUT_PULLUPと書くだけで内部的な回路でやってくれるようです。スイッチを押す前はD2は5V(HIGH)の状態になりまして、スイッチを押すとD3(GND)と直結されるためD2もLOWとなります、ということです。これで検知できるはずですね。
実験用コードは以下の通りです。
void setup() { pinMode(3, OUTPUT); pinMode(2, INPUT_PULLUP); Serial.begin(115200); digitalWrite(3, LOW); } void loop() { Serial.println(digitalRead(2)); delay(500); }
1週間もするとすぐに忘れてしまうので動画を撮影しました。学生さんに伝えるためでもありますが。また使いそうなテクなので個人的にも再学習することなく思い出しやすくしておきたいので。はい。
<動画は撮影したのですが学籍番号とか映り込んでいたので。。。公開は止めました、すんません>
それにしても、上記で発見したGEEKYFabさん、めっちゃ面白そうな活動をされています。これからもフォローさせていただこうと思います。
でわでわ。