超音波距離計hc sr04. 超音波距離計HC-SR04を接続。 何に注意するか

多くの人が最初に使用するセンサーは、 赤外線センサー. 実行は非常に簡単で、文字通りいくつかの要素で作成できます。 赤外線ダイオード (テレビのリモコンなど)、このダイオード用のある種の受信機 (TSOP シリーズなど)、いくつかの抵抗器、および単純な距離センサーを手にすることができます。

センサーには 4 本のワイヤがあります。 これにより、超音波センサーが作成され、障害物から反射されたときにセンサーに戻ります。 依存関係を使用して距離を計算できます。 出力アンプは、超音波送信機を駆動するために使用されます。 モジュールには 1 列の 4 ピン コネクタが装備されています。モジュールの出力は表に記載されています。

両方の信号が低いです。 モジュールのマイクロコントローラーは、40 kHz の周波数で 8 つの超音波パルスのバーストを放出し、エコー ラインを確立します。 この 重要な情報モジュールの説明ではしばしば無視されます。 通常、数センチメートルから2メートルまでの距離を測定するために使用します。

私は逆に行くことに決め、未来のロボットのための最初の「感覚器官」が選ばれました 超音波距離計 HC-SR04.

説明HC-SR04

HC-SR04- これらは、同じ基板上に配置された超音波信号の受信機と送信機です。 実際、スピーカーとマイクは、人間の耳には聞こえない超音波専用です。 受信機と送信機自体に加えて、ボードには、このセンサーを簡単かつ簡単に操作するために必要なハーネスも含まれています。

センサーとマイコンの連携

距離センサーの一般的な用途には、1 ~ 20 Hz の一定周波数での距離測定が含まれます。 経験上、リセット パルスの持続時間は 30 ms 以上にする必要があります。 エコー出力のパルス幅を測定するには、パルス幅を測定するか、両方の入力をキャプチャするようにプログラムされたキャプチャ モードのタイマー チャネルを使用します。 したがって、1 つのタイマーを使用して近接センサーを制御できます。 チャネルの 1 つのペアは、エコー ラインで動作するために使用されます。

センサーの消費電力は低く、これは電源コンセントに接続されていない移動ロボットの場合にも重要なパラメーターです。 HC-SR04は5V駆動で、arduinoと接続する際にも便利です。


センサーの動作原理は非常に単純です。マイクロコントローラーがデータを受信する必要があることを伝えると (これを行う方法については後で説明します)、センサーは超音波信号を生成し、「リッスン」を開始します。 任意のオブジェクトから反射された信号がセンサーに戻ると、HC-SR04 は論理ユニットをマイクロコントローラーに送信し、コントローラー次第です。 ポイントは、信号が戻ってくるまでの時間を測定し、簡単な計算を使用して距離を取得できることです。
HC-SR04 には 4 つのピンがあります。 それらのうちの2つ(端にある)は、マイクロ回路の電源です(VCCとGNDで示されます)。 真ん中: 1 つのトリガー コンタクト (trig とマーク) と 2 番目のコンタクト Echo (Echo とマークされています。申し訳ありませんが、それを呼び出す方法がわかりませんでした)。

デモ プログラムは固定レートで距離測定を実行し、シリアル ポート経由で結果を送信します。 DMA は、シリアル ポートをサポートするために使用されます。 ソフトウェアイベントループのない構造で実装されました。 タイマーが中断されると、距離測定に関連するすべてのステップが実行されます。

タイマー期間は、測定期間を決定します。 割り込みの唯一のソースは、タイマーのチャネル 1 です。 すべての周波数と同様に、その周辺全体がアクティブです。 タイマーシーケンスをプログラミングするとき。 タイマーがプログラムされた後、タイマー割り込みをオンにし、例外ハンドラーの終了時にプロセッサのスリープ モードをオンにして、プロセッサをスリープ状態にします。

どこで買えますか?
個人的に、私はebayで注文しました.2つのそのようなセンサー(2つのボード)は配送料で9ドルかかりました. 組み合わせるアイデアがあったので、2つ取りました。

HC-SR04の使い方は?

