超音波距離センサー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 |
原理
- Trigを 10 μs以上HIGHにする
- 送信用スピーカーから 40 kHzのパルスが8個発射される(自動制御)
- 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のところのみ変更
結果
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
さんが
前の日曜日の23:43
に
編集
をしました。
(メッセージ: 初版)
-
nihsok
さんが
前の日曜日の23:45
に
編集
をしました。
-
nihsok
さんが
前の日曜日の23:46
に
編集
をしました。
ログインしてコメントを投稿する