M5StackSensorモジュールとRP2040を接続する

最終更新日:2022/3/16

M5センサモジュールはGroveコネクタを有したケーシングされたセンサモジュールである意味扱いやすいです。
ただ、実際に使う場合、M5StackやM5Stickと、M5センサモジュールの接続においてはメーカの提供するDocumentページに情報があり、すぐに使う事が出来るかと思います。しかし、Arduino環境でボードをRP2040を選択するとM5センサモジュール用のライブラリはスケッチ例で『互換性無し』扱いになってしまいます。
折角扱いやすいセンサモジュールで価格的にも大変リーズナブルですので積極的に使ってゆきたいです。
ここではM5センサモジュールを入手次第、動作確認を行ってサンプルスケッチを登録してゆきたいと思います。


まずはENV-V(U001-C)です。気温。湿度をSHT-30(0x44)、気圧をQMP6988(0x70)で扱います。PiPico + Grove Shield for Pi Picoに接続して動作確認を行ったところ嵌まりました。最終的にはI2C0ポートでは動作しましたがI2C1ではうまく動いていません。
トラブった点を紹介します。

/*
 * 2022/03/15 T.Wanibe
 * UNIT_ENV3をI2C1に変更しての動作確認。折角なのでanalogReadTemp()も同時取得してみる
 * PiPicoの動作確認の為にExampleをレタッチして実行確認しています。
 * このスケッチはPicoをGroveShieldに装着し、I2C0にM5StackのセンサUNIT_ENV3を接続して
 * 温度、湿度、圧力計測するモノです。
 * UNIT_ENV3にはI2C: SHT30(0x44), QMP6988(0x70)です。
 * I2Cアドレスが指定出来るライブラリを使わないとうまくデータ取得出来ませんね。
 * UNIT_ENV3のライブラリ SHT3X.h QMP6988.h はPiPicoでうまく使えないようです。
 * Adafruit_SHT31.hはSHT30も共通で使える様です。Adafruitのライブラリはしっかりしているみたいです。
 * またQMP6988のライブラリは限られるようです。ENVVに搭載されているモノしか見つかりません。
 * I2C1のポートに接続しましたが、Wire.setSDA(6);Wire.setSCL(7);の設定を怠るとデータが取得出来ません。
 * ポート番号はSeeedStudioが提供するShield回路図を必ず確認する必要があります。
 * 最大2093056バイトのフラッシュメモリのうち、スケッチが65880バイト(3%)を使っています。
 * 最大262144バイトのRAMのうち、グローバル変数が12024バイト(4%)を使っていて、ローカル変数で250120バイト使うことができます。
 */
#include <Wire.h>
#include "Adafruit_SHT31.h"
#include "QMP6988.h"
Adafruit_SHT31 sht30 = Adafruit_SHT31();
QMP6988 qmp6988;
float tmp       = 0.0;                                          //なぜかNaNが認められない
float hum       = 0.0;
float pressure  = 0.0;
float tmpOnPico = 0.0;
//--------------
void setup() {
        Serial.begin(115200);
        Wire.setSDA(8);                                         //RP2040にはI2C0の組み合わせが6通りあるので設定しておくのが無難です。
        Wire.setSCL(9);
        Wire.begin();                                           //ENV IIのgroveコネクタ接続pin設定
        sht30.begin(0x44);                                      // sht30 I2C address: 0x44 or 0x45
        qmp6988.init(0x70);
        qmp6988.setpPowermode(QMP6988_NORMAL_MODE);
        qmp6988.setFilter(QMP6988_FILTERCOEFF_OFF);
        Serial.println(qmp6988.deviceCheck());
        Serial.println(F("ENV Unit III test"));
}
//--------------
void loop() {
        delay(1000);
        tmpOnPico       =       analogReadTemp();
        pressure        =       qmp6988.calcPressure()/100;     //qmp6988のデータを取得します。
        tmp             =       sht30.readTemperature();        //SHT30のデータを取得します。
        hum             =       sht30.readHumidity();           //SHT30から得られた湿度を代入します。
        Serial.printf("OnPicoTemp: %2.1f[℃]\nTemp: %2.1f[℃]\nHumi: %2.0f[%%]\nPressure:%5.0f[hPa]\n", tmpOnPico,tmp, hum, pressure);
}