もっと興味深い質問、つまり「これをarduinoにねじ込む方法は?」に移りましょう。
私がするすべてのことと同じように、それはとてもシンプルです。 唯一のことは、デモンストレーションに LED も使用したことです。これはまったく必要な部分ではありませんが、それでもすべてを正確に繰り返すことにした場合は、LED と 470 オームの抵抗をつかみます (私は 510 オームを使用しましたが、実際には使用しませんでした)。このような大きな違いがあっても、結果は同じになります)。 センサーに何かを近づけると、LED はどんどん明るく点灯します。 私のスキーマは次のようになります。

タイマー割り込みルーチン

タイマー割り込みルーチンは、各エコー条件が検出されるたびに、各測定周期で 2 回呼び出されます。 測定サイクルの最初の状態変化は 0 から 1 への変化であり、2 回目は 1 から 1 への変化であると仮定します。 測定期間中のエコーラインの状態の最初の変化に対するソフトウェアの応答は、次のもので構成されます。

測定期間中にエコー ラインの状態が 2 回目に変化すると、変化の時刻がエコー変数に格納されます。 装置の電源を入れた直後は、センサーの動作で 1 回または 2 回の測定サイクルが発生する場合があります。 障害物検出器からの距離は、データを確認した後にのみ計算されます。 センサーの解像度は 1 cm よりも優れているため、距離の単位は mm と見なされます。 記録された 2 番目の変更時間がリセットパルスの開始に対応する場合、実際のセンサーの範囲までの最大距離が想定されます。

ここで何が行われましたか?

  1. ブレッドボード電源 (赤と黒のワイヤ)。 センサーに電源が供給されます。 さらに、カソード(ダイオードのショート端子)はグランドに接続されています。
  2. 黄色のワイヤで、ダイオードは PWM (PWM) ピン番号 9 に接続されています。このワイヤを介して、ダイオードに電圧を印加します。 この電圧の大きさに応じて、ダイオードはこの照明の強度を変更します。 ダイオードは抵抗を介して接続する必要があります 必要な。そうしないと、ダイオードだけでなく Arduino も台無しにする危険があります。 抵抗器は、ダイオードを流れる電流を許容値に制限するために必要です。 事実、ダイオードの内部抵抗は非常に低く、抵抗を使用しないと、そのような電流がダイオードに流れ、ダイオードとコントローラーの両方が単純に焼損します。
  3. 白いワイヤーは、片側のセンサーのトリガーと10番目に接続されています Arduino出力メガ (任意のデジタル出力を使用できます)。 それを通じて、弊社コントローラーからHC-SR04に「リクエスト」が送られます。
  4. 緑色のワイヤは、Arduino の 11 番目のピンを接続します (任意のデジタル 入力) とセンサーのエコー レッグ。 この入力で、マイクロコントローラーはセンサーからの信号を待ちます。


それ以外の場合、距離は、エコー ラインで記録されたパルス長 (エコー変数と ping 変数の差) に基づいて計算されます。 タイマー割り込みハンドラで距離を決定した後、距離は 4 桁のテキスト形式に変換されます。

技術の進歩により、以前は完全に手作業だった自動化された一連の活動が自動化される可能性があります。 この開発の最も重要な利点として挙げられるのは、リスクの高い地域に人々が関与することがますます少なくなるため、人類の安全性が高まることです。 言い換えれば、技術の進化は現代社会の発展を生み出し、促進します。



スキームはこれまでになくシンプルです。 しかし、将来的にはもっと多くのことを説明する予定です 複雑なスキーム私はそれらを自分で理解します。 ソフトウェア部分に移りましょう。

コントローラーのファームウェア

ロジックは非常に単純です。センサーを使用して障害物までの距離を測定し、この距離が短いほど、LED のレベルが高く設定されます。 言葉から行動まで、コード:

この記事の目的は、構築およびプログラムされた迷路をロボットがどのように設計および探索したかを示すことです。 環境を探索してそのマップを作成できるロボットのプロトタイプの作成に成功したら、新しい機能を追加してロボットを拡張すると、たとえば掃除機に変身します。 環境は迷路であり、迷路内の任意の 2 点からの最短経路を決定できるツールです。 その寸法により、人がアクセスできないスペースを探索できます。

