先日、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、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。