超音波距離センサー(HC-SR04)を使って物体との距離を測定してみよう!
こんにちは、タクト工房です。今回は、超音波距離センサーを使って距離を測定するプロジェクトを行います。このセンサーは、物体までの距離を測定するのに役立ちます。Raspberry Piを使用して、距離をリアルタイムで測定し、その結果を表示するプログラムを作成します。
この記事は、アフリエイト広告を利用しています
必要な材料と道具
Raspberry Pi
超音波距離センサー(HC-SR04)
ジャンパーワイヤー
ブレッドボード
抵抗(1kΩと2kΩ×2)
使用した超音波センサー
超音波距離センサーの原理
超音波距離センサーは、超音波を発信し、その音波が物体に反射して戻ってくるまでの時間を測定することで距離を計算します。超音波センサーには4つのピンがあります:
VCC:電源(5V)
GND:グランド
TRIG:トリガー信号(超音波を発信)
ECHO:エコー信号(超音波が戻ってくると出力)
超音波センサーの仕組み
トリガー信号:TRIGピンに短いパルス(約10µs)を送信します。これにより、センサーが8つの40kHzの超音波パルスを発信します。
エコー信号:超音波が物体に反射し、センサーに戻ってくると、ECHOピンがハイ信号に変わります。
距離計算:エコー信号がハイ状態であった時間を測定し、その時間に基づいて距離を計算します。計算は、音の速度を考慮して行います。
距離の計算方法
下の写真のように、超音波センサーをコウモリ、障害物を三角コーンに見立てて考えます。障害物との距離を d(cm) とし、この距離を測定します。超音波センサーでは、信号を送信してから障害物に反射し、戻ってくるまでの時間 t(s) を計測します。この信号の速度 v は音速であり、およそ34300(cm/s)です。したがって、障害物までの距離は次の式で求めることができます。
$$
d=\frac{v×t}{2}
$$
$$
=\frac{34300×t}{2}
$$
回路設計
以下のように配線を行います
電圧分割回路について
Raspberry PiのGPIOピンは3.3Vに対応しているため、ECHOピンからの5V信号を直接入力すると故障する可能性があります。これを防ぐために、1kΩと2kΩの抵抗を使って電圧を3.3Vに下げる電圧分割回路を使用します。
上記の回路図のように設計することでGPIO24にかかる電圧$${V_{out}}$$は次のようになります。
$$
V_{out} =V_{in}×\frac{R2}{R1+R2}
$$
$$
=5×\frac{2+1}{2+2+1}
$$
$$
=3V
$$
プログラム
次に、Raspberry Piに以下のC言語コードを入力して、超音波距離センサーを制御し、距離を測定します。
#include <wiringPi.h>
#include <stdio.h>
#define TRIG_PIN 23 // GPIO 23
#define ECHO_PIN 24 // GPIO 24
void setup() {
wiringPiSetupGpio(); // GPIOモードを使用
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
digitalWrite(TRIG_PIN, LOW);
delay(30); // 初期化のための待機時間
}
long getDistance() {
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
while(digitalRead(ECHO_PIN) == LOW);
long startTime = micros();
while(digitalRead(ECHO_PIN) == HIGH);
long travelTime = micros() - startTime;
// 1秒あたりのtravelTimeを秒単位に変換
double travelTimeInSeconds = travelTime / 1000000.0;
// 音速は34300 cm/s
long distance = (travelTimeInSeconds * 34300) / 2; // 片道分にするために2で割る
return distance;
}
int main(void) {
setup();
while (1) {
long distance = getDistance();
printf("距離: %ld cm\n", distance);
delay(500); // 0.5秒待機
}
return 0;
}
プログラムの説明
setup関数:
wiringPiSetupGpioを呼び出してGPIOモードを初期化します。
pinModeでTRIGピンを出力、ECHOピンを入力に設定します。
digitalWrite(TRIG_PIN, LOW)でTRIGピンを低に設定し、センサーを初期化します。
getDistance関数:
TRIGピンに10µsのパルスを送信して超音波を発信します。
ECHOピンがLOWからHIGHに変わる時間(音波が戻ってくるまでの時間)を計測します。
計測した時間を元に、距離を計算します。
main関数:
setup()関数で初期化を行い、無限ループでgetDistance()を呼び出して距離を測定し、その結果をコンソールに表示します。
コンパイルと実行
入力が完了したら、メニューの「ビルド>Build」をクリックします。コンパイルが完了したら「ビルド>Execute」をクリックし、プログラムを実行します。実行すると、物体までの距離がリアルタイムで表示されます。
まとめ
今回、超音波距離センサーを使って距離を測定する方法を学びました。この技術は、ロボットの障害物検知や自動化システムに役立ちます。次のプロジェクトに応用してみてください!