chirimen-oh / chirimen-micro-bit

CHIRIMEN with micro:bit
https://chirimen.org/chirimen-micro-bit/
Other
7 stars 9 forks source link

I2C スレーブアドレスの間違いに気付きにくい #6

Open dynamis opened 5 years ago

dynamis commented 5 years ago

CHIRIMEN Raspi3 だとスレーブアドレスが違う場合 (や競合している場合) には比較的すぐ分かるが microbit の場合はスレーブアドレスを間違っていても init() に成功してしまってそのまま readValue したら 0 が返ってくるという挙動になるだけで例外やエラーが発生せず原因が分かりにくいケースがある。

BME280 など個体によってスレーブアドレスが違うデバイスを使う時には経験者じゃないと判断が難しい状況になっているように思うので、該当スレーブアドレスのデバイスが見つからない場合に検知可能に出来ないか。

satakagi commented 5 years ago

micro:bitのmakecodeのI2CAPIは、該当スレーブアドレスに何もつながっていなくても、ご指摘の通り"0"が返却されてきてしまうという問題(というより仕様?)があります。今のところこの問題を回避する策はmakecode上でmicro:bit側のブリッジソフトウェアを組む限りは存在しないようです。(makecodeのバックエンドにあるより低レベルのフレームワーク上では"0"ではない例外の返却がなされるようになっているようですが、makecodeでは0にまとめられてしまっている)

micro:bit版のi2cdetect webAppsは、苦し紛れに"0"が返却されてきたアドレスについては、別の適当なレジスタ番号を指定して改めてReadを繰り返し、"0"以外のデータが返ってくるまで確認してdetect結果としています。

現状としては、micro:bit版のi2cdetect webAppsを走らせてもらって確認する というのが次善の策でしょうか。 あ、あとはreadValueを監視しておいて、いつまでたってもそのアドレスから"0"しか返ってこないようなら、Exceptionというほどではないけれど、何か(console上に色を変えたメッセージを出すとかの)アラートを出してあげるとか。これが効果あるならポリフィル上で実装できると思います。

dynamis commented 5 years ago

なるほど、makecode の pins には i2c 関連のメソッドが i2cReadNumber, i2cWriteNumber しかないから i2cdetect.html で苦し紛れに...とかいうコメントの入ったコードになってたんですね。

該当 API: https://makecode.microbit.org/reference/pins https://makecode.microbit.org/reference/pins/i2c-read-number https://makecode.microbit.org/reference/pins/i2c-write-number

呼び出し先を順に: i2cReadNumber/i2cWriteNumber https://github.com/microsoft/pxt-microbit/blob/master/libs/core/pins.ts#L21 i2cReadBuffer/i2cWriteBuffer https://github.com/microsoft/pxt-microbit/blob/master/libs/core/pins.cpp#L369 ... 以下は追ってない。

取りあえず isseu 立てるだけ立てておいた: https://github.com/microsoft/pxt-microbit/issues/2411

dynamis commented 5 years ago

連続して 0 が返るケースについては「正しく応答があって 0 なのか何らかの問題 (接続されていない、アドレスが違う、その他の内部エラー) があるのか区別が付かない (現在の実装上の制限事項)」旨をこの issue の URL と共に console.info か console.warning あたりを出しておくのは、初心者へのデバッグヘルプとしては有効ですね。

くらいでしょうか。脱線ですが、ハードのローレベル API である WebGPIO/I2C については、ソフトウェア側ではないエラーが疑われるケースについて、この問題に限らずもう少しログに分かりやすいメッセージを出してあげると初学者向けに良いですね。raspi3 の polyfill の方も含めて考えてみたくなる。