注:すべてのOSOYOO製品は、ARDUINOコンテンツと完全に互換性のある第三者ボードです。

コンテンツ

    1. はじめに
    2. 準備
  1. 超音波センサHC-SR04について
  2. 使用例

はじめに

超音波センサは高周波の音パルスを発信し、その音が反射して戻ってくるまでの時間を計るセンサである。センサの前面には2つの開口部がある。一方の開口部は超音波を送信し、もう一方の開口部は超音波を受信します。このレッスンでは、HC-SR04超音波センサーの仕組みと、Osoyoo Unoボードでの使い方を紹介します。

準備

ハードウエア

ソフトウェア

超音波センサHC-SR04について

HC-SR04の特徴

超音波センサーとは?

超音波センサーとは、音波を利用して物体までの距離を測定する装置です。特定の周波数の音波を発信し、その音波が跳ね返ってくるのを聞くことで距離を測定します。音波が発生してから跳ね返ってくるまでの経過時間を記録することで、ソナーセンサーと対象物との距離を算出することができます。

HC-SR04とは?

HC-SR04超音波センサーは、コウモリのようにソナーを使って対象物までの距離を測定します。使いやすいパッケージで、高精度と安定した測定値による優れた非接触距離検出を提供します。2cmから400cm、1インチから13フィートまで。シャープの距離計のように、太陽光や黒い素材の影響を受けません(ただし、布のような音響的に柔らかい素材は検知しにくい場合があります)。超音波トランスミッターとレシーバー・モジュールが付属しています。

超音波距離計の前面には2つの金属製の円筒がある。これらはトランスデューサである。トランスデューサは機械的な力を電気信号に変換する。超音波距離計では、送信トランスデューサーと受信トランスデューサーがあります。送信トランスデューサーは電気信号を超音波パルスに変換し、受信トランスデューサーは反射された超音波パルスを電気信号に戻します。レンジファインダーの背面を見ると、送信トランスデューサーの後ろにMAX3232と書かれたICが見えます。これは送信トランスデューサーを制御するICです。受信トランスデューサーの後ろには、LM324と書かれたICがある。これはクワッドオペアンプで、受信トランスデューサで生成された信号を、Arduinoに送信するのに十分な強度の信号に増幅する。

タイミング図

HC-SR04のタイミングダイアグラムを示します。計測を開始するには、SR04のTrigが10us以上High(5V)のパルスを受信する必要がある。これによりセンサは40kHzで8サイクルの超音波バーストを送信し、反射された超音波バーストを待つ。センサは受信機からの超音波を検出すると、Echo端子をHigh(5V)にし、距離に比例した期間(幅)だけ遅延させる。距離を求めるには、Echo端子の幅(Ton)を測定する。

Time = Width of Echo pulse, in us (micro second)

音速を利用することもできます。音は空気中を約344m/s(1129フィート/s)で伝わることが知られているので、音波が戻ってくるまでの時間をとり、それに344メートル(または1129フィート)をかければ、音波の往復距離を求めることができます。往復距離とは、音波がセンサーに検知されるまでに、対象物までの距離の2倍を移動したことを意味します。ソナーセンサーから対象物までの「移動」と、対象物から超音波センサーまでの「移動」(音波が対象物に跳ね返った後)が含まれます。対象物までの距離を求めるには、単純に往復距離を半分に割る。

時間変数は、超音波パルスがセンサーを出て、物体に跳ね返り、センサーに戻ってくるまでの時間である。物体までの距離を測定するだけで、物体からセンサーまでの往復距離を測定する必要はないので、実際にはこの時間を半分に分割する。速度変数は、音が空気中を伝わる速度である。

空気中の音速は温度や湿度によって変化する。したがって、距離を正確に計算するためには、周囲の温度と湿度を考慮する必要がある。温度と湿度を考慮した空気中の音速の計算式は以下の通りです:

For example, at 20 °C and 50% humidity, sound travels at a speed of:

注意事項

