M5Stack PLUSエンコーダモジュールでGroveポートを拡張する

M5Stackにいろいろなセンサをつないでみたいと思い、M5Stack用のセンサユニットをいくつか購入しました。

M5Stack用のユニットなので、当然M5Stackにはつながるものと、あまり深く考えずに購入したのですが、早速つないでみようと思ったところ、それぞれのセンサにはGroveポートのタイプがあることに気づきました。

具体的には、「PORT.A I2C」、「PORT.B I/O」、「PORT.C UART」の3種類があります。

それに対し、私の持っているM5Stack Basic本体には「PORT.A I2C」のポートしかありません。つまり、M5Stack Basicには、「PORT.A」タイプのセンサユニットしかつなぐことができません。「PORT.A」タイプ以外のセンサユニットをつなぎたければ、M5Stack Fireなど、より高価格なM5Stackを用意しなければなりません。
私は特に、アナログ信号を出力するセンサをGroveポートにつなぎたいと思っていたので、これはとても残念です。

何か対策はないかと調べていたところ、「M5Stack PLUSエンコーダモジュール」というものを見つけました。
いくつかの機能をもったM5Stack用の拡張モジュールなのですが、これには「PORT.B」、「PORT.C」のGroveポートがついています。M5Stack本体にスタックすることで、M5Stack Basicでも、これらのポートを使えるようになります。
今回の目的には、うってつけのモジュールです。

そんな訳で、早速「M5Stack PLUSエンコーダモジュール」を購入し、試してみることにしました。

このようなモジュールです。

これをM5Stackにスタックすることで、各タイプのGroveポートが使えるようになります。

このように3つのGroveポートがあります。

ところで、私が購入した「M5Stack PLUSエンコーダモジュール」は、以下のように、上側のポートに「UART」、下側のポートに「GPIO」と印字されていますが、これは逆で、実際は上側の黒いポートが「PORT.B I/O」、下側の青いポートが「PORT.C UART」です。

最初、何も気にせず、印字のとおりにセンサユニットをつないでしまったため、正常動作せず、しばらくなやんでしまいました。

なお、現在のM5STACK社のホームページに掲載されている写真を見ると、印字は修正されています。

さて、動作確認のため、「M5Stack用土壌水分センサユニット」をつないでみます。
このセンサは「PORT.B I/O」のタイプで、ふたつの端子でデジタル値とアナログ値を出力します。


Arduino IDEで、「ファイル」>「スケッチ例」>「M5Stack」>「Unit」>「Earth」を開きます。

#include <M5Stack.h>

void setup() {
  M5.begin();
  M5.Power.begin();
  //disable the speak noise
  dacWrite(25, 0);

  M5.Lcd.setTextColor(YELLOW);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(65, 50);
  M5.Lcd.printf("UNIT_EARTH EXAMPLE\n");
  pinMode(26, INPUT);
  M5.Lcd.setCursor(85, 80);
  M5.Lcd.print("GPIO36:");
  M5.Lcd.setCursor(85, 100);
  M5.Lcd.print("GPIO26:");
}

uint16_t analogRead_value = 0;
uint16_t digitalRead_value = 0;
void loop() {
  // put your main code here, to run repeatedly:
  M5.Lcd.setCursor(175, 80);
  M5.Lcd.setTextColor(BLACK);
  M5.Lcd.printf("%d\n", analogRead_value);
  M5.Lcd.setCursor(175, 100);
  M5.Lcd.printf("%d\n", digitalRead_value);
  analogRead_value = analogRead(36);
  digitalRead_value = digitalRead(26);
  M5.Lcd.setTextColor(YELLOW);
  M5.Lcd.setCursor(175, 80);
  M5.Lcd.printf("%d\n", analogRead_value);
  M5.Lcd.setCursor(175, 100);
  M5.Lcd.printf("%d\n", digitalRead_value);
  delay(10);
}

このスケッチでは、「PORT.B」の信号を読み取り、そのままLCDに表示します。
「土壌水分センサユニット」は、ふたつの端子でデジタル値とアナログ値を出力するので、その両者の値を表示します。

結果は以下のとおりです。センサを水につけていない時は、アナログ値が4095、デジタル値が1になっていますが、水につけるとアナログ値が2000程度、デジタル値が0になります。

なお、デジタル値の1、0を判定するためのしきい値は、センサ本体についている可変抵抗で調整できますが、その調整はなかなか微妙でした。
デジタル値の利用は、あまり現実的ではないかもしれません。

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


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


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

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