工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduino HC-SR04 超音波距離センサー 完全チュートリアル

このチュートリアルでは、HC-SR04 超音波センサーの仕組みと Arduino での使用方法を学びます。これは Arduino で距離測定や障害物回避ロボットの作成に最も人気のあるセンサーです。

私はすでに HC-SR04 超音波センサーを使用していくつかのクールな Arduino プロジェクトを作成してきました。ご覧ください:

  • Arduino レーダー(ソナー)
  • 距離測定器&デジタル水準器
  • セキュリティ&アラームシステム プロジェクト
  • Arduino アリ型ヘキサポッドロボット

以下の動画をご覧いただくか、書面によるチュートリアルをお読みください。仕様、ピン配列、配線図、コードなど、センサーに関する追加情報と例が含まれています。

HC-SR04 ハードウェア概要

HC-SR04 は 2cm〜400cm(約 1 インチ〜13 フィート)の範囲で測定できる、安価で使いやすい距離測定センサーです。

センサーは 2 つの超音波トランスデューサーで構成されています。1 つは超音波パルスを出力する送信機、もう 1 つは反射波を受信する受信機です。これは潜水艦で水中物体を検出するために使用される SONAR と基本的に同じ原理です。

Arduino HC-SR04 超音波距離センサー 完全チュートリアル

主な仕様は以下の通りです:

動作電圧5V DC
動作電流15mA
動作周波数40KHz
最小測定距離2cm / 1インチ
最大測定距離400cm / 13フィート
精度3mm
測定角度15°未満
寸法45 x 20 x 15mm

HC-SR04 超音波センサー ピン配列

センサーのピン配列は以下の通りです:

Arduino HC-SR04 超音波距離センサー 完全チュートリアル

センサーには 4 本のピンがあります。VCC と GND は Arduino の 5V と GND ピンに接続し、Trig と Echo は任意の Arduino デジタルピンに接続します。Trig ピンで送信機から超音波を送信し、Echo ピンで反射信号を受信します。

HC-SR04 超音波距離センサーの仕組み

40,000 Hz の超音波を放出し、それが空気中を伝播して経路上に物体や障害物があるとモジュールに跳ね返ります。伝播時間と音速を考慮して距離を計算できます。

Arduino HC-SR04 超音波距離センサー 完全チュートリアル

超音波を生成するには、Trig ピンを 10 µs 間ハイ状態に設定する必要があります。これにより 8 サイクルの超音波バーストが送信され、音速で伝播します。Echo ピンは 8 サイクルの超音波バーストが送信されると即座にハイになり、物体からの反射波を待機・聴取し始めます。

物体や反射パルスがない場合、Echo ピンは 38ms 後にタイムアウトしてロー状態に戻ります。

Arduino HC-SR04 超音波距離センサー 完全チュートリアル

反射パルスを受信した場合、Echo ピンは 38ms より早くローになります。Echo ピンがハイだった時間の長さに基づいて、音波が移動した距離、つまりセンサーから物体までの距離を特定できます。

そのために以下の基本的な距離計算式を使用します:

距離 = 速度 × 時間

速度と時間の両方の値は既知です。時間は Echo ピンがハイだった時間、速度は音速の 340m/s です。さらに 1 つの手順が必要で、最終結果を 2 で割ります。これは音波が物体まで到達して跳ね返ってくる往復の時間を測定しているためです。

Arduino HC-SR04 超音波距離センサー 完全チュートリアル

Echo ピンが 2ms ハイだったとしましょう。距離を cm で求める場合、音速を 340m/s から 34cm/ms に変換できます。

距離 = (速度 × 時間) / 2 = (34cm/ms × 1.5ms) / 2 = 25.5cm。

つまり、Echo ピンが 2ms ハイだった場合(pulseIn() 関数で測定)、センサーから物体までの距離は 34cm です。

HC-SR04 超音波センサーを Arduino に接続する方法

