先日、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の判定ができません。
なお、この問題が生じるのは、同一行のスイッチを同時に押した時だけで、異なる行のスイッチであれば、同時に押しても判定できます。