この記事では、Arduinoと超音波距離センサ(HC-SR04)で対象物までの距離を気温を考慮して測定する方法をソースコード付きで解説します。
超音波距離センサ(HC-SR04)
超音波距離センサ(HC-SR04)は、超音波を用いた距離センサーです。
このセンサーは、2~450cmまでの範囲内にある対象物までの距離を測定できます。
アマゾンで200円で入手できました。
出力した超音波が対象物に跳ね返って戻ってくるまでの時間と音速(超音波の速度)から距離を求めます。
計算式
(対象物までの距離)=(音速)×(出力してから戻ってくるまでの時間÷2)
前回は音速を340m/sで固定しました。
– | ご参考ページ |
---|---|
参考 | ■【Arduino】超音波距離センサ(HC-SR04)の使い方 |
しかしながら、実際には気温や湿度などの影響で変化します。
よって、測定精度を上げるにはこれらの変化を反映してやります。
今回は、気温を考慮してArduinoでHC-SR04を使ってみました。
回路構成
赤:5V、黒:GND、黄:8番ピン、緑:9番ピン
– | 使用機器 |
---|---|
1 | Arduino UNO ×1 |
2 | 超音波距離センサ(HC-SR04)×1 |
3 | ブレッドボード ×1 |
4 | ジャンパーワイヤ 数本 |
仕様 | 内容 |
---|---|
電源電圧 | 5V |
待機電流 | 2mA未満 |
信号出力 | 0-5V |
センサ角度 | 15度以下 |
測定可能距離 | 2cm-450cm |
分解能 | 0.3cm |
超音波センサの4本の端子の構成は以下の通りです。
(本体にもラベルが刻まれています)
ラベル | 内容 |
---|---|
Vcc | 電源入力(5V) |
Trig | 超音波信号を送信 |
Echo | 超音波信号を受信 |
GND | グランド |
ソースコード
サンプルプログラムのソースコードです。
int trig = 8; // 出力ピン int echo = 9; // 入力ピン void setup() { Serial.begin(9600); pinMode(trig,OUTPUT); pinMode(echo,INPUT); } void loop() { // 超音波の出力終了 digitalWrite(trig,LOW); delayMicroseconds(1); // 超音波を出力 digitalWrite(trig,HIGH); delayMicroseconds(11); // 超音波を出力終了 digitalWrite(trig,LOW); // 出力した超音波が返って来る時間を計測 int t = pulseIn(echo,HIGH); // 計測した時間と音速(気温を考慮)から反射物までの距離を計算 float temp = 22.4; // 気温 float v = (331.5+0.6*temp)/10000; // 音速 float distance = v*(t/2); // 距離 // 計算結果をシリアル通信で出力 Serial.print(distance); Serial.println(" cm"); delay(500); }
– | 処理手順 |
---|---|
① | 出力ピン(8)で超音波を出力(トリガ端子を10μs以上Highにすると40kHzのパルスを8回送信) |
② | 入力ピン(9)で超音波を受信(エコー端子がHIGHになってからLOWに変化するまでの時間=超音波が送信されてから受信するまでの時間[μs]を計測) |
③ | 以下の式で時間から距離を求めます。 |
距離[cm] = (音速) × (②で求めた時間[μs]÷2) 音速=331.5 + (0.6×気温) [m/s] = [331.5 + (0.6×気温)]÷10000 [cm/μs] ※気温の単位は℃
– | 参考ページ |
---|---|
参考 | pulseIn関数の使い方 |
実行結果
サンプルプログラムの実行結果です。
シリアルモニター
19.21 cm 19.14 cm 18.76 cm 18.73 cm
※本当は温度センサーでリアルタイムに読み取った値で音速を逐次計算した方が良いです。
– | 関連記事 |
---|---|
1 | ■Arduino入門 基本的な使い方 |
コメント
超音波センサーHC-SR04を使ってLCD1602Aに距離を表示させる場合の
配線図とコードはどうなりますか
すみません。初心者ですのでよろしくお願いいたします。
※ひむか様
コメントありがとうございます。
LCD1602Aを持っていないのでなんとも言えませんが
本記事ようにHC-SR04を配線した後、LCDを配線して
LCDに文字を出力するプログラム(lcd.printなど)も追加することになります。
一般的なLCDの配線と文字出力プログラムは下記事で紹介しています。
を追加すれば良いかと思います。
【Arduino】液晶画面(LCD)に文字列を表示
https://algorithm.joho.info/arduino/lcd/
返信ありがとうございます。
HC-SR04とLCD1602A(Elegoo Arduino電子工作キットD同梱品)を使用して
管理人様の気温考慮コードを織り込み試行錯誤しながら
下記コードで正常に作動しました。
//気温考慮 距離LCD表示 OK 2018.9.18
#include
LiquidCrystal lcd( 4, 6, 10, 11, 12, 13 );
int trig = 2; // 出力ピン
int echo = 3; // 入力ピン
void setup() {
Serial.begin(9600);
pinMode(trig,OUTPUT);
pinMode(echo,INPUT);
}
void loop() {
digitalWrite(trig,HIGH);
delayMicroseconds(11);
digitalWrite(trig,LOW);
// 出力した超音波が返って来る時間を計測
int t = pulseIn(echo,HIGH);
// 計測した時間と音速から反射物までの距離を計算
float temp = 25; // 気温
float v = (331.5+0.6*temp)/10000; // 音速
float distance = v*(t/2); // 距離
// 計算結果をシリアル通信で出力
lcd.begin( 16, 2 );
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“distance”);
lcd.print(distance);
lcd.print(“cm”);
delay(500);
}
さらに、温度センサー(thermistor:Elegoo Arduino電子工作キット)を取り込み、lcd表示がパラパラ変わるのではなく
過去数秒間(例えば2秒間)の平均値を表示させる場合の場合はどうなりますか?
それから、7セグメント4桁表示器(SH5461AS 上下6pin 脚付き:Elegoo Arduino電子工作キット)に距離表示させる場合はどうなりますか?
※にひむか様
こちらこそ、ソースコード付きでご報告いただき感謝です。
正常に動作してこちらも嬉しいです。
泡立つ液面までの距離を測定するにはこのHC-SR04は誤差が大きいというか
正常値とかけ離れた数値を交互に表示します。
泡立つ液面までの距離を正確に測るセンサーをご存じありませんか?
※ひむか様
コメントありがとうございます。
HC-SR04は、下記事のように分解能の高い領域で測定すれば
ある程度誤差を小さくできます。
【Arduino】センサーの測定精度を上げるポイント
https://algorithm.joho.info/arduino/sendor-measurement-accuracy/
より高い分解能をもつセンサーでしたら、業務用なら数万円レベルからあるようですね。
https://www.monotaro.com/g/00494795/
ありがとうございます。精度を上げる方法のちほどやってみなす。
ところで超音波距離センサに温度センサー(thermistor)を追加して
温度変化仁対応した距離表示をおこなうコードを検討中です。
距離だけ表示する場合のコードはどうなりまsうか
1602Aに二段表示で距離(DISTANCE)表示が上で、下段に気温表示
が可能ですか。