HC-SR04 センサーを Arduino ボードに接続する方法は以下の通りです。

Arduino HC-SR04 超音波距離センサー 完全チュートリアル

モジュールの GND と VCC ピンをそれぞれ Arduino ボードの GND と 5V ピンに接続し、Trig と Echo ピンを Arduino ボードの任意のデジタル I/O ピンに接続します。

このチュートリアルに必要なコンポーネントは以下のサイトから入手できます:

  • 超音波センサー HC-SR04
  • Arduino ボード
  • ブレッドボードとジャンパワイヤ

HC-SR04 超音波センサー Arduino コード

HC-SR04 超音波センサーと Arduino を使用して距離を測定するコードです。

/* Ultrasonic Sensor HC-SR04 and Arduino Tutorial by Dejan Nedelkovski, www.HowToMechatronics.com */
// ピン番号を定義
const int trigPin = 9;
const int echoPin = 10;
// 変数を定義
long duration;
int distance;

void setup() {
  pinMode(trigPin, OUTPUT); // trigPin を出力に設定
  pinMode(echoPin, INPUT);  // echoPin を入力に設定
  Serial.begin(9600); // シリアル通信を開始
}

void loop() {
  // trigPin をクリア
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // trigPin を 10 マイクロ秒ハイ状態に設定
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // echoPin を読み取り、音波伝播時間をマイクロ秒で取得
  duration = pulseIn(echoPin, HIGH);
  // 距離を計算
  distance = duration * 0.034 / 2;
  // シリアルモニターに距離を表示
  Serial.print("Distance: ");
  Serial.println(distance);
}

コードの説明

まず Trig と Echo ピンを定義します。この場合、Arduino ボードの 9 番と 10 番ピンで、trigPin と echoPin と名付けます。次に、センサーから取得する伝播時間用の Long 変数「duration」と、距離用の整数変数が必要です。

// ピン番号を定義
const int trigPin = 9;
const int echoPin = 10;
// 変数を定義
long duration;
int distance;

setup では trigPin を出力、echoPin を入力に定義し、結果をシリアルモニターに表示するためにシリアル通信を開始します。

void setup() {
  pinMode(trigPin, OUTPUT); // trigPin を出力に設定
  pinMode(echoPin, INPUT);  // echoPin を入力に設定
  Serial.begin(9600); // シリアル通信を開始
}

loop ではまず trigPin がクリアされていることを確認するため、そのピンをわずか 2 µs だけロー状態に設定します。超音波を生成するために trigPin を 10 µs ハイ状態に設定します。

// trigPin をクリア
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// trigPin を 10 マイクロ秒ハイ状態に設定
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

pulseIn() 関数を使用して伝播時間を読み取り、その値を変数「duration」に格納します。この関数には 2 つのパラメータがあり、1 つ目は Echo ピンの名前、2 つ目は読み取るパルスの状態(High または Low)です。

// echoPin を読み取り、音波伝播時間をマイクロ秒で取得
duration = pulseIn(echoPin, HIGH);

この場合、送信機から 8 サイクルの超音波バーストが送信された後、HC-SR04 センサーが Echo ピンをハイに設定するため、HIGH に設定する必要があります。これによりタイミングが開始され、反射音波を受信すると Echo ピンがローになりタイミングが停止します。最終的に関数はパルスの長さをマイクロ秒で返します。

距離を求めるには、前述の式のように duration に 0.034 を掛けて 2 で割ります。

// 距離を計算
distance = duration * 0.034 / 2;
// シリアルモニターに距離を表示
Serial.print("Distance: ");
Serial.println(distance);

最後に距離の値をシリアルモニターに表示します。

Arduino 超音波センサーと LCD ディスプレイの例

超音波センサーを Arduino で使用し、結果を LCD に表示するもう 1 つの例です。

Arduino HC-SR04 超音波距離センサー 完全チュートリアル

超音波センサーと LCD を以下のように接続できます:

Arduino HC-SR04 超音波距離センサー 完全チュートリアル