Int ledPin = 9 ; int trigPin = 10 ; int echoPin = 11 ; 長距離; int ledLevel; void setup() ( pinMode(trigPin,OUTPUT); pinMode(echoPin,INPUT); ) void loop() ( distance = getDistance(); ledLevel = (int ) (distance*10 )<=255 ?255 -distance*10 :0 ; analogWrite(ledPin, ledLevel); delay(50 ); } long getEchoTiming() { digitalWrite(trigPin, LOW); delayMicroseconds(2 ); digitalWrite(trigPin, HIGH); delayMicroseconds(10 ); digitalWrite(trigPin, LOW); long duration = pulseIn(echoPin,HIGH); return duration; } long getDistance() { long distacne_cm = getEchoTiming()/29 /2 ; return distacne_cm; }

送信するデータは、ユーザーフレンドリーな 3D 環境を提供できる別の高レベル アプリケーションによって受信側で解釈される必要があります。 この決定は、非常に単純な理由で行われました。 将来的に大きな変更を加えることなく、ロボットの機能を可能な限り拡張できるようにしたいと考えています。 組み込みアプリケーションの開発では、使用するハードウェア プラットフォームの制限も考慮する必要があることを忘れないでください。 次に、2 つのオブジェクトのそれぞれのアーキテクチャと操作について説明します。組み込みロボットに重点を置き、パートナー デバイスには重点を置きません。

標準のArduino IDEパッケージには含まれていませんが、実際に存在するサードパーティのライブラリを使用しないことにしました。 私は意図的にそれを行いました - これにより、センサー自体がどのように機能するかをよりよく理解できます。
関数について説明しましょう。

  • 設定() - ここではすべてが非常に単純です。ピン番号 10 が出力として使用され、レグ番号 11 が入力として使用されることをコントローラーに示すだけです。 レグ番号 9 を指定する必要はありません。これは、最初はこのモード (PWM 出力) での使用を意味するためです。 力がある場合は、PWM(またはPWM)について個別に説明します。 今のところ、これを 0 ~ 5 ボルトの電圧に設定できる出力として考えてください。
  • getEchoTiming() は、すべての魔法が発生する最も興味深い関数です。 まず、トリガーを論理ゼロに設定します (digitalWrite(trigPin, LOW); )。 これは、プログラムの他の部分が (おそらく偶然に) このピンに論理ユニットを設定していないことを確認するために行われます。 その後、2 マイクロ秒 (非常に短い) 待機します。 delayMicroseconds( 2 ); しかし、いわば「ゼロから始める」にはこれで十分です。 その後、ロジック 1 を 10 マイクロ秒に設定します ( digitalWrite(trigPin、HIGH); 遅延マイクロ秒 (10); digitalWrite(trigPin、LOW);)。 電源を入れ、10 マイクロ秒待ってから、電源を切ります。 センサーの仕様によると、これはまさにトリガーの最小パルス持続時間であり、その後超音波信号が生成されます。 その後、「空気を聞く」長い期間 = pulseIn(echoPin,HIGH); を開始します。 pulseIn(...) 関数は、指定された入力 (この場合、これは入力番号 11) に論理値 1 が現れた後、マイクロ秒単位で long 値を返します。 入力 11 に論理 1 が現れるとすぐに、このメソッドは信号が返されたマイクロ秒数を返します。
  • getDistance() はかなり単純な関数です。 センサーの前にあるオブジェクトまでの距離をセンチメートル単位で返します。 これを行うために、先ほど説明した getEchoTiming() から値を取得します。 そしてそれを音速で割ります。 空気中の音速は温度に依存することは注目に値しますが、私は温度センサーを持っていないので、このエラーを無視しました。 音速で割るだけでなく、センサーからの超音波が障害物までの距離を超えて戻ってくるため、値も 2 で割られます。
  • loop() は、Arduino でプログラミングする際の標準で必須のメソッドです。 周期的に実行されます (終了後は常に最初から開始されます)。 その中でも、すべてが簡単です。 距離を取得する distance = getDistance(); 、その後、LEDに適用するレベルが計算されます ledLevel = ( int ) (距離*10 )<=255 ?255 -distance*10 :0 ; . arduino のアナログ レベルが 0 ~ 255 の値として設定されていることは、すぐに言及する価値があります。ご覧のとおり、距離を 10 倍してミリメートルに変換しています。 これはより明確にするために行われたものであり、それ以上のものではありません。 LED のレベルを取得したら、すぐに出力番号 9 に設定します。 analogWrite(ledPin、ledLevel); loop() 関数の次の開始まで 50 ミリ秒待機します。

