pdf-icon

Arduino Guide

Unit Pahub Arduino チュートリアル

1. 準備

依存ライブラリ
上記のライブラリ(M5UnitUnifiedM5Unit-ENV など)をインストールする際には、他の依存ライブラリ(例えば M5HAL , M5Utility など)も必要です。Arduino ライブラリマネージャを使ってインストールする場合は、すべての依存関係をインストールするようにしてください。

2. サンプルプログラム

サンプルの説明
Unit Pahub は 6 つの I2C 拡張インターフェースを提供しており、それぞれのインターフェースを独立して制御できます。時分割接続方式により、Unit Pahub はマスターアドレスの衝突を回避し、同じ I2C アドレスを持つ複数のデバイスをバスに接続できます。本チュートリアルでは、6 台の同じ Unit ENV-III を接続する例を示し、Unit Pahub を使用して拡張する方法を紹介します。
I2C アドレス
センサーを拡張する際、センサーのアドレスが Unit Pahub v2.1 のデフォルトアドレスと衝突しないように注意する必要があります。この例では、Unit ENV-III のセンサー QMP6988 が同じ I2C アドレス (0x70) を持っています。この問題を解決するためには、Unit Pahub v2.1 の DIP スイッチを他のアドレスに切り替える必要があります。他のバージョンの Unit Pahub は、A0-A2 の抵抗をハンダ付けしてアドレス切り替えが可能です。

チャンネル選択

この方法は、他のセンサーライブラリで Wire を簡単にラップして使用することができます。Unit Pahub の拡張インターフェースのスイッチ操作のみを行い、チャンネルを切り替えた後、対応するセンサーの読み書きを手動で行います。

  • チャンネル I2C スキャン例
#include <M5Unified.h>
#include <M5UnitUnified.h>
#include <M5UnitUnifiedHUB.h>
#include "Wire.h"

namespace {
m5::unit::UnitUnified Units;
m5::unit::UnitPaHub2 hub0{0x77};  // デフォルトは 0x70 ですが、0x77 に変更します
}  // namespace

void setup()
{
    M5.begin();
    M5.Display.setFont(&fonts::FreeMonoBold12pt7b);
    auto pin_num_sda = M5.getPin(m5::pin_name_t::port_a_sda);
    auto pin_num_scl = M5.getPin(m5::pin_name_t::port_a_scl);
    M5_LOGI("getPin: SDA:%u SCL:%u", pin_num_sda, pin_num_scl);

    Wire.begin(pin_num_sda, pin_num_scl, 400000U);

    if (!Units.add(hub0, Wire) ||  // hub0 をコアに接続
        !Units.begin()) {
        M5_LOGE("初期化に失敗しました");
        M5.Display.clear(TFT_RED);
        while (true) {
            m5::utility::delay(10000);
        }
    }
}

void scan_ch(uint8_t ch)
{
    M5.Display.clear();
    int textColor = YELLOW;
    for (size_t i = 0; i < 2; i++) {
        M5.Display.setCursor(0, 0);
        M5.Display.print("アドレスをスキャン中 [HEX]\r\n");
        M5.Display.printf("Pahub チャンネル: %d\r\n", ch);
        for (uint8_t addr = 1; addr < 127; addr++) {
            Wire.beginTransmission(addr);
            uint8_t error = Wire.endTransmission();
            if (error == 0) {
                M5.Display.print(addr, HEX);
                M5.Display.print(" ");
            } else {
                M5.Display.print(".");
            }
            delay(10);
        }

        if (textColor == YELLOW) {
            textColor = CYAN;
        } else {
            textColor = YELLOW;
        }
        M5.Display.setTextColor(textColor, BLACK);
    }
}

void loop()
{
    M5.update();
    for (uint8_t i = 0; i < 6; i++) {
        // 各チャンネルを選択してスキャン
        hub0.selectChannel(i);
        scan_ch(i);
    }
}

UniUnified

もし、UnitUnified ドライバに対応したセンサーライブラリを使用している場合は、add メソッドを使ってセンサーインスタンスを直接ハブに登録し、Units.update(); を使用すると、各チャンネルのセンサーデータが自動的に取得されます。

  • チャンネル Unit ENV-III データ取得例
#include <M5Unified.h>
#include <M5UnitUnified.h>
#include <M5UnitUnifiedHUB.h>
#include <M5UnitUnifiedENV.h>

