稼働中

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

接続例

HC-SR04の電源電圧は5.0Vなので外部電源が必要です。レベルコンバータを介してRaspberry Pi Picoと接続します。
トリガはSPI_TX(GP15)を使って出力しています。Echo(音波発信~反射受信:’H’)をGP13に接続しました。
HC-SR04 接続図

HC-SR04の説明

データシートから抜粋してHC-SR04の説明します。
下図のように10us幅のトリガを与えると8x40kHzの音波を出します。ECHO Pinが’H’になります。
物体から反射した音波を受信するとECHO Pinが’L’になります。ECHO Pinが’H’の時間(T)をRaspberry Pi Picoで測定して距離(L)を算出します。
HC-SR04 ECHO信号
※ 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’になります。
HC-SR04 トリガ生成
■温度補正
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を使って距離測定ができました。