Raspberry Pi Pico - 超音波距離センサ

1/29/2023

Pico Raspberry Pi

t f B! P L

今週末は出不精になり部屋に籠ってしまったが、黙々とRaspberry Pi Picoをいじる良い機会になっている。LEDドットマトリックスに続いて超音波距離センサを試した。

使用したセンサは電子工作の超音波距離センサでは最もメジャー(?)なHC-SR04という、超音波信号をだして反射して帰って来た信号との時間差から距離を測定出来るセンサ。センサ側は入力されたTrigger信号に対してEcho信号を返すだけなので、実際の計算はマイコン側で行う。

これまで試した部品を残したまま足しているので、
ブリッドボードが若干ごちゃごちゃしてきた。

使用した機材等

配線

HC-SR04の電源は5Vだが、PicoのGPIOは3.3Vで受ける必要があるため、ECHO端子からの信号を抵抗を使って分圧してGPIOに入力する。

HC-SR04 RPi Pico Pin
VCC VBUS (DC5V) 40
GND GND 3
TRIG GPIO20 26
ECHO GPIO21 27

コード

  • import
    • SPI: LEDドットマトリックス接続
    • ADC: 温度計のアナログ入力
  • GPIO
    • OUT: trigger信号 
    • IN: echo信号
  • def measure()
    • while True:にベタ打ちでも良かったが、整理するため関数化
    • trigger信号は10μs以上入れる仕様(ひとまず10μsで問題なさそう)
    • echo信号がHighになっている時間が、対象物に超音波をだして戻ってくるまでの時間
    • 温度を計測して、温度補正入りの音速値を計算
    • 音速と計測した時間から距離を計算
  • def disp_ledmatrix()
    • 計測部分同様に、表示する文字列を引数にした関数とした
    • len(string)で表示する値の長さを読み取り、桁が少ない時(距離が短い時)も右寄せで表示するように表示位置を調整
  • 計測した距離の値(未処理状態では浮動小数点)を整数に変換
  • LEDマトリックスに表示

from machine import Pin,ADC,SPI
import utime
import max7219

# GPIO Pinの設定
trig = Pin(20, Pin.OUT)
echo = Pin(21, Pin.IN)
trig.value(0)
# 温度補正用
sensor_temp = machine.ADC(4) # 内蔵温度センサーはADC4
conversion_factor = 3.3 / (65535) # 変換係数

# Dot Matrix LED
spi = SPI(0,sck=Pin(2),mosi=Pin(3))
cs = Pin(5, Pin.OUT)
num_matrix = 4
display = max7219.Matrix8x8(spi, cs, num_matrix)
display.brightness(2)

def measure():
    global temperature,L
    trig.value(1)
    utime.sleep_us(10)
    trig.value(0)
    while echo.value()==0:
        t1=utime.ticks_us()
    while echo.value()==1:
        t2=utime.ticks_us()
    # エコー時間 (us)
    t=t2-t1
    
    t_read = sensor_temp.read_u16() * conversion_factor
    temperature = 27 - (t_read - 0.706)/0.001721
    # 音速 (m/s)
    Vs = 331.5 + 0.6*temperature
    # 距離
    L = Vs*t/2/1000 

def disp_ledmatrix(string):
    display.fill(0)
    str_length = len(string)
    display.text(string, 8*(4-str_length), 0, 1)
    display.show()

while True:
    measure()
    L_round = int(L)
    disp_string = str(L_round)
    disp_ledmatrix(disp_string)
    print('temp: ', temperature, 'deg, dist: ', L_round)
    utime.sleep(0.5)

結果

センサのどの位置から計測されているのかわからないが、おおむね±5mm以内での計測が出来るようになった。

写真は表示位置調整前。[mm]表示があるとよりそれっぽくなるか…



参考にしたサイト


このブログを検索

ラベル

Outdoor (21) 3D Printer (12) Raspberry Pi (10) Learning (9) Movie (7) Pico (6) FreeCAD (5) Game (5) Blog (4) MSFS (4) Python (4) Gadget (1) Unity (1)

ブログ アーカイブ

About

思い付きで始めた様々なコトをやった感想やメモ、Web上で見つけた後々役立ちそうなコトなどをまとめてます。 万人の役に立つコンテンツではなく自分用メモ的な内容ですが、何かの役に立てば幸いです

人気の投稿

QooQ