Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
dynamis opened this issue Aug 27, 2019 · 3 comments
Open

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

dynamis opened this issue Aug 27, 2019 · 3 comments

Comments

@dynamis
Copy link
Contributor

dynamis commented Aug 27, 2019

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

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

@satakagi
Copy link
Collaborator

satakagi commented Aug 27, 2019

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
Copy link
Contributor Author

dynamis commented Sep 2, 2019

なるほど、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 立てるだけ立てておいた:
microsoft/pxt-microbit#2411

@dynamis
Copy link
Contributor Author

dynamis commented Sep 2, 2019

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

  • 0 以外の値が返ってきたことがあるアドレスについては記録しておき 0 が返ってきても通知しない
  • 同スレーブアドレスへの呼び出しに対して 0 が返ってくるのが連続している場合に通知する
  • 出力するのは同じアドレスあたりに一度だけで良い (繰り返しログを埋められても困る)

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants