超音波センサーHC-SR04とRaspberry Pi Picoで距離測定を実践しよう

目次

はじめに

電子工作では非常に有名な超音波センサを使ってみましょう。

動作の仕組み

超音波センサー HC-SR04 は、距離を測定するために超音波を利用するセンサーです。
小型で安価、そして高精度なため、ロボティクスやIoTプロジェクトに広く使われています。
ロボットの目の様に見えるもの使い勝手の良い点ですね。

特徴

  • 測定範囲:2cm ~ 400cm
  • 精度:±3mm
  • 動作電圧:5V

基本構造

HC-SR04 センサーは主に次の部分で構成されています

  • 送信部 (Transmitter):超音波を発する部品。
  • 受信部 (Receiver):反射された超音波を受け取る部品。
  • 制御回路 (Control Circuit):信号の送受信を制御する回路。

動作の流れ

センサーは以下のプロセスで距離を計算します

  1. トリガ信号の送信
    • センサーの Trig ピンに 10µs の高電位パルスを送信します。
    • これにより、送信部が 40kHz の超音波パルスを 8 回発信します。
  2. 超音波の伝播
    • 発信された超音波は空気中を進み、障害物に当たると反射します。
  3. 反射波の受信
    • 受信部が反射された超音波を検出します。
    • センサーは Echo ピンを高電位状態にして反応時間を出力します。
  4. 時間の測定
    • Echo ピンが高電位の間、超音波が往復するのにかかった時間を測定します。
  5. 距離の計算
    • 超音波の速度(約 343m/s)を利用して、距離を次の式で計算します

配線

RaspberryPi Pico超音波センサ
VSYS(39番)VCC
GND(38番)GND
GP14(19番)Trig
GP15(20番)Echo
()内はピン番号

超音波センサーで距離を計測し、ディスプレイに表示する

ディスプレイは以前のコードを流用しています

from machine import Pin, I2C
import utime
from ssd1306 import SSD1306_I2C

# 超音波センサーのピン設定
TRIGGER_PIN = 14
ECHO_PIN = 15

# OLEDディスプレイの設定 (I2C)
I2C_SCL = 17
I2C_SDA = 16
I2C_FREQ = 400000

# OLEDディスプレイのサイズ
OLED_WIDTH = 128
OLED_HEIGHT = 64

# 超音波センサーの初期化
trigger = Pin(TRIGGER_PIN, Pin.OUT)
echo = Pin(ECHO_PIN, Pin.IN)

# I2CとOLEDの初期化
i2c = I2C(0, scl=Pin(I2C_SCL), sda=Pin(I2C_SDA), freq=I2C_FREQ)
oled = SSD1306_I2C(OLED_WIDTH, OLED_HEIGHT, i2c)

def ultrasonic_distance():
    # トリガー信号を送る
    trigger.low()
    utime.sleep_us(2)
    trigger.high()
    utime.sleep_us(10)
    trigger.low()

    # エコー信号を待つ
    while echo.value() == 0:
        start_time = utime.ticks_us()

    while echo.value() == 1:
        end_time = utime.ticks_us()

    # 時間差を距離に変換
    duration = utime.ticks_diff(end_time, start_time)
    distance = (duration / 2) / 29.1 *10  # 距離 (mm)
    return distance

def display_distance(dist):
    oled.fill(0)  # 画面をクリア
    oled.text("Distance:", 0, 0)
    oled.text(f"{dist:.2f} mm", 0, 20)  # 小数点2桁まで表示
    oled.show()

# メインループ
while True:
    try:
        distance = ultrasonic_distance()
        print(f"Distance: {distance:.2f} mm")  # コンソールにも表示
        display_distance(distance)
        utime.sleep(1)
    except KeyboardInterrupt:
        print("終了します")
        break
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次