Arduinoを使用して2点間の距離を測定する方法は?

エレクトロニクスでは、ほとんどの場合、超音波センサーは特定のポイントから別のポイントまでの距離を測定するために使用されます。 Arduinoボードにコードを記述して統合するのは非常に簡単です 超音波センサー このタスクを実行します。ただし、この記事では、別のアプローチを採用します。 2つの別々のArduinoと統合される2つの別々の超音波センサーを使用します。これらの2つのモジュールは、距離が測定される2つの異なるポイントに配置されます。 1つのセンサーが受信機になり、もう1つのセンサーが送信機になります。そうすることで、多くの超音波受信機を使用して送信機の位置を特定するだけで、それらの間の距離を測定できるようになります。ここで使用しているテクニックは 三角測量。



Arduinoを使用した距離の測定

ここで使用される手法は、距離が短い小規模システムでのみ役立ちます。大規模に実装するには、確かにいくつかの変更が必要です。このプロジェクトの実施中に直面したすべての課題について、以下で説明します。



Arduinoと超音波センサーを使用して距離を測定する方法は?

プロジェクトの背後にある概要がわかったので、プロジェクトを開始するために先に進み、さらに情報を収集しましょう。



ステップ1:コンポーネントの収集(ハードウェア)

プロジェクトの途中で不便を避けたい場合は、使用するすべてのコンポーネントの完全なリストを作成するのが最善の方法です。回路の作成を開始する前の2番目のステップは、これらすべてのコンポーネントの簡単な調査を行うことです。このプロジェクトで必要なすべてのコンポーネントのリストを以下に示します。



  • ジャンパー線
  • 5V AC-DCアダプター(x2)

ステップ2:コンポーネントの収集(ソフトウェア)

  • Proteus 8 Professional(からダウンロードできます ここに )

Proteus 8 Professionalをダウンロードしたら、その上に回路を設計します。初心者が回路を設計してハードウェアに適切に接続するのに便利なように、ここにソフトウェアシミュレーションを含めました。

ステップ3:HCR-05の動作

プロジェクトの主な要約がわかったので、先に進んで、の動作について簡単に説明します。 HCR-05 。このセンサーの主な動作は、次の図で理解できます。

このセンサーには2つのピンがあります。 トリガーピン、 そして エコピン これらは両方とも、2つの特定のポイント間の距離を測定するために使用されます。このプロセスは、センサーから超音波を送信することによって開始されます。このタスクは、10usのトリガーピンをトリガーすることによって実行されます。このタスクが完了するとすぐに、超音波の8ソニックバーストが送信機から送信されます。この波は空中を伝わり、物体に当たるとすぐに反撃し、センサーに組み込まれた受信機で受信されます。



センサーを反射した後、超音波が受信機で受信されると、 エコピン 高い状態に。このピンは、超音波が送信機からセンサーの受信機に戻るのにかかる時間と正確に等しい時間の間、ハイ状態のままになります。

超音波センサーを作るには 送信機 のみ、 トリガーピンを出力ピンにして、このピンに10usのハイパルスを送信するだけです。これが行われるとすぐに超音波バーストが開始されます。したがって、波が送信されるときはいつでも、超音波センサーのトリガーピンだけが制御されます。

超音波センサーをとして作る方法はありません 受信機のみ ECOピンの立ち上がりは、センサーのトリガーピンに関連しているため、マイクロコントローラーで制御できないためです。しかし、私たちにできることが1つあります。それは、この超音波センサーの送信機を、UV波が出ないダクトテープで覆うことができるということです。そうすれば、このトランスミッタのECOピンはトランスミッタの影響を受けません。

ステップ4:回路の動作

さて、両方のセンサーを送信機と受信機として別々に動作させるようにしたので、ここで直面している大きな問題があります。超音波がいつ送信されたかを正確に知らないため、受信機は超音波が送信機から受信機に伝わるのにかかる時間を知りません。