超音波センサーの精度は、使用する空気の温度と湿度に影響されることがあります。しかし、これらのチュートリアルや、これらのセンサーを使用するほとんどのプロジェクトでは、精度のこの変化は無視できます。
超音波センサーで検出できない物体があることを理解することが重要です。これは、物体の形状や位置によっては、音波が物体に当たって跳ね返っても、超音波センサーから逸れてしまうからです。また、物体が小さすぎて音波をセンサーに反射させることができず、検出できないこともある。また、音波を吸収してしまう物体(布、カーペットなど)もあります。これらは、超音波センサーを使用するロボットを設計・プログラミングする際に考慮すべき重要な要素です。

超音波センサHC-SR04を使用してシリアルモニタから距離を読み取る

まずは簡単な超音波距離計でシリアルモニタへの出力距離を測定する。

接続方法

超音波距離計HC-SR04には4つのピンがある: Vcc、Trig、Echo、GNDである。Vccピンは超音波パルスを生成するための電源を供給する。GNDピンはグランドに接続されている。Trigピンは、Arduinoが超音波パルスを開始する信号を送る場所である。Echoピンは超音波距離計が超音波パルスによって移動した時間の情報をOsoyoo Unoボードに送信する。

以下の図のように回路を組む:

コードプログラム

上記の操作が完了したら、USBケーブルを使ってArduinoボードをコンピュータに接続する。緑色の電源LED(PWRと表示されている)が点灯するはずである。Arduino IDEを開き、プロジェクトに対応するボード・タイプとポート・タイプを選択する。次に、https://osoyoo.com/driver/HC-SR04_Ultrasonic_Sensor.zipをArduinoにロードします。

#define echoPin 8
#define trigPin 7

void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}

void loop() {
int distance;

distance=watch();
Serial.print(“Distance = “);
Serial.print(distance);
Serial.println(” cm”);
delay(500);

}
int watch(){
long echo_distance;
digitalWrite(trigPin,LOW);
delayMicroseconds(5);
digitalWrite(trigPin,HIGH);
delayMicroseconds(15);
digitalWrite(trigPin,LOW);
echo_distance=pulseIn(echoPin,HIGH);
echo_distance=echo_distance*0.01657; //how far away is the object in cm
Serial.println((int)echo_distance);
return echo_distance;
}

実行結果

アップロードが終了して数秒後、シリアルモニターを開き、バッフルを動かすと、以下のように距離が表示されます:

以下のように距離が表示されます:

注意:”Out of range “と表示された場合は、超音波センサーからの距離が400cm以上または2cm以下であることを意味する。

hc-sr04超音波センサからの距離をi2c lcdに表示する。

HC-SR04超音波センサからの結果をI2C LCDに表示したい場合は、以下のソースを使用することができる。

接続

以下の図のように回路を組む:

コードプログラム

上記の作業が終わったら、USBケーブルでArduinoボードとコンピュータを接続します。Arduino IDEを開き、プロジェクトに対応するボードタイプとポートタイプを選択します。次に、以下のスケッチをArduinoにロードします。

ライブラリLiquidCrystal_I2C.hとNewPing.hがコンピュータにインストールされていることを確認してください。

#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <NewPing.h> LiquidCrystal_I2C lcd(0x27,16,2); #define TRIGGER_PIN 2 // Arduino pin tied to trigger pin on the ultrasonic sensor. #define ECHO_PIN 3 // Arduino pin tied to echo pin on the ultrasonic sensor. #define MAX_DISTANCE 400 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm. NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance. void setup() { Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results. lcd.init(); lcd.backlight(); } void loop() { delay(100); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings. unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS). Serial.print("Ping: "); Serial.print(uS / US_ROUNDTRIP_CM); // Convert ping time to distance in cm and print result (0 = outside set distance range) Serial.println("cm"); lcd.setCursor(0, 0); lcd.print("Distance:"); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(9, 1); lcd.print(uS / US_ROUNDTRIP_CM); lcd.setCursor(12, 1); lcd.print("cm"); }

実行結果

アップロードが終了してから数秒後、センサーにボードを近づけたり、遠ざけたりする。それに応じてLCDに表示される値が変化し、基板と超音波センサの距離を示しているのがわかる。