M5Stack PLUSエンコーダモジュールを使って各種センサユニットをM5Stackにつなぐ


先日、M5Stack Basicに「M5Stack PLUSエンコーダモジュール」を取り付けました(記事は こちら)。

これにより、センサユニットのGroveポートのタイプが「PORT.A I2C」、「PORT.B I/O」、「PORT.C UART」のいずれであっても、M5Stack Basicで扱えるようになりました。

先日の記事では、「M5Stack用土壌水分センサユニット」が、M5Stack Basicで問題なく扱えることを確認しました。
今回は、その他の手持ちのセンサユニットについても、動作確認していきます。

M5Stack用環境センサユニット


このセンサユニットは、「PORT.A I2C」タイプなので、「M5Stack PLUSエンコーダモジュール」を使わなくても、元々M5Stack BasicについているGroveポート(PORT.A)で使うことができます。

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

#include <M5Stack.h>
#include "DHT12.h"
#include <Wire.h> //The DHT12 uses I2C comunication.
#include "Adafruit_Sensor.h"
#include <Adafruit_BMP280.h>

DHT12 dht12; //Preset scale CELSIUS and ID 0x5c.
Adafruit_BMP280 bme;

void setup() {
  M5.begin();
  M5.Power.begin();
  Wire.begin();

  M5.Lcd.setBrightness(10);

  Serial.println(F("ENV Unit(DHT12 and BMP280) test..."));

  while (!bme.begin(0x76)){
    Serial.println("Could not find a valid BMP280 sensor, check wiring!");
    M5.Lcd.println("Could not find a valid BMP280 sensor, check wiring!");
  }
  M5.Lcd.clear(BLACK);
  M5.Lcd.println("ENV Unit test...");
}

void loop() {
  float tmp = dht12.readTemperature();
  float hum = dht12.readHumidity();
  float pressure = bme.readPressure();
  Serial.printf("Temperatura: %2.2f*C Humedad: %0.2f%% Pressure: %0.2fPa\r\n", tmp, hum, pressure);

  M5.Lcd.setCursor(0, 0);
  M5.Lcd.setTextColor(WHITE, BLACK);
  M5.Lcd.setTextSize(3);
  M5.Lcd.printf("Temp: %2.1f \r\nHumi: %2.0f%% \r\nPressure:%2.0fPa\r\n", tmp, hum, pressure);

  delay(100);
}

以下のとおり、正常に動作することが確認できました。

M5Stack用PIRセンサユニット


このセンサユニットは、「PORT.B I/O」タイプなので、「M5Stack PLUSエンコーダモジュール」の「PORT.B」用Groveポートにつなぎます。

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

#include <M5Stack.h>

void setup() {
  M5.begin();
  M5.Power.begin();

  Serial.begin(115200);
  M5.Lcd.clear(BLACK);
  M5.Lcd.setTextColor(YELLOW);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(80, 0);
  M5.Lcd.println("PIR example");
  Serial.println("PIR example: ");
  M5.Lcd.setCursor(65, 10);
  M5.Lcd.setTextColor(WHITE);
  pinMode(36, INPUT);
}

void loop() {
  M5.Lcd.setCursor(0,25); M5.Lcd.print("Status: ");
  M5.Lcd.setCursor(0,45); M5.Lcd.print("Value: ");

  M5.Lcd.fillRect(95,25,200,25,BLACK);
  M5.Lcd.fillRect(95,45,200,25,BLACK);

  if(digitalRead(36)==1){
    M5.Lcd.setCursor(95, 25);M5.Lcd.print("Sensing");
    M5.Lcd.setCursor(95, 45);M5.Lcd.print("1");
    Serial.println("PIR Status: Sensing");
    Serial.println(" value: 1");
  }
  else{
    M5.Lcd.setCursor(95, 25);M5.Lcd.print("Not Sensed");
    M5.Lcd.setCursor(95, 45);M5.Lcd.print("0");
    Serial.println("PIR Status: Not Sensed");
    Serial.println(" value: 0");
  }
  delay(500);
  M5.update();
}

以下のとおり、正常に動作することが確認できました。

また、このセンサユニットを、元々M5Stack BasicについているGroveポート(PORT.A)につなぎかえ、スケッチの端子番号の箇所を「36」から「22」に書き換え、M5Stackに書き込みます。

#include <M5Stack.h>

