概要
UIFlowでRoverC HATとToF Unitを同時に使うと不安定になる問題の解決方法。
文章は短いですが、結構大変だったのでメモ書きです。
経緯と問題
M5Stack(M5SickC)のプログラムをMakecode風にビジュアルに開発できるUIFlowを試しています.これはM5StickCのHATやGroveのUnit用のライブラリが組み込まれていて大変便利です。
迷路探索ロボットの実験のためにRoverCとToF距離センサユニットを組み合わせて次のような簡単なテストプログラムで試してみました。
事前にUnitsでToFを、HatでRoverCを追加し、数値を表示するためにLabelを追加しています。
しかしこれだけのプログラムでも、"I2C bus error (19)"と出て同時に使えません.距離センサの読み取りとRoverCへの動作命令の間に50ミリ秒程度のウェイトをいれるとうまくいく場合はありますが,エラーが出ることもあり,どうにも不安定です.
解決方法
調べてみても,なかなか同じような問題に当たっている人がいないようです.ソースコードらしきものを発見してみてみると、ToFユニットとの通信が、70ミリ秒ごとのタイマー割り込みで値の取得をしているようです。どうもこのタイマー割り込みが怪しいと思って、tof1.deinit()でタイマーをとめて,tof1._update()をしてから値を取得するようにすると...ビンゴ!。エラーが出なくなり、さらにセンサの値の更新も高速になりました.
最終的にこの_tof.pyを参考にしながら、タイマー割り込みを使わないCustom Blockを作成しました。