nihsok が 2026年07月19日23時43分56秒 に編集
初版
タイトルの変更
超音波距離センサUS-015の動作確認(気温推定も)
タグの変更
超音波
超音波距離センサ
距離センサー
距離モジュール
ESP32
micropython
US-015
ESP-WROOM-02
温度センサー
メイン画像の変更
記事種類の変更
セットアップや使用方法
ライセンスの変更
(MIT) The MIT License
本文の変更
超音波距離センサー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. セットアップ ## 2.1 配線 || ESP32 | US-015 | |:--:|:---:|:---:| |赤| VIN | VCC | |黒| GND | GND | |黄| GPIO13 | Trig | |緑| GPIO12 | Echo | # 2.2 原理 1. Trigを 10 μs以上HIGHにする 2. 送信用スピーカーから 40 kHzのパルスが8個発射される(自動制御) 3. EchoがHIGHになってからの持続時間から、距離を求める *距離 = HIGHの長さ × 音速 / 2(往復)* 測定距離の上限が 400 cmであることを考慮すると、1回の測定に0.025秒くらいは確保しておいた方がよさそう ++音速は温度により変化するので、場合によっては温度補正が必要と思われる。++ ```python: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 ## 4.1 実践 今回は簡単にするため L = 1 m(メジャーで測定)で試してみる。 ```python: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のところのみ変更 ## 4.2 結果 実行環境はクーラーの設定温度27℃の部屋  > 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度以下の精度で推定できると思われる。ただし、距離と気温とを同時に推定することはできない(広い意味での不確定性原理)。