センサーをちゃんと認識しているか確認したい
こうした悩みを解決します。
本記事の内容は動画でも解説しています!
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関数を使うことで判断できる!
コメント