スキップしてメイン コンテンツに移動

超音波センサ HC-SR04 を使ったリアルタイム距離測定と OLED 表示

 HC‑SR04 超音波距離センサを Raspberry Pi Pico から制御し、OLED(SSD1306 128×64)にリアルタイム表示するデモを MicroPython で作成します。センサが発した超音波が物体で反射し戻るまでの往復時間を計測し、Pico 内蔵温度センサで取得した気温を用いて音速を補正することで、測定精度を高めます。

配線(GPIO ピンアサイン)

機能 デバイス Pico GPIO
SDA OLED (I²C id 0) GP16
SCL OLED (I²C id 0) GP17
TRIG HC‑SR04 GP14
ECHO HC‑SR04 GP15

この構成で、約 0.3 秒ごとに “気温・距離” を更新しながら OLED に表示する MicroPython サンプルを実装します。

ライブラリのインストール(Thonny)

  1. Pico W を PC に接続し、Thonny を開きます。

  2. メニュー [ツール] → [パッケージを管理..] をクリック。

OLED 用ライブラリ

  • 検索窓に ssd1306 と入力 → micropython-ssd1306 を選び Install
    (詳しい手順や日本語解説は、前回の記事を参考にしてください)

ソースコード

from machine import Pin, ADC, I2C, time_pulse_us
import utime
import ssd1306

# ── GPIO 設定 ──────────────────────────────────────────────
TRIG = 14
ECHO = 15
SDA  = 16
SCL  = 17

trigger = Pin(TRIG, Pin.OUT)
echo    = Pin(ECHO, Pin.IN)

