M5Stackでできること 〜M5Stackで各種センサユニットを使う

スポンサーリンク
センサとの接続

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

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

今回は、手持ちのM5Stack用センサユニットを、これらのGROVEポートにつないで、動作確認していきます。

M5Stack Basic V2.7(Yahoo!ショッピング)

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用環境センサユニット

M5Stack用環境センサユニット(ENV III)(Yahoo!ショッピング)

このセンサユニットは、「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だけで扱うことができそうです。

追記

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

M5Stack Basic V2.7(Yahoo!ショッピング)

 

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


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