M5Stackでできること 〜多数の外付けスイッチをつかう

先日、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の判定ができません。

なお、この問題が生じるのは、同一行のスイッチを同時に押した時だけで、異なる行のスイッチであれば、同時に押しても判定できます。

なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。


このサイトで書いている、M5Stackシリーズ(M5Stack、M5StickCなど)に関するブログ記事を、「さとやまノート」という別のブログページに、あらためて整理してまとめました。

他のM5Stackシリーズの記事にも興味のある方は「さとやまノート」をご覧ください。