Raspberry Pi Pico(d_19)HC-SR04 距離センサ
HC-SR04 超音波距離センサ
HC-SR04は超音波距離センサーです。音波を使用して距離を測定します。Raspberry Pi PicoでHC-SR04を使ってみました。
HC-SR04の能力は測距範囲:2~400cm、精度:正面を中心とした15度の範囲、分解能:0.3cmらしいです。
※micro:bitの記事e_08からRaspberry Pi Picoで使えるように追記、修正等をしました。
外観
HC-SR04の外観写真です。音波の発信部と受信部があります。音波を発信し、その反射を受信した時間を測って距離を測定します。
接続例
HC-SR04の電源電圧は5.0Vなので外部電源が必要です。レベルコンバータを介してRaspberry Pi Picoと接続します。
トリガはSPI_TX(GP15)を使って出力しています。Echo(音波発信~反射受信:’H’)をGP13に接続しました。
HC-SR04の説明
データシートから抜粋してHC-SR04の説明します。
下図のように10us幅のトリガを与えると8x40kHzの音波を出します。ECHO Pinが’H’になります。
物体から反射した音波を受信するとECHO Pinが’L’になります。ECHO Pinが’H’の時間(T)をRaspberry Pi Picoで測定して距離(L)を算出します。
※ HC-SR04のデータシートから抜粋
スクリプト
HC-SR04のスクリプトは以下のようにしました。単発の距離測定です。
音速の温度補正はRaspberry Pi Picoのコア温度で補正しています。
コア温度、ECHO’H’時間(us)、算出した距離(cm)を表示します。
※開発環境はThonnyです。ThonnyでMicroPythonをRaspberry Pi Pico with RP2040にインストールして使っています。
※Raspberry Pi Pico単独で動作させるには’main.py’としてRaspberry Pi Picoにuploadして使います。
pico_hcsr04_03b.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import Pin, SPI, ADC
import time
#Ultrasonic ranging module HC-SR04 2cm-400cm
#温度補正を付けた 単発の測定
#コア温度の算出
def cov_temp(r_adc):
cof = 3.3/2**16
vs = r_adc*cof
temp = 27 - ( vs - 0.706) / 0.001721 # 計算式
return temp
#spi.init
spi = SPI(1, baudrate=500_000,sck=Pin(14), mosi=Pin(15), miso=Pin(12))
# ECHO Pin(13)を入力モード
p13 = Pin(13, Pin.IN, Pin.PULL_DOWN) # CS-pin Pin(13)でもinputで使える
# ADC4(CORE_TEMP)instance
adc=ADC(ADC.CORE_TEMP) # 普通にはADC(4)
time.sleep_ms(100)
# コア温度測定
r_adc=adc.read_u16()
c_temp=cov_temp(r_adc)
c=331.5+0.6*c_temp
# 10usec Trigger
# baudrate=500_000 2usec/bit * 5bit(0xf8)=10usec '0b11111000'
spi.write(b'\xf8')
# distance measurement Echo Pulse 'H'time
dt = machine.time_pulse_us(Pin(13), 1)
# L=C x T/2 (m) 音速C=331.5 + 0.6xt(℃) (m/s)
# 温度補正 20℃ 343.5m/s
# L_cm = 0.017*echo(usec)
a_dist=0.017*dt
dist= c * dt/2 * 10**(-4) # cm
#print('%5.1f'%c_temp,'%5.1f'%a_dist,'%5.1f'%dist)
print('{:>5.1f}c'.format(c_temp),'{:>5d}us '.format(dt),'L={:>5.1f}cm'.format(dist))
time.sleep_ms(500)
関数 部分説明
■トリガ
10usのトリガ生成はSPIのTX(MOSI)を使っています。
SPIのbaudrate=500_000 (500kHz)にしています。そのため周期T = 2usになります。
spi.write(b’\x80′) #’0b1000_0000’なら2usのパルスになります。
10usのパルスにするには2usx5なので
spi.write(b’\xf8′) #’0b1111_1000’になります。
■温度補正
Raspberry Pi Picoのコア温度(ADC4)を周囲温度とみなして音速を温度補正して距離(L)を算出します。
L = C x (T/2) (m) 往復の時間なので1/2を掛けます。
C = 331.5 + 0.6t(℃) (m/s) 音速(C)の温度補正
実行結果
結果は以下のようになりました。※Thonnyのshellに表示されます。
遮蔽物はアクリル板を使いました。距離は送信機、受信機の頭部から測りました。かなり正確に測れているようです。
>>> %Run -c $EDITOR_CONTENT
24.2c 582us L= 10.1cm #10cm
>>> %Run -c $EDITOR_CONTENT
24.7c 1193us L= 20.7cm #20cm
>>> %Run -c $EDITOR_CONTENT
24.7c 2313us L= 40.1cm #40cm
>>> %Run -c $EDITOR_CONTENT
24.7c 3656us L= 63.3cm #60cm
>>> %Run -c $EDITOR_CONTENT
24.7c 4668us L= 80.8cm #80cm
>>>
まとめ
Raspberry Pi PicoでHC-SR04を使って距離測定ができました。