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