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