先日、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シリーズの記事にも興味のある方は「さとやまノート」をご覧ください。