この問題を解決するために、私たちがしなければならないことは、 高い 超音波が送信機センサーを介して送信されるとすぐに、受信機のECOに信号を送ります。つまり、受信機のECOと送信機のトリガーを同時にHIGHに送信する必要があると言えます。したがって、これを実現するために、送信機のトリガーが高くなるとすぐに、何らかの方法で受信機のトリガーを高くします。レシーバーのこのトリガーは、ECOピンが移動するまでハイのままになります LOW 。超音波信号が受信機のECOピンで受信されると、LOWになります。これは、送信機センサーのトリガーがちょうどHIGH信号を受信したことを意味します。これで、ECOが低くなるとすぐに、既知の遅延を待ち、レシーバーのトリガーをHIGHにします。そうすることで、両方のセンサーのトリガーが同期され、波の移動の時間遅延を知ることによって距離が計算されます。

ステップ5:コンポーネントの組み立て

一方の超音波センサーの送信機ともう一方の受信機のみを使用していますが、の4つのピンすべてを接続する必要があります。 超音波センサー Arduinoに。回路を接続するには、以下の手順に従ってください。

  1. 2つの超音波センサーを取ります。最初のセンサーの受信機と2番目のセンサーの送信機をカバーします。この目的のために白いダクトテープを使用し、信号が2番目のセンサーの送信機から出たり、信号が最初のセンサーの受信機に入らないように、これら2つが完全に覆われていることを確認してください。
  2. 2つの別々のブレッドボードに2つのArduinoを接続し、それぞれのセンサーを接続します。トリガーピンをArduinoのピン9に接続し、ecoPinをArduinoのピン10に接続します。 5VのArduinoと共通のすべてのアースで超音波センサーの電源を入れます。
  3. レシーバーコードをレシーバーのArduinoにアップロードし、トランスミッターコードをトランスミッターのArduinoにアップロードします。
  4. 次に、受信側のシリアルモニターを開き、測定されている距離をメモします。

このプロジェクトの回路図は次のようになります。

回路図

ステップ6:Arduino入門

Arduino IDEにまだ慣れていない場合でも、マイクロコントローラーボードでArduinoIDEをセットアップして使用するためのステップバイステップの手順を以下に説明しているので心配しないでください。

  1. ArduinoIDEの最新バージョンをからダウンロードします アルドゥイーノ。
  2. Arduino Nanoボードをラップトップに接続し、コントロールパネルを開きます。コントロールパネルで、をクリックします ハードウェアとサウンド 。今クリック デバイスとプリンター。 ここで、マイクロコントローラーボードが接続されているポートを見つけます。私の場合は COM14 しかし、それはコンピュータによって異なります。

    ポートを見つける

  3. [ツール]メニューをクリックします。ボードをに設定します Arduino Nano ドロップダウンメニューから。

    セッティングボード

  4. 同じツールメニューで、ポートを以前に観察したポート番号に設定します。 デバイスとプリンター

    設定ポート

  5. 同じツールメニューで、プロセッサをに設定します ATmega328P(旧 ブートローダー )。

    プロセッサー

  6. 以下に添付されているコードをダウンロードして、ArduinoIDEに貼り付けます。クリックしてください アップロード マイクロコントローラボード上のコードを書き込むためのボタン。

    アップロード

コードをダウンロードするには、 ここをクリック。

ステップ7:コードを理解する

このプロジェクトで使用されるコードは非常に単純で、非常によくコメントされています。添付フォルダには2つのコードファイルがあります。送信機側のコードと受信機側のコードは別々に記載されています。これらのコードをそれぞれのArduinoボードの両方にアップロードします。自明ですが、以下に簡単に説明します。

送信機側のコード

1.開始時に、超音波センサーに接続されるArduinoボードのピンが初期化されます。次に、コードの実行時に時間と距離を計算するための値を格納するために使用される変数が宣言されます。

//ピン番号を定義しますconstint trigPin = 9; //超音波センサーのトリガーピンをArduinoのピン9に接続しますconstint echoPin = 10; //超音波センサーのエコピンをArduinoのピン10に接続します//変数を長時間定義します; //超音波ttravel intdistanceにかかる時間を保存する変数。 //計算された距離を格納する変数

