Arduinoで超音波センサHC-SR04の使い方【距離測定】

Arduinoで超音波センサーHC-SR04の使い方【距離測定】
Arduinoで超音波センサーHC-SR04の使い方【距離測定】

この記事では、Arduinoと超音波センサー(HC-SR04)を使った距離測定のやり方を説明する。HC-SR04は、超音波の送信機と受信機が一体になったセンサモジュールである。信号の送受信はHC-SR04が自動でやってくれるため、扱い方はカ簡単である。Arduinoに慣れてない方も恐れずやってみよう!

開発環境

項目バージョン
ArduinoデバイスSeeeduino XIAO
超音波センサーHC-SR04
OLEDディスプレイDSP TECH 0.91インチディスプレイ
Arduino IDE1.8.10
パソコンmacOS Big Sur 11.0.1

なぜ超音波で距離が測定できるの?

超音波で距離が測定できる仕組み
超音波で距離が測定できる仕組み

はじめに、超音波で距離が測定できる仕組みを説明する。そもそも超音波とは、人間の耳には「聞こえない」または「聞こえにくい」音域の音のこと。

超音波にかかわらず、音波が空気中を伝っていく速さは決まっている。気温や気圧によっても変化するが、たとえば1気圧で20度のとき秒速343.7m/sである。

音波の速度が分かれば、音波を発信して戻ってくるまでの時間を測定することで距離を測定できる。計算式は次の通り。

$$ 距離 = 音速 \times \frac{往復時間}{2} $$

音速の定義

音波が空気中を伝っていく速さは、次式で求められる。ただし、1気圧で空気が乾燥しているという条件。tは摂氏温度、音速の単位はm/s。

$$ 音速 = 331.5 + 0.61t$$

距離の計算方法

たとえば、気温を20度と仮定し、超音波を発信してから受信するまでの往復時間をT秒とする。すると、次式で距離が導き出される。距離の単位はメートル。

$$ 距離 = 331.5 + 0.61 \times 20 \times \frac{T}{2} $$

音は高域であるほど直進する性質を持っている。これを指向性と呼んだりする。だから、対象にしぼって距離を測定したい場合、周波数が高い音波の方が都合良いのだ。

以上が超音波で距離を測定できる仕組みの説明となる。

HC-SR04で距離を計測する

ここまで理解できれば、あとは超音波センサーHC-SR04の使い方を覚えれば良い。HC-SR04の使い方は、次の3つのポイントを理解すれば何ら難しくはない。

HC-SR04の使い方のポイント

  1. Triggerピンを10μ秒Highにすると、超音波パルス(40kHz)が発信される
  2. ❶が終了したタイミングでEchoピンはHighとなる
  3. 跳ね返ってきたパルスを受信するとEchoピンがLowとなる

上の流れを図で表すと図のようになる。

HC-SR04のTriggerとEchoのフロー図
HC-SR04のTriggerとEchoのフロー図

HC-SR04で距離を測定するには、EchoピンがHighからLowに変わるまでの時間を計ればよい。つまり、❷から❸の往復時間を監視すれば距離を導き出せるのだ。

HC-SR04の詳細はこちら。

HC-SR04とArduinoの配線

それでは、HC-SR04とArduinoの配線をしていこう。

配線

HC-SR04Arduino
Vcc5V
TrigD1
EchoD2
GNDGND

Seeeduino XIAOで使う場合の注意点

Seeeduino XIAOのGPIOピンと、HC-SR04のEchoピンは直接接続してはいけない。

なぜなら、HC-SR04のEchoピンからは5Vの信号が出力されるからだ。XIAOへの入力は3.3Vまでの電圧にしなければならない。だから図のような分圧抵抗で、5V電圧を3.3Vに変換して接続する。

分圧抵抗で5V電圧を3.3Vに変換する回路図
分圧抵抗で5V電圧を3.3Vに変換する回路図

