HC-SR04を使った内容をまとめました。
Arduino環境で手軽に精度よく対象物との距離を測れます。
記事のまとめ
HC-SR04について簡単に紹介します。
モジュールの発する超音波について計測をしてみました。
対象物との距離や角度、様々な素材の対象物を計測し精度や誤差を記載しました。
モジュールを使用するための環境作成方法や実際に使った配線やスケッチを紹介しています。
超音波距離センサ(HC-SR04)
簡単紹介
超音波を発し、音が反射して帰ってくるまでの時間を計測します。
時間から対象物との距離を算出できます。

◆入手
電子部品ショップ、オンラインショップ、amazonなどで入手できます。
1個\300~\400(送料込み)が目安と思います。
◆その他
電子工作入門セットに含まれていることも多くみられます。
ジャンパワイヤでの配線以外にGroveコネクタが取り付けられているものもあり、配線はコネクタの挿抜だけで手軽にできるものもあります。

◆関連記事
ピン配置

外観

使ってみた
◆超音波
HC-SR04が発する超音波(40kHz)を発します。
人の可聴範囲は20kHz程度らしいので全く聞こえません。
音波をサウンド検出モジュール(LM-393)で観測してみました。
LM-393の検出主端数は40kHzなので仕様限界で、信号はオシロスコープ(HD272)でモニタします。
LM-393のポテンショを調整することで検出することができました。
画像上はHC-SR04のT側(超音波発振側)にLM-393で受信している様子です。
画像左下はオシロスコープの画面で100msごとに音波を検出している様子です。
今回使用したサンプルスケッチでは、100msごとにマイコンからHC-SR04に計測トリガを出力しているので、100msごとに音波を検出している様子です。
画像右下は1回の音波を拡大したものです。
信号がつぶれかけているので複数回分の振幅(4回分)を計測すると100usで、4で割ると25us(40kHz)でした。

◆開発
Arduino環境でRaspberry Pi Picoを使って制御します。
HC-SR04の信号レベルは5Vなので、ロジックレベルが3.3Vのマイコンを使用する場合は電圧変換が必要です。
このモジュールは超音波が反射して戻ってくるまでの時間を計測します。
ライブラリを使用しない場合でも以下の計算式を使用することで、時間を距離に変換できます。
距離(mm) = 331.5m/s + 0.61t x 20degC) ÷ 2 ÷ 1000
◆計測
距離の精度、対象物の材質を変えて距離の計測をしてみました。
<<距離の精度>>
100mm以上で精度が安定しました。
2000mmまでの計測ですが概ね2%程度です。
参考情報
対象物の反射面 : 下敷き

いろんな素材で計測誤差を見てみました。
平坦で硬いものは誤差やばらつきも小さく、布や紙は誤差やばらつきが大きくなる傾向が見られました。
対象物も角度がついていると測定結果に誤差が出やすいこともわかりました。
測ってみた結果はこちらです。
◆使ってみて
対象物との距離を簡単に精度よく測ることができました。
結果には載せていませんが、計測範囲は±15℃らしいですが実際にはほぼ真正面を測っているようです。
対象物に角度がついたり突起のある形状の場合、測定結果に誤差やばらつきが出やすいので正確な測定をするために工夫をするか、近い/遠いの大雑把な距離の参考にするなど使い分けが必要です。
準備
使うもの
Arduino環境でRaspberryPi Picoを使用します。
Arduino環境の準備はこちらの記事で紹介しています。
ボードライブラリ
今回Raspberry Pi Picoを使って制御します。
Arduino IDEのボードマネージャからRP2040用のライブラリのインストールとボードの選択をします。
ボードライブラリには「Raspberry Pi Pico/RP2040 by Earle F. Philhower, III」を使用します。
Generic RP2040またはRaspberry Pi Picoを選択。
追加のボードマネージャのURL | https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json |
検索 | RP2040 |
ボードライブラリ | Raspberry Pi RP2040 Boards(x.x.x)※ |
選択するボード | Raspberry Pi RP2040 Boards(x.x.x) > Raspberry Pi Pico |
モジュールライブラリ
不要です。
スケッチサンプル
距離計測
説明
距離の計測をします。
10usのトリガを入力して計測を行い、以下の計算式から距離を計算します。
100msごとに計測を行い結果をシリアル出力します。
HC-SR04は5V入力、5V出力です。
今回Raspberry Pi Picoを使用するロジックレベルは3.3Vで行うため、双方向ロジックレベル変換モジュールを使ってロジックレベルを変換します。
分圧抵抗を使用することで同じ結果が得られるので、参考までに配線図を掲載します。
配線

スケッチ
#define PIN_ECHO 0
#define PIN_TRIGGER 1
#define TRIGGERPULSE_US 10
#define SOUNDSPEED (331.5 + 0.61 * 20) //音速 331.5m/s, 摂氏 0.61t, 20℃
void setup()
{
Serial.begin(115200);
pinMode(PIN_TRIGGER, OUTPUT);
pinMode(PIN_ECHO, INPUT);
digitalWrite(PIN_TRIGGER, LOW);
delay(100);
}
void loop()
{
digitalWrite(PIN_TRIGGER, HIGH);
delayMicroseconds(TRIGGERPULSE_US);
digitalWrite(PIN_TRIGGER, LOW);
//反射時間の読み取り (単位 us)
double DdTwoWayTime_us = pulseIn(PIN_ECHO, HIGH); //us
double DdOneWayTime_us = DdTwoWayTime_us / 2; //往復時間の計測を片道時間にする
double DdDistance_mm = DdOneWayTime_us * SOUNDSPEED / 1000; // 距離(mm)を計算
Serial.println(DdDistance_mm);
delay(100);
}
結果
動かしている様子です。
画像では小さなブロックオブジェクトを映していますが、20cm以降は下敷きを使って測定しています。
近距離では誤差が大きく見えますが、100mm以降は誤差も小さく安定して測れます。

その他
素材や角度による測定を確認してみました。
300mmを基準にした誤差を示します。
測定は手作業が多いので再現性や不確かさをできるだけなくすために複数回測定しています。
距離:300mm
室温:25℃(計算式は20℃ですが、相対的に確認する場合影響は小さいと考えます)
<<素材による誤差>>
青棒は300mmに対する誤差で、10回の読み取りの平均です。
上方に伸びている物は300mmより長く計測し、下方は短く計測された結果です。
茶棒は標準偏差です。
10回の読み取りのばらつきを見ています。
0に近いほど読み取りばらつきが小さい。
緑棒は10回の読み取りの最大値と最小値の差です。

<<角度による誤差>>
HC-WR04の中心から300mmの地点での下敷きに角度を付けました。
左図は角度の付け方を表しています。
右図は計測結果です。
300mmに対する誤差で、10回の読み取りの平均です。

コメント