はじめに
M5社のATOM Lite に M5Stack用超音波測距ユニット I2C(RCWL-9620)をつなぎ、製品サイトからリンクされている公式のライブラリを使い、その中にあるATOM用サンプルコードを使って動かそうとしたものの、どうしても正常に動かず。原因が分からず難儀しましたが、結局サンプルコードを一部修正することで、動くようになりました。※その後情報追記あり。
環境
- macOS Monterey バージョン12.5.1
- Arduino IDE 1.8.19(通常は下記 Visual Studio Code を使用していますが、問題の切り分けのために使用しました。今回はこの環境で検証してます。)
- Visual Studio Code + PlatformIO(普段の開発環境&現象を発見した環境)
トラブルの内容
- そのまま動かしても、シリアルに何も流れてこない。
- サンプルコードでは20〜4000未満の数値しかシリアルに流れないようになってるのため、サンプルコードのif文を削除し、取得したデータ全てをシリアルに流すようにしたところ、どんな距離であっても「4500.00」のみを流してくる。
修正点
ATOM用のサンプルコード内の22行目にある
M5.begin(true, true, fasle);
のうち、
- 2つ目の引数「true」を「false」に
- 3つ目の引数「fasle」を「false」に(単純なスペルミス)
と修正、つまり・・
M5.begin(true, false, false);
と書き換えると、動作しました。
原因
今回いただいたアドバイスによると、
- M5.beginの2番目の引数はWireだが、trueだとSDA=25, SCL=21で初期化されてしまう(今回のセンサーをATOM LiteのGROVE互換端子経由で使う場合は、SDA=26, SCL=32)。
- sensor.begin()でもWireを使っている。
ためではないか、とのことでした。
ちなみに他の機種用のサンプルコードも確認しましたが、M5.begin()内で引数を指定しているのはATOM Lite用のみで、他は引数なしでした。
その他
この問題を検証中に、Arduino IDEでコンパイルできない問題が出ましたが、検証前にたまたましていたOSをアップデートが理由でした。その解決にはこちらのサイトを参考にさせていただきました。
謝辞
今回の問題解決に際して、Facebookの「M5Stack User Group Japan」で多数のヒントやアドバイスをいただきました。ありがとうございました。
※追記(2024.8.10)
「読み出しのウエイトを50ms入れる」という対処法が書かれた記事がありました。手元では未検証です。
情報元:UNIT ULTRASONIC-I2Cを使う (イナバちゃんログ)