AI要約
超音波センサーを複数使った測距で、存在しない物体を検出するゴースト現象に遭遇しました。原因はセンサー間のクロストーク。現象を数式で明らかにし、走査順とインターバル調整で解決まで持ち込みます。
やること
くだらないタイトルで本当にすみません。反省していません。
このシリーズではいくつかの測距センサーを試してみました。コストと簡便さから超音波センサーに決め、いよいよ本番の実装をしたのですが、なんと存在しないものを検出するゴースト現象が起きてしまいます。
今回はその経緯と解決方法を紹介します。
実装しますた
超音波センサー「US-015」を採用しました。こちらの記事でやっています。
車体の側面に合計6個取り付け、Arduinoで距離情報を取得します。

丁寧にQIコネクタをカッチャンしました。センサーが壊れても交換が簡単です。

3Dプリントしたケースに入れます。防水性、ナシ!

両面テープで車体に貼り、ケーブルは後ろのトランクまで引いています。目立たなくていい感じです。

車の右前から順に1, 2, 3、左に移って4, 5,6 と順番に取得しています。クロストーク(相互干渉)を防ぐために各センサーの間にインターバル2ミリ秒を挟んであります。

6つの値がきちんと取得できていますね。「遠すぎて検出なし」は5.0mを出力するようにしています。

めでたしめでたし(一級フラグ建築士)
ゴースト現象発生
人生はそううまく行かないもので ( ˘ω˘ ; )
センサーから0.4m以内に物体があったらブザーが鳴るようにしていたのですが、近くに何もない場所でビッ…ビッ…と鳴るのです。(解決を急いでいたので動画を撮っていません!)
Arduinoのシリアルモニタを確認すると、
5.0 5.0 5.0 5.0 5.0 5.0
5.0 5.0 5.0 5.0 5.0 5.0
5.0 5.0 5.0 5.0 5.0 5.0
5.0 0.351 5.0 5.0 5.0 5.0
5.0 0.386 5.0 5.0 5.0 5.0
5.0 5.0 5.0 5.0 5.0 5.0
5.0 5.0 5.0 5.0 5.0 5.0
5.0 0.399 0.441 5.0 5.0 5.0
5.0 5.0 5.0 5.0 5.0 5.02,3番目のセンサーがたまに何かを検出しているのです。
さらに詳しく分析するとこれは2,3,5,6番目のセンサーにしか起こらないことがわかりました。
おーん。値を取得する順番をもう一度見てみると・・・

あーこれね。1番目の音波が2番目に入ってるのね~
クロストークの理論
ということで、センサーから「実際の壁」までの距離を L1 [m] とします。検出した「架空の壁」までの距離を L2 [m] とします。この2つの関係を求めてみます。

センサー1から出た音がセンサー2に入るまでの飛行時間 T1 [s] は、音速 340 [m/s] を使って

センサー1とセンサー2の発射時刻の差 Tdiff [s] は、検出タイムアウト 8 [ms] とインターバル 2 [ms] がかかることから

架空の壁における音の飛行時間 T2 [s] は、
![]()
よって架空の壁との距離 L2 [m] は、

となり、「実際の壁」よりも1.7m近い場所に「架空の壁」を検出することがわかりました。
そうなのです。問題となった場所はたしかに壁から2mくらい離れた場所でした。
解決方法
そこで、インターバル時間を長くするためにセンサーの走査順を変更。

さらに、プログラム上のインターバル時間を 2 [ms] から 5 [ms] に増やしました。
これにより Tdiff [s] は、

となり、架空の壁との距離 L2 [m] は
![]()
となりました。
このセンサーの検出限界は約4mのため、音波が減衰してクロストークの検出はなくなりました。理論の勝利ですね!
おわりに
百聞は一見にしかず。教科書でやったような問題が現実に起きると楽しく解決できますね。

