概要
Arduino で超音波センサ (HC-SR04) を使ってみました
HC-SR04 は送信用と受信用のセンサがついており、送信した信号を受信側で受信するまでの時間を測定することができます
音波の速さは音速 (約 340.29 m / s) なのでこれと測定時間を掛け合わせることで距離を測定することができます
環境
- Arduino Uno
- Arduino IDE 1.6.7
- 超音波センサ HC-SR04
- 温度センサ
今回は温度センサがあったので使っています
温度センサを使って温度を考慮することでより正確な距離を算出することができます
温度変化は音速の値に影響します
配線
実際に配線した写真は以下の通りです
やや複雑な配線だったので fritzing を使って配線図も作成しました
特に迷うところはないと思います
HC-SR04 はデジタルピン 2, 3 番を使います
温度センサはアナログピン 0 番を使います
電源は 5v から供給してください
スケッチ
スケッチ全体はは以下の通りです
int duration = 0; // 受信した時間
double distance = 0; // 距離
int trigger = 2;
int echo = 3;
void setup() {
Serial.begin(9600);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
}
void loop() {
int ans, temp, tv;
ans = analogRead(0);
tv = map(ans, 0, 1023, 0, 5000); //センサ値 -> 電圧
temp = map(tv, 300, 1600, -30, 100); //電圧 -> 温度 (-30 から 100 度まで)
Serial.print("temp:");
Serial.print(temp);
Serial.print("c");
// 音波を出力して pulseIn で受信する
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
duration = pulseIn(echo, HIGH, 5000);
if (duration > 0) {
distance = duration / 2;
// 温度から音速を計測 (単位は m/s)
float sonic = 331.5 + 0.6 * temp;
Serial.print("\tsonic:");
Serial.print(sonic);
Serial.print("m/sec");
// 音速を cm 単位のマイクロ秒に変換
// 100 掛けることで cm に変換
// 1000 割ることで ms に変換
// 再度 1000 割ることで us に変換
distance = distance * sonic * 100 / 1000 / 1000;
Serial.print("\tdistance:");
Serial.print(distance);
Serial.print("cm");
}
Serial.println("");
delay(500);
}
ポイントはアナログピンから取得した値を電圧 -> 温度と変換している部分と digitalWrite, pulseIn を使って音波の送受信をしている部分かなと思います
あとは最終的に cm 単位で出力するので単位を変換してあげています
動作確認
スケッチを書き込んでシリアルモニタを起動してみましょう
以下のように表示されると思います
ちなみに計測できた距離の最大は 75cm くらいが限界でした
60cm を超えたあたりから距離の計測精度も落ちてきました (実際 70 cm 距離があるが測定できた値は 66cm くらいの精度)
温度センサを使わないバージョンでも計測してみましたが、それよりかは温度センサを使ったほうが精度は良かったです
Tips
- distance の値が 0 になってしまう
理由はわからないのですが、distance が 0 になってしまう現象が発生しました
音速を cm 単位のマイクロ秒に修正すると 0.034cm/us ( = sonic * 100 / 1000000) になるのですが、これを時間 (duration) と掛け合わせるところでなぜか 0 になってしまいました
何度か試しているとちゃんと表示されるようになったのだが、うまく表示されない場合は一旦変数に格納してから音速を掛け合わせるようにすると直るかもしれません
もしくは 0.034 を直接掛けあわせても直ると思います
- map 関数について
map は値をある範囲に変換してくれるメソッドです
例えばソースコード中の
tv = map(ans, 0, 1023, 0, 5000)
であれば入力が 0 から 1023 の範囲でそれを 0 から 5000 の範囲に変換して tv に格納するということをやっています
0 件のコメント:
コメントを投稿