気温・湿度・気圧計測はボッシュのBME280が安定しているという気がしています。返ってくる値に納得がゆきます。
ただ、BME280が搭載されているM5センサモジュールはありません。

/*
 * 2022/03/17 T.Wanibe
 * UNIT_ENV3の取得値結果が良くないので、BME280をI2C0に接続してRP2040での取得を試みます。
 * 最大2093056バイトのフラッシュメモリのうち、スケッチが67016バイト(3%)を使っています。
 * 最大262144バイトのRAMのうち、グローバル変数が12188バイト(4%)を使っていて、ローカル変数で249956バイト使うことができます。
 */
#include <Wire.h>
#include "Adafruit_BME280.h"
#define TRUE    1
#define FALSE   0
Adafruit_BME280 bme;                                            // I2C
float   tmp       = 0.0;                                        //なぜかNaNが認められない
float   hum       = 0.0;
float   pressure  = 0.0;
float   tmpOnPico = 0.0;
int     status,count;
//--------------
void setup() {
        Serial.begin(115200);
        pinMode(LED_BUILTIN, OUTPUT);
        digitalWrite(LED_BUILTIN, TRUE);
        Wire.setSDA(8);                                         //RP2040にはI2C0の組み合わせが6通りあるので設定しておくのが無難です。
        Wire.setSCL(9);
        delay(1000);
        digitalWrite(LED_BUILTIN, FALSE);
        Wire.begin();                                           //ENV IIのgroveコネクタ接続pin設定
        delay(1000);
        digitalWrite(LED_BUILTIN, TRUE);                 
        status = bme.begin(0x76,&Wire);                         //BME280 0x76/0x77
        Serial.print(status);
        delay(1000);
        digitalWrite(LED_BUILTIN, FALSE);
        if (!status) {
                Serial.println(F("Could not find a valid BME280 sensor, check wiring, address, sensor ID!"));
                Serial.print(F("SensorID was: 0x")); Serial.println(bme.sensorID(),16);
                Serial.print(F("        ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n"));
                Serial.print(F("   ID of 0x56-0x58 represents a BMP 280,\n"));
                Serial.print(F("        ID of 0x60 represents a BME 280.\n"));
                Serial.print(F("        ID of 0x61 represents a BME 680.\n"));
                while (1){                                      //無限ループ
                        delay(250);
                        if((count++)%2){
                                digitalWrite(LED_BUILTIN, TRUE);
                        }else{
                                digitalWrite(LED_BUILTIN, FALSE);
                        }
                }
        }
        delay(1000);
        digitalWrite(LED_BUILTIN, TRUE);
        Serial.println(F("BME_Test"));
}
//--------------
void loop() {
        delay(1000);
        if((count++)%2){
                digitalWrite(LED_BUILTIN, TRUE);
        }else{
                digitalWrite(LED_BUILTIN, FALSE);
        }
        tmpOnPico       =       analogReadTemp();
        pressure        =       bme.readPressure() / 100.0f;
        tmp             =       bme.readTemperature();
        hum             =       bme.readHumidity();
        Serial.printf("OnPicoTemp: %2.1f[℃]\nTemp: %2.1f[℃]\nHumi: %2.0f[%%]\nPressure:%5.0f[hPa]\n", tmpOnPico,tmp, hum, pressure);
}


M5センサモジュールにはUART接続のGPSが有ります。未入手です。入手後に動作確認予定です。
M5StickC用のサンプルコードがありますが、レタッチする必要があります。
その準備としてUBOXのモジュールがあり、これをUART0のコネクタに接続して流れてくるセンテンスをシリアルモニタに表示するコードを書いてみました。このコードは普通に動きます。

