- 必要な材料:
- 回路図:
- HC-SR04モジュールが実際にどのように機能するか:
- 2つの超音波センサー(HC-SR04)間の距離の測定:
- 送信機センサーのプログラム:
- 受信機センサーのプログラム:
- ワーキング:
- 即興のアイデア–既知の距離を使用してセンサーをキャリブレーションします。
超音波センサー(HC-SR04)は、特定の1点からの物体の距離を見つけるために一般的に使用されます。 Arduinoでこれを行うのはかなり簡単で、コードもかなりシンプルです。しかし、この記事では、これらの人気のあるHC-SR04センサーで別のことを試してみます。2つの超音波センサー間の距離を計算してみます。つまり、一方のセンサーを送信機として機能させ、もう一方のセンサーを受信機として機能させます。これを行うことにより、多くの超音波受信機を使用して1つの送信機の位置を追跡できます。この追跡は三角測量と呼ばれ、自動ドッキングロボットの荷物フォロワーやその他の同様のアプリケーションに使用できます。2つの米国センサー間の距離を見つける かなり単純な作業のように聞こえるかもしれませんが、このプロジェクトで説明するいくつかの課題に直面しました。
この記事で説明する手法は、かなり正確ではなく、変更を加えない実際のシステムでは役に立たない可能性があります。このドキュメントの期間中、私は私のような結果を得る人を見つけられなかったので、これを試みている人々が車輪の再発明をする必要がないように、私はそれをどのように機能させるかについての私の見解を共有しました。
必要な材料:
- Arduino(2Nos)–任意のモデル
- HCSR04モジュール(2Nos)
回路図:
1つのUS(超音波)センサーを送信機として機能させ、もう1つを受信機として機能させる予定ですが、センサーの4つのピンすべてをArduinoに接続する必要があります。なぜ私たちがすべきですか?これについては後で詳しく説明しますが、今のところ回路図は次のようになります。
ご覧のとおり、送信機と受信機の両方の回路図は同じです。また、チェックしてください:Arduino超音波センサーインターフェース
HC-SR04モジュールが実際にどのように機能するか:
先に進む前に、HC-SR04センサーがどのように機能するかを理解しましょう。以下のタイミング図は、動作を理解するのに役立ちます。
センサーには、タイミング図に示すように距離を測定するために使用される2つのピンTriggerとEchoがあります。最初に測定を開始するには、送信機から超音波を送信する必要があります。これは、トリガーピンを10uSの間ハイに設定することで実行できます。これが行われるとすぐに、送信機ピンは米国波の8つの音波バーストを送信します。このUS波は、オブジェクトの跳ね返りに当たり、受信機によって受信されます。
ここで、タイミング図は、受信機が波を受信すると、波がUSセンサーから移動してセンサーに戻るのにかかる時間に等しい時間、エコーピンをハイにすることを示しています。このタイミング図は正しくないようです。
センサーのTx(送信機)部分をカバーし、エコーパルスが高くなったかどうかを確認しましたが、高くなりました。これは、エコーパルスがUS(超音波)波を受信するのを待たないことを意味します。それが米国の波を送信すると、それは高くなり、波が戻るまで高いままです。したがって、正しいタイミング図は次のようになります(ライティングスキルが低いため申し訳ありません)
HC-SR04を送信機としてのみ機能させる:
HC-SR04を送信機としてのみ機能させるのは非常に簡単です。タイミング図に示されているように、トリガーピンを出力ピンとして宣言し、10マイクロ秒の間ハイのままにする必要があります。これにより、超音波バーストが開始されます。したがって、波を送信したいときはいつでも、送信機センサーのトリガーピンを制御する必要があります。コードは以下のとおりです。
HC-SR04をレシーバーとしてのみ機能させる:
タイミング図に示されているように、エコーピンはトリガーピンに関連しているため、立ち上がりを制御することはできません。したがって、HC-SR04をレシーバーとしてのみ機能させる方法はありません。しかし、センサーの送信機部分をテープで覆うか(下の写真に示すように)、キャップを付けるだけでハックを使用できます。US波は送信機ケーシングの外に逃げることができず、エコーピンはこのUS波の影響を受けません。
ここで、エコーピンをハイにするために、このダミーのトリガーピンを10マイクロ秒ハイに引く必要があります。このレシーバーセンサーがトランスミッターセンサーによって送信されたUS波を取得すると、エコーピンはローになります。
2つの超音波センサー(HC-SR04)間の距離の測定:
これまで、一方のセンサーを送信機として機能させ、もう一方のセンサーを受信機として機能させる方法を理解してきました。さて、送信機センサーから超音波を送信して受信機センサーで受信し、送信機から受信機に波が伝わるのにかかる時間を確認するのは簡単ですね。しかし悲しいことに、ここで問題が発生し、これは機能しません。
送信機モジュールと受信機モジュールは遠く離れており、受信機モジュールが送信機モジュールからUS波を受信すると、送信機がこの特定の波をいつ送信したかがわかりません。開始時刻がわからないと、所要時間、つまり距離を計算できません。この問題を解決するには、送信機モジュールがUS波を送信したときに、受信機モジュールのエコーパルスを正確にハイにする必要があります。つまり、送信機モジュールと受信機モジュールは同時にトリガーする必要があります。これは、次の方法で実現できます。
上の図では、Txは送信機センサーを表し、Rxは受信機センサーを表します。示されているように、送信機センサーは、周期的な既知の遅延で米国の波を送信するように作られています。これがすべてです。
レシーバーセンサーでは、トランスミッターピンがハイになるときにトリガーピンを正確にハイにする必要があります。そのため、最初はランダムにレシーバートリガーをハイにします。これはエコーピンがローになるまでハイのままになります。このエコーピンは、送信機からUS波を受信した場合にのみローになります。したがって、ローになるとすぐに、送信機センサーがトリガーされたと見なすことができます。ここで、この仮定により、エコーが低くなるとすぐに、既知の遅延を待ってから、レシーバートリガーをトリガーできます。これにより、送信機と受信機の両方のトリガーが部分的に同期されるため、pulseIn()を使用して即時エコーパルス持続時間を読み取り、距離を計算できます。
送信機センサーのプログラム:
送信機モジュールの完全なプログラムは、ページの下部にあります。定期的に送信機センサーをトリガーするだけです。
digitalWrite(trigPin、HIGH); delayMicroseconds(10); digitalWrite(trigPin、LOW);
センサーをトリガーするには、トリガーピンを10uSの間ハイに保つ必要があります。同じことをするためのコードは上に示されています
受信機センサーのプログラム:
レシーバーセンサーでは、センサーのトランスミッターアイをカバーして、前述のようにダミーにします。これで、上記の手法を使用して2つのセンサー間の距離を測定できます。完全なプログラムは、このページの下部にあります。いくつかの重要な行を以下に説明します
Trigger_US(); while(digitalRead(echoPin)== HIGH); delayMicroseconds(10); Trigger_US(); 期間= pulseIn(echoPin、HIGH);
最初に、関数Trigger_US()を使用してUSセンサーをトリガーし、次にwhileループを使用してエコーピンがハイのままになるまで待機します。低くなると、事前に決定された期間を待ちます。この期間は、試行錯誤を使用して決定できる10〜30マイクロ秒の範囲である必要があります(または、以下の即興のアイデアを使用できます)。この遅延の後、同じ関数を使用してUSを再度トリガーし、pulseIn()関数を使用して波の持続時間を計算します。
同じ古い式を使用して、以下のように距離を計算できます
距離=期間* 0.034;
ワーキング:
プログラムの説明に従って接続します。写真のようにレシーバーセンサーのTx部分を覆います。次に、以下に示す送信機コードと受信機コードを送信機と受信機のArduinoにそれぞれアップロードします。受信機モジュールのシリアルモニターを開くと、下のビデオに示すように、2つのモジュール間の距離が表示されていることに気付くはずです。
注:この方法は単なるイデオロギーであり、正確または満足のいくものではない可能性があります。ただし、以下の即興のアイデアを試して、より良い結果を得ることができます。
即興のアイデア–既知の距離を使用してセンサーをキャリブレーションします。
これまで説明してきた方法は奇妙なことに満足のいくもののようですが、私のプロジェクトにはそれで十分でした。ただし、この方法の欠点とそれを克服する方法についても説明したいと思います。この方法の大きな欠点の1つは、送信機センサーがUS波を送信した直後に受信機のエコーピンがローになると想定することです。これは、送信機から受信機に波が移動するのに時間がかかるため、正しくありません。したがって、送信機のトリガーと受信機のトリガーは完全に同期していません。
これを克服するために、最初に既知の距離を使用してセンサーを較正できます。距離がわかれば、US波が送信機から受信機に到達するのにかかる時間がわかります。以下に示すように、この時間をDel(D)として保持しましょう。
これで、送信機のトリガーと同期するために、受信機のトリガーピンをハイにする必要がある時間が正確にわかります。この期間は、既知の遅延(t)– Del(D)で計算できます。時間制限のため、このアイデアをテストできなかったため、どの程度正確に機能するかわかりません。それで、もしあなたがそれを試みたならば、コメントセクションを通して私に結果を知らせてください。