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

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

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

Kuman 5個 超音波 センサーモジュール DC 5V 2cm-450cm HC-SR04
Kuman 5個 超音波 センサーモジュール DC 5V 2cm-450cm HC-SR04
Amazon

開発環境

項目バージョン
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();
}

今回使用した製品はこちら

Kuman 5個 超音波 センサーモジュール DC 5V 2cm-450cm HC-SR04
Kuman 5個 超音波 センサーモジュール DC 5V 2cm-450cm HC-SR04
Amazon
Seeed Studio Seeeduino XIAO Arduino IDE 互換ボード SAMD21 Cortex M0+搭載
Seeed Studio Seeeduino XIAO Arduino IDE 互換ボード SAMD21 Cortex M0+搭載
Amazon
DSD TECH 2 PCS OLED 0.91インチディスプレイ  I2C
DSD TECH 2 PCS OLED 0.91インチディスプレイ I2C
Amazon

Arduinoで人気の周辺パーツ

サインスマート(SainSmart) 8チャンネル 5V リレーモジュール for Arduino DSP AVR PIC ARM
サインスマート(SainSmart) 8チャンネル 5V リレーモジュール for Arduino DSP AVR PIC ARM
Amazon
KKHMF 10個 TTP223 静電容量式 タッチ スイッチ ボタン セルフロック モジュール 「国内配送」
KKHMF 10個 TTP223 静電容量式 タッチ スイッチ ボタン セルフロック モジュール 「国内配送」
Amazon
DSD TECH 2 PCS OLED 0.91インチディスプレイ  I2C
DSD TECH 2 PCS OLED 0.91インチディスプレイ I2C
Amazon
OSOYOO(オソヨー) DIY センサーモジュール キット
OSOYOO(オソヨー) DIY センサーモジュール キット
Amazon

人気のArduino互換機

ELEGOO Arduino用 Nanoボード V3.0 CH340/ATmega328P
ELEGOO Arduino用 Nanoボード V3.0 CH340/ATmega328P
Amazon
HiLetgo ESP32ワイヤレススティックLora + WiFi + BLE開発ボード LoRaWAN 868 / 915MHz、0.49インチOLEDディスプレイ
HiLetgo ESP32ワイヤレススティックLora + WiFi + BLE開発ボード LoRaWAN 868 / 915MHz、0.49インチOLEDディスプレイ
Amazon
M5Stack M5StickC Plus ESP32-PICO
M5Stack M5StickC Plus ESP32-PICO
Amazon
M5Stack Core2 開発キットデュアルコア32ビット240Mhz LX6プロセッサー
M5Stack Core2 開発キットデュアルコア32ビット240Mhz LX6プロセッサー
Amazon

Arduinoのオススメ参考書

電子部品ごとの制御を学べる! Arduino 電子工作実践講座 改訂第2版
電子部品ごとの制御を学べる! Arduino 電子工作実践講座 改訂第2版
KindleAmazon
Arduinoをはじめよう 第3版 (Make:PROJECTS)
Arduinoをはじめよう 第3版 (Make:PROJECTS)
Amazon
ESP32&Arduino 電子工作 プログラミング入門
ESP32&Arduino 電子工作 プログラミング入門
KindleAmazon

関連記事

記事に関するご質問などがあれば、ぜひTwitterへお返事ください。