void setup() {
  M5.begin();
  M5.Power.begin();

  Serial.begin(115200);
  M5.Lcd.clear(BLACK);
  M5.Lcd.setTextColor(YELLOW);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(80, 0);
  M5.Lcd.println("PIR example");
  Serial.println("PIR example: ");
  M5.Lcd.setCursor(65, 10);
  M5.Lcd.setTextColor(WHITE);
  pinMode(22, INPUT); // 変更
}

void loop() {
  M5.Lcd.setCursor(0,25); M5.Lcd.print("Status: ");
  M5.Lcd.setCursor(0,45); M5.Lcd.print("Value: ");

  M5.Lcd.fillRect(95,25,200,25,BLACK);
  M5.Lcd.fillRect(95,45,200,25,BLACK);

  if(digitalRead(22)==1){ // 変更
    M5.Lcd.setCursor(95, 25);M5.Lcd.print("Sensing");
    M5.Lcd.setCursor(95, 45);M5.Lcd.print("1");
    Serial.println("PIR Status: Sensing");
    Serial.println(" value: 1");
  }
  else{
    M5.Lcd.setCursor(95, 25);M5.Lcd.print("Not Sensed");
    M5.Lcd.setCursor(95, 45);M5.Lcd.print("0");
    Serial.println("PIR Status: Not Sensed");
    Serial.println(" value: 0");
  }
  delay(500);
  M5.update();
}

この場合でも、以下のとおり、正常に動作することが確認できました。

つまり、「M5Stack PLUSエンコーダモジュール」がなくても、デジタル信号を出力するセンサユニットであれば、M5Stack Basicで扱うことができます。

M5Stack用GPSユニット


このセンサユニットは、「PORT.C UART」タイプなので、「M5Stack PLUSエンコーダモジュール」の「PORT.C」用Groveポートにつなぎます。

Arduino IDEで、「ファイル」>「スケッチ例」>「M5Stack」>「Unit」>「GPS」>「GPSRaw」を開き、M5Stackに書き込みます。

#include <M5Stack.h>

HardwareSerial GPSRaw(2);

void setup() {
  M5.begin();
  M5.Power.begin();
  GPSRaw.begin(9600);

  Serial.println("hello");
  termInit();
  M5.Lcd.setTextFont(4);
  M5.Lcd.setCursor(50, 100, 4);
  M5.Lcd.println(("GPS Raw Example"));
}

void loop() {
  // put your main code here, to run repeatedly:
  if(Serial.available()) {
    int ch = Serial.read();
    GPSRaw.write(ch);
  }

  if(GPSRaw.available()) {
    int ch = GPSRaw.read();
    Serial.write(ch);
    termPutchar(ch);
  }
}

以下のとおり、正常に動作することが確認できました。

また、このセンサユニットを、元々M5Stack BasicについているGroveポート(PORT.A)につなぎかえ、スケッチの「GPSRaw.begin(9600);」の箇所を「GPSRaw.begin(9600, SERIAL_8N1, 22, 21);」と書き換え、M5Stackに書き込みます。

#include <M5Stack.h>

HardwareSerial GPSRaw(2);

void setup() {
  M5.begin();
  M5.Power.begin();
  GPSRaw.begin(9600, SERIAL_8N1, 22, 21); // 変更

  Serial.println("hello");
  termInit();
  M5.Lcd.setTextFont(4);
  M5.Lcd.setCursor(50, 100, 4);
  M5.Lcd.println(("GPS Raw Example"));
}

void loop() {
  // put your main code here, to run repeatedly:
  if(Serial.available()) {
    int ch = Serial.read();
    GPSRaw.write(ch);
  }

  if(GPSRaw.available()) {
    int ch = GPSRaw.read();
    Serial.write(ch);
    termPutchar(ch);
  }
}

この場合でも、以下のとおり、正常に動作することが確認できました。

つまり、「M5Stack PLUSエンコーダモジュール」がなくても、「PORT.C」タイプのセンサユニットは、M5Stack Basicで扱うことができます。

ちなみに、各Groveポートの端子は、以下のピンにアサインされています。

結局、アナログ信号を出力する「PORT.B I/O」タイプのセンサユニットについては、「M5Stack PLUSエンコーダモジュール」の使用が必須ですが、その他のセンサユニットについては、M5Stack Basicだけで扱うことができそうです。

 

2020/2/28追記

その後、少し調べていたところ、M5StackのI2Cは、M5Stack内部でも使われているようです(IP5306という電源制御用ICが使っています)。
よって、上記の記事では、「PORT.B」、「PORT.C」タイプのセンサユニットを、「PORT.A」につないで動作確認していますが、これはやってはいけないようです。

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


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


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

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