/*
 * 2022年3月18日 T.Wanibe
 * UBOXのGPSモジュールをRP2040のUART0に接続し動作確認をするプログラムです。
 * シリアルモニタにGPSから届くセンテンスが逐次表示されます。
 * 最大2093056バイトのフラッシュメモリのうち、スケッチが60288バイト(2%)を使っています。
 * 最大262144バイトのRAMのうち、グローバル変数が11368バイト(4%)を使っていて、ローカル変数で250776バイト使うことができます。
 */
//-----------------
void setup() {
        Serial.begin(115200);
        while (!Serial);
        pinMode(LED_BUILTIN,OUTPUT);
        Serial.println(F("\nStart RP2040_TestUART0"));
        Serial1.begin(9600);
}
//-----------------
void loop() {
        digitalWrite(LED_BUILTIN,HIGH);
        if (Serial1.available()){
                digitalWrite(LED_BUILTIN,LOW);
                Serial.print((char)Serial1.read());
        }
}

UBOXモジュールをUART1に接続した場合のレタッチ例を示しておきます。

/*
 * 2022年3月18日 T.Wanibe
 * UBOXのGPSモジュールをRP2040のUART1に接続し動作確認をするプログラムです。
 * シリアルモニタにGPSから届くセンテンスが逐次表示されます。
 * 最大2093056バイトのフラッシュメモリのうち、スケッチが60288バイト(2%)を使っています。
 * 最大262144バイトのRAMのうち、グローバル変数が11368バイト(4%)を使っていて、ローカル変数で250776バイト使うことができます。
 */
//-----------------
void setup() {
        Serial.begin(115200);
        while (!Serial);
        pinMode(LED_BUILTIN,OUTPUT);
        Serial.println(F("\nStart RP2040_TestUART0"));
        Serial2.setRX(5);
        Serial2.setTX(4);
        Serial2.begin(9600);
}
//-----------------
void loop() {
        digitalWrite(LED_BUILTIN,LOW);
        if (Serial2.available()){
                digitalWrite(LED_BUILTIN,HIGH);
                Serial.print((char)Serial2.read());
        }
}


M5Stack用ADCユニットが存在します。ADS1100搭載で、I2Cです。
ではなく、AIポートを使うユニットが無いかなと探しました。
見つかり次第追記します。


M5Stack用のデジタル入出力は UNIT SONIC IO で確認出来るのかと思います。
見つかり次第追記します。


M5Stack用のSPI接続モジュールも存在しますが、Grove接続は出来ないので特異なモノになります。
Grove Shield for Pi Picoには2×6pinヘッダーが付いていますのでこれと素直に接続出来るモージュールで動作確認します。
見つかり次第追記します。


戯言(nonsense)に戻る


問い合わせ頁の表示


免責事項

本ソフトウエアは、あなたに対して何も保証しません。本ソフトウエアの関係者(他の利用者も含む)は、あなたに対して一切責任を負いません。
あなたが、本ソフトウエアを利用(コンパイル後の再利用など全てを含む)する場合は、自己責任で行う必要があります。

本ソフトウエアの著作権はToolsBoxに帰属します。
本ソフトウエアをご利用の結果生じた損害について、ToolsBoxは一切責任を負いません。
ToolsBoxはコンテンツとして提供する全ての文章、画像等について、内容の合法性・正確性・安全性等、において最善の注意をし、作成していますが、保証するものではありません。
ToolsBoxはリンクをしている外部サイトについては、何ら保証しません。
ToolsBoxは事前の予告無く、本ソフトウエアの開発・提供を中止する可能性があります。

商標・登録商標

Microsoft、Windows、WindowsNTは米国Microsoft Corporationの米国およびその他の国における登録商標です。
Windows Vista、Windows XPは、米国Microsoft Corporation.の商品名称です。
LabVIEW、National Instruments、NI、ni.comはNational Instrumentsの登録商標です。
I2Cは、NXP Semiconductors社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。