# ── OLED 初期化 ────────────────────────────────────────────
i2c  = I2C(0, sda=Pin(SDA), scl=Pin(SCL), freq=400_000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

oled.fill(0)
oled.text("RP2040 + HC-SR04", 0, 0)
oled.text("TEMP:      C",     0, 24)
oled.text("L(cm):",          0, 40)
oled.show()

# ── 内部温度センサ ────────────────────────────────────────
adc   = ADC(4)
VREF  = 3.3
COEFF = VREF / 65535

def read_temperature():
    """内部温度センサから気温 (°C) を返す"""
    v = adc.read_u16() * COEFF
    return round(27 - (v - 0.706) / 0.001721, 1)

# ── HC‑SR04 距離計測 ─────────────────────────────────────
def read_distance(temp):
    """
    距離 (cm) を返す。タイムアウトなら None。
    temp: 気温 (°C) — 音速計算用
    """
    trigger.low()
    utime.sleep_us(2)
    trigger.high()
    utime.sleep_us(15)      # ≥10 µs 必要
    trigger.low()

    # 30 ms タイムアウト (≈5 m)
    t = time_pulse_us(echo, 1, 30_000)
    if t < 0:
        return None

    vs = 331.5 + 0.6 * temp       # 音速 (m/s)
    return round(vs * t / 20000, 1)  # 往復 → 片道換算

# ── OLED 表示ユーティリティ ───────────────────────────────
def show_value(x, y, width, text):
    oled.fill_rect(x, y, width, 8, 0)
    oled.text(text, x, y)

# ── メインループ ─────────────────────────────────────────
while True:
    temp = read_temperature()
    dist = read_distance(temp)

    show_value(48, 24, 40, "{:>4}".format(temp))
    if dist is None or dist > 400:        # HC‑SR04 公称最大 4 m
        show_value(48, 40, 56, "----")
    else:
        show_value(48, 40, 56, "{:>5}".format(dist))

    oled.show()
    utime.sleep(0.3)   # 更新周期(好みで調整)




処理の流れ

  • 🛠 GPIO とデバイス初期化

    • TRIG・ECHO ピンを Pin.OUT / Pin.IN で設定

    • I²C (id 0) を開始し、SSD1306 OLED (128 × 64) を生成

  • 🖥 OLED 画面クリア & ラベル表示

    • oled.fill(0) で全消去 → タイトル・TEMP・L(cm) を描画 → oled.show()

  • ♨️ 内部温度センサ読み取り (read_temperature)

    • ADC4 から電圧を取得

    • データシート公式で °C に換算し、小数 1 桁で返却

  • 📤 センサ TRIG パルス生成 (read_distance)

    • TRIG ↓→15 µs ↑→↓ で発信開始

  • ECHO パルス幅取得

    • time_pulse_us() で High の長さを最長 30 ms 測定(≈5 m)

    • タイムアウト時は None を返す

  • 🧮 音速補正 & 距離計算

    • 音速 vs = 331.5 + 0.6 × temp (m/s)

    • 距離 L = vs × t / 20000 → cm 丸め

  • 🖋 OLED 数値更新 (show_value)

    • 古い数値領域を fill_rect で黒塗り

    • 温度と距離を右寄せ描画し oled.show()

  • 🔄 ループ

    • 0.3 秒スリープ後、再び温度 → 距離 → 表示を継続

コメント

このブログの人気の投稿

Raspberry Pi Pico Wを使ってみよう

   Raspberry Pi Pico W(ラズベリーパイ ピコ ダブリュー) は、英国 Raspberry Pi 財団が 2022 年に発売した Wi-Fi 搭載マイコンボードです。従来の「Raspberry Pi」と聞くと Linux が動くシングルボードコンピュータ(SBC)を思い浮かべがちですが、Pico W は マイクロコントローラ (MCU)に分類され、いわゆる “組み込み開発” を手軽に始められるデバイスです。搭載 MCU はデュアルコア Arm Cortex-M0+(133 MHz 動作)の RP2040 。ここに Infineon 製 CYW43439 チップが追加され、 2.4 GHz IEEE 802.11 b/g/n Wi-Fi(BLE 対応 FW も提供中) が使えるのが最大の特徴です。  開発言語は MicroPython や CircuitPython が真っ先に紹介されることが多いのですが、 公式 Pico SDK を使えば C/C++ でも本格的に開発 できます。SDK は CMake ベースで Windows/macOS/Linux いずれでも利用可能。さらに、Arduino Core RP2040 が整備されたことで Arduino IDE 2.x からも “スケッチ感覚” で書き込みが可能 になりました。したがって、 「まずは Python でサッと試す」 「より高速化や省メモリ化が必要になったら C/C++ へ移行」 といった二段構えの学習ルートが取れるのが魅力です。 メニュー(基礎編) 01. Raspberry Pi Pico Wの開発環境を整える。 02. スイッチで 発光ダイオード(LED) を点灯・消灯させる 03. タイマーで発光ダイオード(LED)を1秒ごとに点滅させる 04. シリアル通信(オウム返し ) 05. シリアル通信(発光ダイオードの点灯・消灯) 06. サーボモーターを動かしてみよう(SG90制御入門) 07. DCモータを動かす(PWM) 08. IRリモートでRGBLED点灯 09. アナログ電圧を測定する(ADCの基本) 10. GPIO割り込み処理 11. リレーを駆動してLEDを制御する 12. DFPlayer で MP3 再生 13. 7 セグ 4 ...

スイッチで発光ダイオード(LED)を点灯・消灯させる

 スイッチを使って発光ダイオード(LED)を制御してみましょう。今回は、スイッチをオンにすると LED が点灯し、オフにすると消灯するように動作させます。もちろん、スイッチと LED を直接接続するのではなく、適切な回路を介して制御します。 1.回路 GPIO16 はデジタル入力として使用し、内部プルアップを有効にします。GPIO15 は出力として設定します。なお、接続には 1kΩ(1キロオーム)の抵抗を使用します。 【ソースコード】 # スイッチで LED を ON / OFF する簡単な例 #   GPIO15 : LED(出力)— LOW で消灯、HIGH で点灯 #   GPIO16 : スイッチ(入力)— 内部プルアップ抵抗を使用 # # ※ 配線例 #   LED のアノード → 1 kΩ 抵抗 → GPIO15 #   LED のカソード → GND #   スイッチ片側   → GPIO16 #   スイッチ反対側 → GND # # ★ 動作 #   スイッチを押す(GPIO16 が LOW)   → LED 点灯 #   スイッチを離す(GPIO16 が HIGH) → LED 消灯 from machine import Pin    # GPIO 制御ライブラリ import utime               # 時間関連(今回は使用しないが拡張用に読み込み) led = Pin ( 15 , Pin.OUT)                 # GPIO15 を出力モードに設定(LED 用) sw   = Pin ( 16 , Pin.IN, Pin.PULL_UP)     # GPIO16 を入力モード+内部プルアップ有効 while True:     if sw. value () == 1 :      # プルアップなので押していないときは 1   ...

シリアル通信(オウム返し)

 Raspberry Pi Pico Wは単体で使うのも便利ですが、パソコンや他のマイコンなど、さまざまな機器と通信できるとさらに活用の幅が広がります。 そこで今回は「シリアル通信」について紹介します。 まずは、パソコンから送られてきたデータをPico Wが受け取り、同じデータをそのままパソコンに送り返す、いわゆる「オウム返し(エコー)」を実装してみましょう。 シリアル通信とは? シリアル通信は、マイコンとパソコンや他の機器がデータを1ビットずつ順番に送受信する通信方式です。Raspberry Pi Pico WではUART(Universal Asynchronous Receiver/Transmitter)というハードウェアを使って実現します。 接続回路  id      TX       RX        baudrate     parity    stopbit  0  GPIO0 GPIO1   9600  なし  1  1  GPIO4 GPIO5   9600  なし  1 今回はUART1(GPIO4:TX、GPIO5:RX)を使用します。 ソースコード例 from machine import UART, Pin # UART1ポートを9600bpsで初期化(ボーレートを指定) sirial = UART ( 1 , 9600 ) # UARTの詳細設定: 9600bps 、データビット8、パリティ無し、ストップビット1で初期化 sirial. init ( 9600 , bits = 8 , parity = None, stop = 1 ) # UARTで文字列を送信する(※MicroPythonではバイト列で送るのが正しいため b '' にしたほうが安全) sirial. write (b 'Hello World \n\r ' )  # 起動時に「Hello World」を送信 # メインループ while True:     # 受信バッファにデータが存在するかチェック     if sirial. any () > 0 : ...