距離測定のコードは基本例とほぼ同じです。ここではシリアルモニターではなく LCD に結果を表示します。LCD の Arduino との接続・使用方法の詳細については、私の専用チュートリアルをご覧ください。

/* Ultrasonic Sensor HC-SR04 and Arduino Tutorial by Dejan Nedelkovski, www.HowToMechatronics.com */
#include <LiquidCrystal.h> // LiquidCrystal ライブラリをインクルード
LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // LCD オブジェクトを作成。パラメータ: (rs, enable, d4, d5, d6, d7)
const int trigPin = 9;
const int echoPin = 10;
long duration;
int distanceCm, distanceInch;

void setup() {
  lcd.begin(16, 2); // LCD 画面を初期化し、寸法(幅と高さ)を指定
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distanceCm = duration * 0.034 / 2;
  distanceInch = duration * 0.0133 / 2;
  lcd.setCursor(0, 0); // 表示位置を設定
  lcd.print("Distance: "); // 文字列 "Distance" を LCD に表示
  lcd.print(distanceCm); // センサーからの距離値を表示
  lcd.print(" cm");
  delay(10);
  lcd.setCursor(0, 1);
  lcd.print("Distance: ");
  lcd.print(distanceInch);
  lcd.print(" inch");
  delay(10);
}

NewPing ライブラリを使用したサンプルコード

実は、HC-SR04 超音波センサーを使用して Arduino で距離を測定するよりシンプルで優れた方法があります。それが NewPing ライブラリを使用する方法です。

前述のコードではセンサーを手動でトリガーし、受信信号のパルス持続時間を測定しました。その結果に基づいて距離を計算しました。NewPing ライブラリを使用すると、わずか 1 行のコードで距離を取得できます。

サンプルコード:

#include <NewPing.h>
#define TRIGGER_PIN 9
#define ECHO_PIN 10
#define MAX_DISTANCE 400 // 測定したい最大距離(センチメートル)
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // ピンと最大距離で NewPing をセットアップ

void setup() {
  Serial.begin(9600);
}

void loop() {
  delay(50); // ピング間 50ms 待機(約 20 ピング/秒)。ピング間の最短遅延は 29ms。
  int distance = sonar.ping_cm(); // ピングを送信し、距離を cm で取得して結果を表示(0 = 設定距離範囲外)
  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println("cm");
}

前の例よりもはるかにシンプルです。NewPing の sonar オブジェクトで ping_cm() メソッドを呼び出すだけで、センチメートル単位の距離が取得できます。インチ単位で距離が必要な場合は ping_in() を使用できます。

このライブラリには他にもいくつかの便利な機能があります。例えば、ping_median(iterations [, max_cm_distance]) メソッドを使用すると、複数回の測定から中央値(中間値)を取得することでより正確な結果が得られます。iterations パラメータで、中央値の計算に使用するサンプル数を設定します。デフォルト値は 5 回です。ping_median() は受信パルス持続時間をマイクロ秒で返します。

詳細については NewPing のウィキページをご確認ください。

DHT22 温度センサーを使用した HC-SR04 距離センサー精度の向上

HC-SR04 センサーはかなり正確ですが、その動作が音速に依存するため、より正確な結果を得るには気温も考慮する必要があります。音速は気温の変化によって大きく変わります。例えば、20°C では音速は約 340m/s ですが、-20°C では約 315m/s です。相対湿度も音速に影響します。

したがって、このセンサーを様々な温度で距離測定に使用する場合は温度補正を実装すべきです。以下の式で行えます:

速度 = 331.4 + 0.6 × 温度 + 0.0124 × 相対湿度

例:

Arduino HC-SR04 超音波距離センサー 完全チュートリアル

HC-SR04 超音波センサーとともに、DHT11 / DHT22 センサーを使用して環境の温度と湿度を測定し、音速の値をそれに応じて調整します。

Arduino コード