HC-SR04のTriggerピンの場合、3.3Vの電圧でも動作するのでXIAOのGPIOをそのまま接続して問題はない。ここら辺は、MOSFETの動作がわかると理解できる。

MOSFETの仕組みを詳しく知りたい場合は、こちらの記事を参考に。

距離測定プログラム

Arduino IDEでSketchファイルを作成して、以下のプログラムを実行してみよう。シリアルモニターを開くと、距離(cm)が表示される。また、プログラム中のpulseInは、Echoピンを監視してHighときの時間をマイクロ秒で返してくれる。Arduino言語において標準で使える関数だ。

/*
  Created by Toshihiko Arai.
  https://101010.fun/iot/arduino-hc-sr04.html
*/

#define TrigPin 1 // D1
#define EchoPin 2 // D2
 
double speedSound = 331.5 + 0.61 * 20; // 20は現在の気温
double distance = 0;


void setup() {
  Serial.begin(9600);
  pinMode(TrigPin, OUTPUT);
  pinMode(EchoPin, INPUT);
}


void loop() {
  trigger();

  double t = pulseIn(EchoPin, HIGH); // μS

  if (t > 0) {
    t = t / 2; //往復距離なので半分の時間
    distance = t * speedSound * 100 / 1000000; // 距離(cm)を計算
    Serial.println(distance);
  }
  delay(500);
}

void trigger() {
  digitalWrite(TrigPin, LOW); 
  delayMicroseconds(2);
  digitalWrite(TrigPin, HIGH );
  delayMicroseconds( 10 );
  digitalWrite(TrigPin, LOW );
}

【おまけ】距離をOLEDディスプレイに表示させてみよう

超音波センサで距離の測定
超音波センサで距離の測定

シリアルモニターではなく「OLEDディスプレイ」へ表示できるよう、さきほどのプログラムを少し改造した。対象物との距離を、5cm・10cm・20cm・30cmと変えて測定。なかなか正確な距離が測定できた。

プログラム中のu8g2.drawStrはchar型で文字を渡してあげなければいけない。だからdouble値をchar型へ変換させるため、snprintf関数を使っている。

/*
  Created by Toshihiko Arai.
  https://101010.fun/iot/arduino-hc-sr04.html
*/

#include <U8g2lib.h>

U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

#define TrigPin 1 // D1
#define EchoPin 2 // D2
 
double speedSound = 331.5 + 0.61 * 20; // 20は現在の気温


void setup() {
  Serial.begin(9600);
  pinMode(TrigPin, OUTPUT);
  pinMode(EchoPin, INPUT);

  u8g2.begin();
}


void loop() {
  trigger();

  double distance = 0;
  double t = pulseIn(EchoPin, HIGH); // μS

  if (t > 0) {
    t = t / 2; //往復距離なので半分の時間
    distance = t * speedSound * 100 / 1000000; // 距離(cm)を計算
    displayOLCD(distance);
  }
  delay(500);
}

void trigger() {
  digitalWrite(TrigPin, LOW); 
  delayMicroseconds(2);
  digitalWrite(TrigPin, HIGH );
  delayMicroseconds( 10 );
  digitalWrite(TrigPin, LOW );
}


void displayOLCD(double distance) {
    char buf[10];
    snprintf(buf, 10, "%.1fcm", distance);

    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_crox3hb_tf);
    u8g2.drawStr(0, 16, "Distance");
    u8g2.drawStr(0, 32, buf);
    u8g2.sendBuffer();
}
記事に関するご質問などがあればTwitterへお返事ください。
この記事で紹介した商品
人気のArduino互換機
Arduinoで人気の周辺パーツ
Arduinoのオススメ参考書

▼ Arduino初心者向きの内容となっています。ほかのArduino書籍と比べて図や説明がとてもていねいで、読みやすかったです。Arduinoで一通りのセンサーが扱えるようになります。

▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。

▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。

関連記事