PR

M5stack動作中にセンサの接続を確認する方法

M5stack動作中にセンサの接続を確認する方法 組み込み機器

センサーをちゃんと認識しているか確認したい

こうした悩みを解決します。

本記事の内容は動画でも解説しています!

立プロ

新卒でメーカーに入り、10年間組み込みの現場で設計を行う。
今は個人事業主として自作の組み込み機器開発や、エージェント様に紹介いただき業務委託を行っています。
C,C#,JavaScript, Vue, PHP, VBA, GAS, Kotlinなど、扱う言語が増えゆく日々。

立プロをフォローする

M5stackのセンサはI2C通信

M5stackは複数のセンサーをつなぎ合わせられるのが特徴です。

これはI2Cと呼ばれる技術を利用しています。

センサーは固有のI2Cアドレスを持っており、M5stackはI2Cアドレスを指定して通信を試みます。
※I2Cアドレスはセンサのデータシートに記載されています!

合致するI2Cアドレスがあれば、そのセンサーとM5stackの通信を行うことができます。

(通信要求する側をマスター、要求を受ける側をスレーブと表現します)

この原理を利用して、M5stackがセンサーを認識しているか確認できます。 

サンプルコード 

beginTransmission関数の引数にI2Cアドレスを入れて、endTransmission関数の戻り値でセンサの有無を判断します。

#include <Wire.h>

Wire.begin();
Wire.beginTransmission(0xXX);
int error = Wire.endTransmission(); //endTransmission(1)の結果を返す

if(error == 0){
    //センサ有
} else {
    //センサ無
    //エラー表示させる
}

beginTransmission関数の中身はこちら

void TwoWire::beginTransmission(uint16_t address)
{
    if(is_slave){
        log_e("Bus is in Slave Mode");
        return;
    }
#if !CONFIG_DISABLE_HAL_LOCKS
    if(nonStop && nonStopTask == xTaskGetCurrentTaskHandle()){
        log_e("Unfinished Repeated Start transaction! Expected requestFrom, not beginTransmission! Clearing...");
        //release lock
        xSemaphoreGive(lock);
    }
    //acquire lock
    if(lock == NULL || xSemaphoreTake(lock, portMAX_DELAY) != pdTRUE){
        log_e("could not acquire lock");
        return;
    }
#endif
    nonStop = false;
    txAddress = address;
    txLength = 0;
}

endTransmission関数の中身はこちら

uint8_t TwoWire::endTransmission(bool sendStop){
    if(is_slave){
        log_e("Bus is in Slave Mode");
        return 4;
    }
    if (txBuffer == NULL){
        log_e("NULL TX buffer pointer");
        return 4;
    }
    esp_err_t err = ESP_OK;
    if(sendStop){
        err = i2cWrite(num, txAddress, txBuffer, txLength, _timeOutMillis);
#if !CONFIG_DISABLE_HAL_LOCKS
        //release lock
        xSemaphoreGive(lock);
#endif
    } else {
        //mark as non-stop
        nonStop = true;
#if !CONFIG_DISABLE_HAL_LOCKS
        nonStopTask = xTaskGetCurrentTaskHandle();
#endif
    }
    switch(err){
        case ESP_OK: return 0;
        case ESP_FAIL: return 2;
        case ESP_ERR_TIMEOUT: return 5;
        default: break;
    }
    return 4;
}

簡単に説明すると、endTransmission関数の戻り値が以下のいずれかによってセンサの有無を判断できます。

  • M5stackがスレーブだったら4を返す
  • 送信バッファが存在しなければ4を返す
  • スレーブへの送信結果がOKなら0を返す
  • スレーブへの送信結果がFAILなら2を返す
  • スレーブへの送信結果が タイムアウトなら5を返す

つまり、0以外の数字が返ってきたらエラーと解釈できます。

これをソースコードに反映してやるとよいです。

タイミングとしては電源投入直後に使うのが良いと思います!

まとめ

M5stackがセンサ認識しているかは、endTransmission関数を使うことで判断できる!

コメント

タイトルとURLをコピーしました