先日、M5StickCの環境構築、および動作確認を行い(記事は こちら)、Groveポートに「M5Stack用GPSユニット」をつないで動作確認しました(記事は こちら)。
M5StickC Plus(Yahoo!ショッピング)今回は、M5StickCのGroveポートに、私が持っているその他の「M5Stack用センサユニット」をつないで、それぞれ動作確認します。
ちなみに、M5StackのGroveポートはI2C専用ですが、M5StickCのGroveポートは、M5Stack社のページ に、「Interface: 1x I2C/ Uart/ I/O (Grove compatible)」と書いてあり、I2Cだけでなく、どのタイプのセンサでも使えます。
M5Stack用環境センサユニット
「M5Stack用環境センサユニット」はI2Cタイプで、温度・湿度・気圧の測定が可能です。DHT12で温度と湿度を、BMP280で気圧を測定します。
M5Stack用環境センサユニット(ENV III)(Yahoo!ショッピング)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の使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。