M5StickCでM5Stack用各種ユニットを使う

先日、M5StickCの環境構築、動作確認を行い(記事は こちら)、Groveポートに「M5Stack用GPSユニット」をつないで動作確認しました(記事は こちら)。

今回は、M5StickCのGroveポートに、私が持っているその他の「M5Stack用ユニット」をつないで、それぞれ動作確認します。

ちなみに、M5StackのGroveポートはI2C専用ですが、M5StickCのGroveポートは、M5Stack社のページ に、「Interface: 1x I2C/ Uart/ I/O (Grove compatible)」と書いてあり、I2Cだけでなく、どのタイプのセンサでも使えます。

M5Stack用環境センサユニット

「M5Stack用環境センサユニット」はI2Cタイプで、温度・湿度・気圧の測定が可能です。DHT12で温度と湿度を、BMP280で気圧を測定します。

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

#include <M5StickC.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();
  Wire.begin(32, 33, 100000);
  M5.Lcd.setRotation(3);

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

  if (!bme.begin(0x76)){
    Serial.println("Could not find a valid BMP280 sensor, check wiring!");
    while (1);
  }
  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, 15, 2);
  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);
}

M5StickCのディスプレイに、温度・湿度・気圧が表示されます。

M5Stack用土壌水分センサユニット

「M5Stack用土壌水分センサユニット」はGPIOタイプで、土壌中に含まれる水分量を測定できます。2本の突き出たパッドを土の中に差し込んで利用します。


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

#include <M5StickC.h>

void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);
  M5.Lcd.setTextColor(YELLOW);
  M5.Lcd.setCursor(25, 2);
  M5.Lcd.printf("UNIT_EARTH EXAMPLE\n");
  pinMode(32, INPUT);
  M5.Lcd.setCursor(10, 30);
  M5.Lcd.print("GPIO33:");
  M5.Lcd.setCursor(10, 50);
  M5.Lcd.print("GPIO32:");
}

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

M5StickCのディスプレイに、アナログ値とデジタル値が表示されます。水分がないとき、アナログ値は4095、デジタル値は1になっていますが、パッドを水につけるとアナログ値は小さくなり、デジタル値は0になります。

M5Stack用PIRセンサユニット

「M5Stack用PIRセンサユニット」はGPIOタイプで、特定の範囲内での物体の動きを検知することが可能です。パッシブ型赤外線センサなので、センサ自体はエネルギーを放射せず、検知対象物から放出、反射される赤外線を検出します。


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

#include <M5StickC.h>

void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);
  M5.Lcd.setTextColor(YELLOW);
  M5.Lcd.setCursor(30, 0);
  M5.Lcd.println("PIR example");
  Serial.println("PIR example: ");
  M5.Lcd.setCursor(65, 10);
  M5.Lcd.setTextColor(WHITE);
  pinMode(33, INPUT);
}

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

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

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

M5StickCのディスプレイに、検知結果が表示されます。物体を検知していない時は0になっていますが、センサの前に手をかざすと1に変わります。

M5Stack用ADCユニット

「M5Stack用ADCユニット」はI2Cタイプで、0〜12Vの電圧入力を、16bitの分解能でAD変換します。

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

#include <M5StickC.h>
#include <Wire.h>
#include "ADS1100.h"

ADS1100 ads;

void setup(void) {
  M5.begin(true, false, false);
  Serial.begin(115200);

  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextColor(ORANGE);

  ads.getAddr_ADS1100(ADS1100_DEFAULT_ADDRESS); // 0x48, 1001 000 (ADDR = GND)
  ads.setGain(GAIN_ONE); // 1x gain(default)
  ads.setMode(MODE_CONTIN); // Continuous conversion mode (default)
  ads.setRate(RATE_8); // 8SPS (default)
  ads.setOSMode(OSMODE_SINGLE); // Set to start a single-conversion
  ads.begin();
}

void loop(void) {
  byte error;
  int8_t address;

  address = ads.ads_i2cAddress;
  Wire.beginTransmission(address);
  error = Wire.endTransmission();
  if (error == 0) {
    int16_t result;
    Serial.println("Getting Differential Reading from ADS1100");
    Serial.println(" ");
    result = ads.Measure_Differential();
    Serial.print("Digital Value of Analog Input between Channel 0 and 1: ");
    Serial.println(result);
    M5.Lcd.fillScreen(BLACK);
    char data[20] = { 0 };
    sprintf(data, "%d", result);
    M5.Lcd.drawCentreString(data, 40, 80, 4);
    Serial.println(" ");
    Serial.println(" *************************** ");
    Serial.println(" ");
  } else {
    Serial.println("ADS1100 Disconnected!");
    Serial.println(" ");
    Serial.println(" ************ ");
    Serial.println(" ");
  }
  delay(1000);
}

光センサを使って、明るいほど高い電圧を出力する簡単な回路をつくり、これを「M5Stack用ADCユニット」につなぎます。
M5StickCのディスプレイに数値が表示されます。明るいほど大きな値に、暗いほど小さな値になります。

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


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


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

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