以上で、プログラムの準備は完了です。

デバイスの概略図

私たちはリアルタイムのアプリケーションを扱っているので、ハードウェア層と私たちが書くコードの間にオペレーティング システムがあればいいと思います。 概要を説明した後、各デバイスの接続と構成について簡単に説明します。

2 つのデバイスは、このテクノロジを使用してワイヤレスで通信します。 相互に接続されたデバイスのプールでは、1 つのマスター デバイスと 1 つまたは複数のスレーブ デバイスが必要であることが規格で規定されています。 このジョブは、マスターをロボットとして、スレーブを電話として定義します。

立ち上げます
実際には、USB ケーブルを Arduino に接続し、上記のファームウェアをコントローラーにアップロードして、実験を開始するだけです。

命令

同時にマスターに接続して通信できるスレーブデバイスの数。つまり、複数の電話を使用してロボットを注文できます。 パリティ ビットがなく、ストップ ビットが 1 つしかないため、データ伝送でエラーが発生する可能性が高くなります。 これには、受信側で受信したパケットを修正できるメカニズムを作成する必要があります。

ロボットに接続された 2 つの DC モーターは、入力電圧を 2 つの出力に均等または異なる方法で分割できる集積回路ドライバーによって命令されます。 図 3: モーター ドライバーの接続。 この問題は、ソフトウェアによって何らかの方法で解決されます。 図 3 は、ドライバの接続方法を示しています。

超音波距離計HC-SR04の動作は、エコーロケーションの原理に基づいています。 音のパルスを空間に放出し、障害物から反射された信号を受信します。 物体までの距離は、音波が障害物に到達して戻ってくるまでの伝搬時間によって決まります。
音波の開始は、距離計の TRIG 脚で少なくとも 10 マイクロ秒の持続時間を持つ正のパルスで始まります。 パルスが終了するとすぐに、距離計は 40 kHz の周波数の音パルスのバーストをその前の空間に放出します。 同時に、反射信号の遅延時間を決定するためのアルゴリズムが起動され、距離計の ECHO レッグに論理ユニットが表示されます。 センサーが反射信号を拾うとすぐに、論理ゼロが ECHO ピンに表示されます。 この信号の持続時間 (図の「エコー遅延」) によって、物体までの距離が決まります。
HC-SR04 レンジファインダー距離測定範囲は、分解能 0.3 cm で最大 4 メートル、観測角度は 30 度、有効角度は 15 度です。 スタンバイモードでの消費電流 2 mA、動作中 - 15 mA。

超音波距離センサー

最後の主要な機器は超音波センサーです。 センサーは接触せず、エコロケーションの原理で動作します。 障害物までの距離を約 3 mm の精度で測定でき、下限は 2 cm、上限は 4 m です。

調査アルゴリズムの説明

図 4: フロント超音波トランスデューサの接続。 もちろん、別のピンを使用して、他のセンサーも同様の方法で接続されます。 それらの間のすべてのハードウェア モジュールを接続したら、ソフトウェアの一部を提示し、環境探査で使用されるアルゴリズムを提示することに進むことができます。 サーボモーターが搭載されていないため、特にコーナーでシビアなシフト操作が必要な場合は動きにくくなります。 これにより、直進、交差点での右折、または戻りに複雑なアルゴリズムが必要になります。

超音波距離計は +5 V で駆動されます。他の 2 つのピンは任意の Arduino デジタル ポートに接続されており、11 と 12 に接続します。



