2015年5月23日土曜日

Arduino + HC-SR04 + LM35DZで測距

超音波距離センサと温度センサを併用して、測距をしてみたいと思います。

超音波距離センサからの値と音速を使って距離を計算するのですが、音速はその時の温度に影響されるので温度センサも使うというわけです。


用意するもの



配線した様子

LM35DZは平らな面を正面から見て左からVs、 Vout、 GNDとなっているので、Voutをアナログの0ピンに繋ぎます。HC-SR04はピンの名前が本体に書かれています。trigerピン、echoピンをそれぞれデジタルの8、9ピンに繋ぎます。

図1に配線例を示します。

 

図1 配線した様子


スケッチ

以下スケッチの例です。
測定結果はシリアルモニタに表示されていきます。

ranging.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#define trigPin 8 // Digital
#define echoPin 9 // Digital
#define tempPin 0 // Analog
 
void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}
 
void loop() {
  int distance = getDist();
  if (distance >= 2 && distance <= 400){
    Serial.print(distance);
    Serial.println(" cm");
  }
  else {
    Serial.println("Out of range");
  }
  delay(500);
}
 
// HC-SR04
int getDist() {
  int duration;
  double sonic_v;
 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigPin, LOW);
 
  duration = pulseIn(echoPin, HIGH);
  sonic_v = 331 + 0.6 * getTemp();
  return (duration / 2) * (sonic_v * 100/1000000);
}
 
// LM35DZ
double getTemp() {
  return (analogRead(tempPin) / 204.6) * 100;
}

getDist() // HC-SR04
距離を返します。
durationは音を発してから返ってくるまでにかかった時間なので、duration/2 は音がセンサから物体に到達するまでにかかった時間となります。後はこの値に音速をかけることで距離が求まります。
時間(duration)が[μs]なので音速(sonic_v)も[cm/μs]に揃えてあります。

getTemp() // LM35DZ
温度を返します。
analogRead(pin)は、0から5Vの入力電圧を0から1023の数値に変換して返します。
一方、LM35DZの出力は 0mV+10mV/℃ なので例えば10℃で100mVとなります。
0〜100℃までであるとして考えると、0〜1Vまでの電圧が返ってくると想定されるので、analogRead(pin)は 0〜1023/5 の値となるはずです。あとはその割合に最大値である100℃をかければ現在の温度が求まります。


おわりに

温度センサで現在の温度が得られれば正確な音速が計算できると思ったのですが、温度センサからの値が頻繁に上下すると結果的に距離の値も上下してしまうなあと思いました。まあそこまで激しく上下するわけではないし、音速の計算に多大な影響が出るわけでもないので、気にならないといえば気になりませんが。

温度を測定するのは最初だけにして固定する、温度センサの出力を増幅して分解能を上げるなど、いろいろ工夫できそうです。

参考サイト

以下のサイトを参考にさせていただきました。

Arduino/Arduinoの勉強はじめました
Arduinoで温度を計測する -1


0 件のコメント:

コメントを投稿