前に戻る

これは Grove インターフェース互換のマグネットスイッチモジュールです。CT10 密閉型リードスイッチをベースにして

M5StickC Plus2 × 超音波距離センサ HC-SR04

超音波距離センサー HC-SR04 とは?

HC-SR04 は、超音波を使って物体までの距離を測るセンサーです。
ロボットや電子工作でよく使われ、「目が2つある」見た目が特徴です。


仕組み

① 超音波を出す

  • センサーの Trig(トリガ) ピンに短いパルスを送る
  • すると、右側の送信器から 超音波(人には聞こえない音) が出る

② 跳ね返りを待つ

  • 超音波が物体に当たる
  • 反射して戻ってくる

③ 戻ってきた時間を測る

  • 左側の受信器が反射波を受信
  • Echo(エコー)ピンが HIGH になっている時間を測る

距離が分かる理由

  • 音は 空気中を一定の速さ(約340m/s) で進む
  • 「行って戻るまでの時間」が分かれば、距離は計算できる

距離の計算式(cm)

距離 = (音が返ってくるまでの時間 × 音速) ÷ 2

ArduinoやESP32では、だいたいこう書くことが多い:

distance_cm = duration * 0.0343 / 2;

1) 準備

  • M5StickC Plus2
  • 超音波距離センサ HC-SR04
  • ジャンパ線
  • 抵抗 2本(1kΩ + 2kΩ 程度)※重要

※HC-SR04は Groveではない(直配線)


2) HC-SR04の超要点

  • 右:送信(Trig)
  • 左:受信(Echo)
  • 超音波を出して → 反射が返るまでの時間を測る
  • 距離 = 時間 × 音速 ÷ 2

4) 配線(安全版・確定)

電源

  • HC-SR04 VCC → M5 5V
  • HC-SR04 GND → M5 GND

信号

  • Trig → GPIO32(3.3V出力でOK)
  • Echo → GPIO33

5) サンプルコード(M5表示つき・最小)

#include <M5Unified.h>

const int TRIG_PIN = 32;
const int ECHO_PIN = 33;

void setup() {
  M5.begin();
  M5.Display.setTextSize(2);

  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
}

void loop() {
  // トリガパルス
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(5);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  // Echo時間取得
  long duration = pulseIn(ECHO_PIN, HIGH, 30000); // 30msタイムアウト

  // 距離計算(cm)
  float distance = duration * 0.0343 / 2.0;

  M5.Display.setCursor(0, 0);
  if (duration == 0) {
    M5.Display.println("Out of range");
  } else {
    M5.Display.printf("Dist:\n%.1f cm\n", distance);
  }

  delay(200);
}

6) 動作確認

  • センサ正面に手を近づける
  • 数値が 10〜200cm 程度で変化すればOK
  • 近すぎ(<2cm)・遠すぎ(>4m)は不安定

7) よくあるハマりどころ

Q1. 値が出ない / 0のまま

  • Echo分圧忘れ
  • Trig/Echo逆
  • pulseIn タイムアウト

Q2. 数値がガタガタ

  • 壁が斜め
  • 柔らかい物(布・服)
  • 超音波が拡散してる