では、障害物までの距離を決定し、それをシリアル ポートに出力するスケッチを書きましょう。 まず、TRIG と ECHO のピン番号を設定します。これらはピン 12 と 11 です。 次に、トリガーを出力として宣言し、エコーを入力として宣言します。 シリアル ポートを 9600 ボーで初期化します。 サイクルの各反復で ループ()距離を読み取り、ポートに出力します。
関数 getEchoTiming()スタートパルスを発生します。 インパルスあたり 10 マイクロ秒の電流を生成するだけで、距離計が音のパケットを空間に放出し始めるトリガーとなります。 それから彼女は音波の伝達の開始から反響の到着までの時間を覚えています。
関数 getDistance()物体までの距離を計算します。 学校の物理の授業で、距離は速度×時間に等しいことを覚えています: S = V * t. 空気中の音速は 340 m/s で、私たちが知っているマイクロ秒単位の時間は「持続時間」です。 秒単位の時間を取得するには、1,000,000 で割ります。 音は距離の 2 倍の距離 (物体に到達して戻ってくる距離) を移動するため、距離を半分に分割する必要があります。 したがって、オブジェクトまでの距離は、S = 34000 cm/秒 * 持続時間 / 1.000.000 秒 / 2 = 1.7 cm/秒 / 100 であることがわかります。これは、スケッチに書いたものです。 マイコンは割り算よりも掛け算の方が早いので、「/ 100」を「* 0.01」に置き換えました。

ロボットに取り付けられたハードウェア モジュールと実装されたアルゴリズムは、最終的にいくつかの制限を課します。これについては、次の段落で説明します。 最初は、サイド センサーが壁を障害物として検出できるように、ロボットを迷路のどこかに配置します。

つまり、車が直進することが想定されている場合、パスの設定はサイドセンサーから受け取った値を使用して行われます。 両輪の応力偏在の問題を解決します。 図 5: まっすぐ歩く。



また、超音波距離計で動作するように多くのライブラリが作成されています。 たとえば、これ: http://robocraft.ru/files/sensors/Ultrasonic/HC-SR04/ultrasonic-HC-SR04.zip。 ライブラリは標準的な方法でインストールされます: ダウンロード、ディレクトリへの解凍 ライブラリ Arduino IDE フォルダにあります。 その後、ライブラリを使用できます。
ライブラリをインストールしたら、新しいスケッチを書きましょう。 その作業の結果は同じです - オブジェクトまでの距離がセンチメートル単位でシリアルポートモニターに表示されます。 スケッチであなたが書いた場合 float dist_cm = 超音波.Ranging(INC);、距離はインチで表​​示されます。

そうしないと、3 つのセンサーによって検出された値が高くなり、アルゴリズムは、出力が検出された最終状態に到達したと見なします。 直線はフロント センサーによって提供される距離に正比例するため、迷路が改善されます。 交差点に近づくとどうなるか見てみましょう。 この場合、軌道を自動的に調整することは不可能であり、道路の短い部分で、車は道路と平行な軌道から逸脱します。

これは、偏差をできるだけ小さくするために、ノード接続をあまり大きくすべきではないという考えにつながります。 私たちは岐路に立っています、私たちは次に何をしますか? 前進する機会があれば、最初にこのオプションを選択します。なぜなら、移動するために交差点のどこで停止すればよいか本当にわからないからです。



そこで、超音波距離計 HC-SR04 を Arduino に接続し、特別なライブラリを使用する場合と使用しない場合の 2 つの異なる方法でデータを受信しました。
ライブラリを使用する利点は、コードの量が大幅に削減され、プログラムの読みやすさが向上し、デバイスの複雑さを掘り下げる必要がなく、すぐに使用できることです。 しかし、これは欠点でもあります。デバイスがどのように機能し、どのようなプロセスがデバイスで行われるかについての理解が不十分です。 いずれにせよ、どの方法を使用するかはあなた次第です。

次に、交差点を見つけたセクションから位置を保存して、回転中に減速して右折できるようにします。 車に必要なロジックとコントロールは携帯電話に搭載されているため、車がどこにあるかを正確に知るには、実際の迷路とその仮想デザインをうまく同期させることが非常に重要です。 図 6: マシンが常に正しい場合、マシンは無限ループに入ります。

また、迷路内の可能なサイクルを考慮する必要があります。 図の場合を考えてみましょう。 この場合、車は指定された位置から移動を開始し、すべての交差点で常に右折すると無限ループに陥ります。 無限ループの問題を解決するには、ギャップに遭遇したり、目に見えない領域に移動したりせずに、同じターンにある交差点にいつ到達するかを理解する必要があります。