/* Example made by Dejan, How To Mechatronics, https://howtomechatronics.com/ */
#include <NewPing.h> // https://bitbucket.org/teckel12/arduino-new-ping/wiki/Home
#include "dht.h" // https://github.com/RobTillaart/DHTlib
#define TRIGGER_PIN 9
#define ECHO_PIN 10
#define MAX_DISTANCE 400
#define dht22 5 // DHT22 温度湿度センサー
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
dht DHT; // DHT オブジェクトを作成
int readDHT, temp, hum;
float speedOfSound, distance, duration;

void setup() {
  Serial.begin(9600);
}

void loop() {
  delay(100);
  // DHT22 センサーから温度と湿度を読み取り
  readDHT = DHT.read22(dht22); // センサーからデータを読み取り
  temp = DHT.temperature; // 温度値を取得
  hum = DHT.humidity;   // 湿度値を取得
  speedOfSound = 331.4 + (0.6 * temp) + (0.0124 * hum); // 音速を m/s で計算
  duration = sonar.ping_median(10); // 10 回反復 - マイクロ秒で持続時間を返す
  duration = duration / 1000000; // マイクロ秒を秒に変換
  distance = (speedOfSound * duration) / 2;
  distance = distance * 100; // メートルをセンチメートルに変換
  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println("cm");
}

まず DHT22 センサーから温度と湿度の値を読み取り、それらの値を使用して音速を計算します。次に音波の伝播時間をマイクロ秒で取得し、秒に変換して、センサーから物体までの距離をセンチメートルで計算します。

HC-SR04 寸法と 3D モデル

次のプロジェクトで必要な場合に備えて、HC-SR04 超音波センサーの 3D モデルを作成しました。以下のリンクからダウンロードできます。

Arduino HC-SR04 超音波距離センサー 完全チュートリアル

この 3D モデルは Thangs で見つけてダウンロードできます。

HC-SR04 センサーの寸法は以下の通りです:

Arduino HC-SR04 超音波距離センサー 完全チュートリアル

メーカーによってわずかに異なる場合があることにご注意ください。

まとめ

HC-SR04 超音波センサーを Arduino で使用するために知っておくべきことはほぼすべてカバーしました。非接触での距離測定、物体の存在検出や検知、レベルや位置の測定などが必要な多くの DIY 電子工作プロジェクトに最適なセンサーです。

冒頭でこのセンサーを使用した私のプロジェクトをいくつか紹介しました。HC-SR04 センサーと Arduino を使用したその他のクールなプロジェクトをいくつかご紹介します:

  • タッチレス自動モーションセンサー ゴミ箱
  • ハンドジェスチャー スマートライト制御
  • ミニ音響浮上
  • 障害物回避ロボット

このチュートリアルを楽しんでいただき、新しいことを学んでいただけたなら幸いです。質問があれば下のコメント欄で自由にお尋ねください。また、私の 30 以上の Arduino プロジェクトコレクションもぜひチェックしてみてください。

製造プロセス

  1. HC-SR04超音波距離センサーをRaspberry Pi 3に接続 – 完全ガイド
  2. HC-SR04超音波センサーをRaspberry Piに接続する実践ガイド
  3. DHT11温湿度センサーで作る温度アラート – LEDとピエゾブザーで視覚/聴覚通知
  4. FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
  5. ESP8266・Arduino・超音波センサーで作るスマートIoTジャー:リアルタイム中身監視
  6. コンパクトなArduinoレーダーシステム – HC-SR04超音波センサー & 1.8インチST7735ディスプレイ搭載
  7. Arduino UNOとSR04超音波センサーで作る距離測定器 – 入門ガイド
  8. Arduino超音波距離・温度モニター:LCD表示とアラーム機能付き水位監視システム
  9. MKR1000 + DHT22: 温湿度データをAzureへリアルタイム送信
  10. HC-SR04超音波センサー:仕組みと主要応用
  11. Arduinoセンサー:種類、応用、実世界プロジェクト