前回はLCDディスプレイに文字を表示してみました。
今回は超音波モジュールを使用して距離を測定してみましょう。
超音波測距モジュールについて
超音波測距モジュールは、超音波が障害物に当たると反射するという原理を利用しています。超音波の送受信の時間差を計測することで距離を測定することができます。この時間差は、超音波が送信されてから受信されるまでの往復の時間に相当します。空気中の音速はおよそv=340m/sと一定なので、超音波測距モジュールと障害物間の距離sは、s=vt/2で計算することができます。
HC-SR04超音波距離測定モジュールは、超音波送信機と受信機を内蔵しています。送信機は、電気信号(電気エネルギー)を人間には聞こえない高い周波数の音波(機械エネルギー)に変換し、受信機はこれとは反対の役割を果たします。HC-SR04超音波距離測定モジュールの外観と回路図は以下の通りです:
テクニカルスペック
動作電圧:5V
動作電流:12mA
最短計測距離:2cm
最長計測距離:200cm
Trig ピンに最低 10us(マイクロ秒)続くハイレベルのパルスを出力すると、モジュールは超音波の発信を開始します。同時に、Echo ピンはハイレベルに引き上げられます。モジュールが障害物に当たって反射した超音波を受信すると、Echo ピンはローレベルに引き下げられます。Echo ピンのハイレベルの継続時間は、超音波が送信されてから受信されるまでの往復の時間に相当し、s=vt/2 で計算できます。
回路図
接続図
コード
/**********************************************************************
Filename : Ultrasonic Ranging
Description : Use the ultrasonic module to measure the distance.
Auther : www.freenove.com
Modification: 2022/10/25
**********************************************************************/
#define trigPin 13 // define TrigPin
#define echoPin 14 // define EchoPin.
#define MAX_DISTANCE 700 // Maximum sensor distance is rated at 400-500cm.
//timeOut= 2*MAX_DISTANCE /100 /340 *1000000 = MAX_DISTANCE*58.8
float timeOut = MAX_DISTANCE * 60;
int soundVelocity = 340; // define sound speed=340m/s
void setup() {
pinMode(trigPin,OUTPUT);// set trigPin to output mode
pinMode(echoPin,INPUT); // set echoPin to input mode
Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
}
void loop() {
delay(100); // Wait 100ms between pings (about 20 pings/sec).
Serial.printf("Distance: ");
Serial.print(getSonar()); // Send ping, get distance in cm and print result
Serial.println("cm");
}
float getSonar() {
unsigned long pingTime;
float distance;
// make trigPin output high level lasting for 10μs to triger HC_SR04
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Wait HC-SR04 returning to the high level and measure out this waitting time
pingTime = pulseIn(echoPin, HIGH, timeOut);
// calculate the distance according to the time
distance = (float)pingTime * soundVelocity / 2 / 10000;
return distance; // return the distance value
}
setup()とメインループについては特に説明はいらないですね。
getSonar() は、超音波モジュールによる測定を開始し、測定された距離をcm単位で返すために使用されます。この関数では、まず trigPin に 10マイクロ秒のハイレベル信号を送信して超音波モジュールを起動します。するとechoPinはHIGHになります(ここがポイントです)。次に、pulseIn() を使用して超音波モジュールからの信号を読み取り、ハイレベル信号の継続時間(=LOWになるまでの時間)を返します。echoPinは反射波を受け取るとLOWにリセットされます。最後に、この時間に基づいて測定距離を計算します。
今回のコードでは音速(soundVelocity)を340m/sとして計算していますが、厳密には温度による変化があります。
音速=331.5+0.6T(℃)
次回は温度補正をして距離を計算してみましょう。
コメント