PR

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

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

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

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

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

姫野秀徳

組み込みエンジニアとしてメーカー勤務10年。
第二種電工事士、基本情報技術者、Code.org認定教師。
microbitを用いた電子工作&プログラミング教室を開校。
組み込み開発の実際を発信するyoutube活動も行う。

無料で学べる組み込み開発オンラインスクールはじめました!
https://kumicla.tatepro.com

姫野秀徳をフォローする

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関数を使うことで判断できる!

この内容が良いと思ったら、いいね💖を押して教えてください!

組みクラ – 組み込み開発を学び、未来を創るエンジニアへ
無料で学べる!組み込み開発の基礎から応用までをマスターできるオンラインスクール「組みクラ」

組み込みエンジニアは、あらゆる産業の基盤を支える重要な職業です。
私たちタテプロは、次世代の組み込みエンジニアを育成し、業界の競争力を高めるために活動しています。
あなたも、無料で学べる「組みクラ」で、組み込み開発のスキルをしっかり身につけ、キャリアを加速させましょう!
今すぐ学び始めて、将来の自分をステップアップさせる第一歩を踏み出しませんか?

\立プロとLINEで友だちになりませんか/
立プロと友だちになる
組み込み機器
シェアしていただけると嬉しいです!

コメント

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