namespace {
m5::unit::UnitUnified Units;
m5::unit::UnitPaHub2 hub0{0x77};  // デフォルトは 0x70 ですが、0x77 に変更します
m5::unit::UnitENV3 unitENV3_0;
m5::unit::UnitENV3 unitENV3_1;
auto& sht30_0   = unitENV3_0.sht30;
auto& qmp6988_0 = unitENV3_0.qmp6988;
auto& sht30_1   = unitENV3_1.sht30;
auto& qmp6988_1 = unitENV3_1.qmp6988;
}  // namespace

void setup()
{
    M5.begin();
    M5.Display.setFont(&fonts::FreeMonoBold12pt7b);
    auto pin_num_sda = M5.getPin(m5::pin_name_t::port_a_sda);
    auto pin_num_scl = M5.getPin(m5::pin_name_t::port_a_scl);
    M5_LOGI("getPin: SDA:%u SCL:%u", pin_num_sda, pin_num_scl);

    Wire.begin(pin_num_sda, pin_num_scl, 400000U);

    if (!hub0.add(unitENV3_0, 0) ||  // unitENV3_0 を hub0 チャンネル 0 に接続
        !hub0.add(unitENV3_1, 1) ||  // unitENV3_1 を hub0 チャンネル 1 に接続
        !Units.add(hub0, Wire) ||    // hub0 をコアに接続
        !Units.begin()) {
        M5_LOGE("初期化に失敗しました");
        M5.Display.clear(TFT_RED);
        while (true) {
            m5::utility::delay(10000);
        }
    }
}

void loop()
{
    M5.update();
    Units.update();
    if (sht30_0.updated()) {
        M5.Display.setCursor(0, 0);
        M5.Display.fillRect(0, 0, 320, 60, BLACK);
        M5.Display.printf(">CH0 SHT30Temp:%2.2f\n>Humidity:%2.2f", sht30_0.temperature(), sht30_0.humidity());
        M5_LOGI("\n>CH0 SHT30Temp:%2.2f\n>Humidity:%2.2f", sht30_0.temperature(), sht30_0.humidity());
    }
    if (qmp6988_0.updated()) {
        M5.Display.setCursor(0, 60);
        M5.Display.fillRect(0, 60, 320, 60, BLACK);
        M5.Display.printf(">CH0 QMP6988Temp:%2.2f\n>Pressure:%.2f", qmp6988_0.temperature(), qmp6988_0.pressure());
        M5_LOGI("\n>CH0 QMP6988Temp:%2.2f\n>Pressure:%.2f", qmp6988_0.temperature(), qmp6988_0.pressure());
    }
    if (sht30_1.updated()) {
        M5.Display.setCursor(0, 120);
        M5.Display.fillRect(0, 120, 320, 60, BLACK);
        M5.Display.printf(">CH1 SHT30Temp:%2.2f\n>Humidity:%2.2f", sht30_1.temperature(), sht30_1.humidity());
        M5_LOGI("\n>CH1 SHT30Temp:%2.2f\n>Humidity:%2.2f", sht30_1.temperature(), sht30_1.humidity());
    }
    if (qmp6988_1.updated()) {
        M5.Display.setCursor(0, 180);
        M5.Display.fillRect(0, 180, 320, 60, BLACK);
        M5.Display.printf(">CH1 QMP6988Temp:%2.2f\n>Pressure:%.2f", qmp6988_1.temperature(), qmp6988_1.pressure());
        M5_LOGI("\n>CH1 QMP6988Temp:%2.2f\n>Pressure:%.2f", qmp6988_1.temperature(), qmp6988_1.pressure());
    }
}

3. コンパイルとアップロード

    1. ダウンロードモード:異なるデバイスではプログラム書き込み前にダウンロードモードに入る必要があります。この手順は使用するメインコントロールデバイスによって異なる場合があります。詳細については、 Arduino IDE のはじめにガイド を参照し、デバイスごとのダウンロード手順をご確認ください。
  • CoreS3 の場合、リセットボタンを 2 秒ほど長押しして、内部の緑色の LED が点灯したらボタンを離します。これでデバイスはダウンロードモードに入り、プログラム書き込みの準備が整います。

    1. デバイスのポートを選択し、Arduino IDE の左上にあるコンパイル&アップロードボタンをクリックして、プログラムのコンパイルとアップロードを行います。

4. センサーデータの読み取り

時分割接続方式を使用して、複数の Unit ENV-III の温湿度データを読み取り、表示します。

On This Page