先日、M5Stackで使用できるデジタル入力端子の本数について調査しました(記事は こちら)。
プルアップ抵抗などを使わなくても、7つの端子がデジタル入力として使えることを確認できました。
つまり、これらの端子に外付けスイッチをつなぐと、7つのスイッチのON/OFFを、M5Stackで認識できることになります。
今回は、外付けスイッチをマトリックス状にならべてM5Stackにつなぐことで、より多くのスイッチのON/OFFを、M5Stackで認識させたいと思います。
具体的には、4 x 3のマトリックス状にならべた計12個の外付けスイッチのON/OFFを、7本の信号でつながったM5Stackで認識させます。
回路図は以下のようになります。12個のスイッチが4 x 3のマトリックス状にならび、C0〜C3、R0〜R2 の計7本の信号でM5Stackにつながっています。
実際につないだ状態は以下のとおりです。
スケッチは以下のようになります。
#include <M5Stack.h> #define C0 16 #define C1 17 #define C2 2 #define C3 5 #define R0 26 #define R1 22 #define R2 21 void setup() { M5.begin(); M5.Lcd.setTextSize(3); pinMode(C0, OUTPUT); pinMode(C1, OUTPUT); pinMode(C2, OUTPUT); pinMode(C3, OUTPUT); pinMode(R0, INPUT_PULLUP); pinMode(R1, INPUT_PULLUP); pinMode(R2, INPUT_PULLUP); } void loop() { M5.Lcd.clear(BLACK); digitalWrite(C0, LOW); digitalWrite(C1, HIGH); digitalWrite(C2, HIGH); digitalWrite(C3, HIGH); M5.Lcd.setCursor(0, 0); M5.Lcd.print(digitalRead(R0)); M5.Lcd.setCursor(0, 30); M5.Lcd.print(digitalRead(R1)); M5.Lcd.setCursor(0, 60); M5.Lcd.print(digitalRead(R2)); digitalWrite(C0, HIGH); digitalWrite(C1, LOW); digitalWrite(C2, HIGH); digitalWrite(C3, HIGH); M5.Lcd.setCursor(80, 0); M5.Lcd.print(digitalRead(R0)); M5.Lcd.setCursor(80, 30); M5.Lcd.print(digitalRead(R1)); M5.Lcd.setCursor(80, 60); M5.Lcd.print(digitalRead(R2)); digitalWrite(C0, HIGH); digitalWrite(C1, HIGH); digitalWrite(C2, LOW); digitalWrite(C3, HIGH); M5.Lcd.setCursor(160, 0); M5.Lcd.print(digitalRead(R0)); M5.Lcd.setCursor(160, 30); M5.Lcd.print(digitalRead(R1)); M5.Lcd.setCursor(160, 60); M5.Lcd.print(digitalRead(R2)); digitalWrite(C0, HIGH); digitalWrite(C1, HIGH); digitalWrite(C2, HIGH); digitalWrite(C3, LOW); M5.Lcd.setCursor(240, 0); M5.Lcd.print(digitalRead(R0)); M5.Lcd.setCursor(240, 30); M5.Lcd.print(digitalRead(R1)); M5.Lcd.setCursor(240, 60); M5.Lcd.print(digitalRead(R2)); delay(100); }
C0〜C3 は OUTPUT 信号です。C0〜C3 を順番に LOW にし(その他は HIGH)、その時の R0〜R2 の値を読み取ります。
もしも C1 を LOW にした時、R1 の値が LOW であれば、スイッチ C1R1 が押されていることがわかります。R0〜R2 は INPUT_PULLUP なので、どのボタンも押されていない時は HIGH となります。
動作確認したところ、各スイッチのON/OFFを問題なく認識できました。
ただし、複数のスイッチを同時に押すのはNGです。
具体的には、例えば C1R1 と C2R1 を同時に押してしまうと、R1 の信号が衝突してしまい、ON/OFFの判定ができません。
なお、この問題が生じるのは、同一行のスイッチを同時に押した時だけで、異なる行のスイッチであれば、同時に押しても判定できます。