nihsokのアイコン画像
nihsok 2026年07月19日作成 (2026年07月19日更新) © MIT
セットアップや使用方法 セットアップや使用方法 閲覧数 68
nihsok 2026年07月19日作成 (2026年07月19日更新) © MIT セットアップや使用方法 セットアップや使用方法 閲覧数 68

超音波距離センサUS-015の動作確認(気温推定も)

超音波距離センサUS-015の動作確認(気温推定も)

超音波距離センサーUS-015をESP32(ESP-WROOM-02)から操作して距離を測定する。

1. 使用したもの

  • ESP-WROOM-02
  • 超音波距離センサ US-015
  • ジャンパワイヤ(4本)
  • USBケーブル(適宜)

US-015はカホパーツセンターにて440円で購入。他に2種類くらい似たようなセンサーも売られていた。HC-SR04の方がメジャーかも。赤外線の測距センサーもある。
本体のみ。
データシートは秋月電子のサイトから見られる: https://akizukidenshi.com/goodsaffix/US-015.pdf

2. セットアップ

配線

ESP32 US-015
VIN VCC
GND GND
GPIO13 Trig
GPIO12 Echo

原理

  1. Trigを 10 μs以上HIGHにする
  2. 送信用スピーカーから 40 kHzのパルスが8個発射される(自動制御)
  3. EchoがHIGHになってからの持続時間から、距離を求める
    距離 = HIGHの長さ × 音速 / 2(往復)

測定距離の上限が 400 cmであることを考慮すると、1回の測定に0.025秒くらいは確保しておいた方がよさそう

音速は温度により変化するので、場合によっては温度補正が必要と思われる。

main.py

from machine import Pin, time_pulse_us import time trig = Pin(13,Pin.OUT) echo = Pin(12,Pin.IN) def measure(): trig.off() time.sleep_us(1) trig.on() time.sleep_us(10) trig.off() length = time_pulse_us(echo,1) if length>0: return length*340*1e-6/2 else: return float('nan') while True: d = measure() print(f'{d} m ({d*100}cm)') time.sleep(1)

3. 結果

0.08738 m (8.738cm)
0.10081 m (10.081cm)
0.19703 m (19.703cm)
0.16269 m (16.269cm)
1.40148 m (140.148cm)
1.88054 m (188.054cm)
2.9818 m (298.18cm)
2.93539 m (293.539cm)
0.15028 m (15.028cm)
0.03876 m (3.876cm)

といった感じで、いくつか対象を変えてそれらしい値が得られた。

  • ターゲットを固定したときでも 1 cm以下の範囲ではばらつきがあった。
    • 必要に応じて何回かの平均をとるのがよいかも
    • 差分から移動速度を求められるかと思ったが、ノイズが多そう
  • 個体壁(机)に接触させたときは 11.78 mになっていた。これに対応するパルス長は 70000 μsだが、time_pulse_us()のtimeout上限である 1000000 μsよりは十分に短いので、どこか遠くで帰ってきたパルスを拾っている。
  • ウレタンマット(カバー付き)でも、距離は測定できていた。これも接触すると 11.78 mだったのでここら辺が測定上限?(カタログでは 4 m)
  • 動作中に気になる音(可聴音)は聞こえなかった。

4. 気温に関する考察

距離を固定すると音速から気温が求められる。

  • 音速 c = L [m] ×2/伝達時間 t
  • 気温と音速との関係は c = 20.055×(T[℃]+273.15)^0.5

なので、T = (2L/20.055t)^2-273.15

実践

今回は簡単にするため L = 1 m(メジャーで測定)で試してみる。

temperature.py

from machine import Pin, time_pulse_us import time trig = Pin(13,Pin.OUT) echo = Pin(12,Pin.IN) def measure(): trig.off() time.sleep_us(1) trig.on() time.sleep_us(10) trig.off() length = time_pulse_us(echo,1) if length>0: return (2/(20.055*length*1e-6))**2-273.15 else: return float('nan') while True: d = measure() print(f'{d}℃') time.sleep(1)

returnとprintのところのみ変更

結果

実行環境はクーラーの設定温度27℃の部屋
壁からメジャーではかって1m

28.384552℃
27.964936℃
28.489532℃
28.489532℃
28.489532℃
28.384552℃
28.384552℃
28.384552℃
28.489532℃
28.489532℃
28.384552℃
28.489532℃
28.594635℃
28.489532℃
27.964936℃
28.27951℃
27.755462℃
27.964936℃
27.860138℃
27.860138℃
28.27951℃
27.755462℃
27.964936℃
28.384552℃
28.384552℃
27.860138℃
27.860138℃
28.27951℃
28.384552℃
28.489532℃
28.27951℃
28.489532℃
28.384552℃
28.384552℃
28.384552℃
28.174592℃
27.860138℃
27.755462℃
27.964936℃
27.860138℃
27.860138℃
27.755462℃
28.069702℃
28.27951℃
27.964936℃
27.860138℃
28.27951℃
28.489532℃
28.489532℃
28.489532℃
28.384552℃
28.384552℃

それらしい値が得られた。標準偏差は 0.27℃。ざっくり0.5度くらいの精度はありそう。ただし 1 cmで 6℃くらいずれるので距離の精度も重要。距離の測定と同じくばらつきがあるが、ある程度平均化することで例えば1日の気温の変動などは見えそう。

壁に近いところだと予期せぬ反射(マルチパス)があるので難しかった。指向性はあまり高くないかも。

5. まとめ

micropython on ESP32で超音波センサーUS-015の動作を確認した。約 1 cmの精度で距離を測定できた。

距離を正確に固定できれば、気温も0.5度以下の精度で推定できると思われる。ただし、距離と気温とを同時に推定することはできない(広い意味での不確定性原理)。

nihsokのアイコン画像
ソフトウェアがメインの電子工作が好みです。
  • nihsok さんが 前の日曜日の23:43 に 編集 をしました。 (メッセージ: 初版)
  • nihsok さんが 前の日曜日の23:45 に 編集 をしました。
  • nihsok さんが 前の日曜日の23:46 に 編集 をしました。
ログインしてコメントを投稿する