2.2。 void setup() ボードの電源がオンになったとき、またはイネーブルボタンが押されたときに、起動時に1回だけ実行される機能です。ここでは、Arduinoの両方のピンが次のように使用されることが宣言されています 入力 そして 出力 。この関数では、ボーレートが設定されます。ボーレートは、マイクロコントローラーが超音波センサーと通信する速度(ビット/秒)です。

void setup(){pinMode(trigPin、OUTPUT); // trigPinを出力として設定しますpinMode(echoPin、INPUT); // echoPinを入力Serial.begin(9600);として設定します。 //シリアル通信を開始します}

3.3。 void loop() ループで何度も実行される関数です。ここでは、マイクロコントローラーをコーディングして、超音波センサーのトリガーピンにHIGH信号を送信し、20マイクロ秒待機し、LOW信号を送信するようにしました。

void loop(){// trigPinをHIGH状態に10マイクロ秒間設定しますdigitalWrite(trigPin、HIGH); //最初のセンサーdelayMicroseconds(10);のトリガーでHIGH信号を送信します。 // 10マイクロ秒待つdigitalWrite(trigPin、LOW); // LOW信号を最初のセンサーdelay(2);のトリガーに送信します。 //0.2秒待ちます}

受信側のコード

1.開始時に、超音波センサーに接続されるArduinoボードのピンが初期化されます。次に、コードの実行時に時間と距離を計算するための値を格納するために使用される変数が宣言されます。

//ピン番号を定義しますconstint trigPin = 9; //超音波センサーのトリガーピンをArduinoのピン9に接続しますconstint echoPin = 10; //超音波センサーのエコピンをArduinoのピン10に接続します//変数を長時間定義します; //超音波ttravel intdistanceにかかる時間を保存する変数。 //計算された距離を格納する変数

2.2。 void setup() ボードの電源がオンになったとき、またはイネーブルボタンが押されたときに、起動時に1回だけ実行される機能です。ここでは、Arduinoの両方のピンがINPUTおよびOUTPUTとして使用されるように宣言されています。この関数では、ボーレートが設定されます。ボーレートは、マイクロコントローラーが超音波センサーと通信する速度(ビット/秒)です。

void setup(){pinMode(trigPin、OUTPUT); // trigPinを出力として設定しますpinMode(echoPin、INPUT); // echoPinを入力Serial.begin(9600);として設定します。 //シリアル通信を開始します}

3.3。 void Trigger_US() は、2番目の超音波センサーのトリガーピンのフェイクトリガーに対して呼び出される関数です。両方のセンサーのトリガーピンのトリガー時間を同期します。

void Trigger_US(){//米国のセンサーの偽のトリガーdigitalWrite(trigPin、HIGH); // 2番目のセンサーのトリガーピンにHIGH信号を送信しますdelayMicroseconds(10); // 10マイクロ秒待つdigitalWrite(trigPin、LOW); // LOW信号をトリガーピンの2番目の送信機に送信します}

四。 void Calc() 超音波信号が最初のセンサーから2番目のセンサーに移動するのにかかる時間を計算するために使用される関数です。

void Calc()//超音波が移動するのにかかる時間を計算する関数{duration = 0; //最初にゼロに設定された期間Trigger_US(); // Trigger_US関数を呼び出しますwhile(digitalRead(echoPin)== HIGH); // eoピンのステータスが高delay(2); // 0.2秒の遅延を設定しますTrigger_US(); // Trigger_US関数を呼び出しますduration = pulseIn(echoPin、HIGH); //かかった時間を計算します}

5.ここで void loop() 関数では、超音波信号が最初のセンサーから2番目のセンサーに移動するのにかかる時間を使用して距離を計算しています。

void loop(){Pdistance = distance; Calc(); // Calc()関数を呼び出しますdistance = duration * 0.034; //超音波がカバーする距離を計算するif(Pdistance == distance || Pdistance == distance + 1 || Pdistance == distance-1){Serial.print( 'Measured Distance:'); //シリアルモニターに出力Serial.println(distance / 2); //シリアルモニターに出力} // Serial.print( 'Distance:'); //Serial.println(distance/2); delay(500); //0.5秒待ちます}