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

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

この記事では、Arduinoと超音波センサー(HC-SR04)を使った距離測定のやり方を説明する。

開発環境

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

Seeeduino XIAOの使い方、こちらの記事を参考に

OLCDディスプレイの使い方、こちらの記事を参考に

ラズパイでHC-SR04は、こちらの記事を参考に

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

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

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

超音波にかかわらず、音波が空気中を伝っていく速さは決まっている。気温や気圧によっても変化するが、たとえば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();
}

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

Seeed Studio Seeeduino XIAO-Arduino IDE 互換ボード SAMD21 Cortex M0+搭載 ブレッドボード互換 USB Type-C(3pcs)
Seeed Studio Seeeduino XIAO-Arduino IDE 互換ボード SAMD21 Cortex M0+搭載 ブレッドボード互換 USB Type-C(3pcs)

Seeeduino XIAO開発ボードは、ARMCortex-M0+ 32ビット48MHzマイクロコントローラー(SAMD21G18)を搭載し、低消費電力です。クロック周波数は48MHzと、Arduino Uno、Arduino Nanoの3倍です。 又、このArduino IDE互換ボードには256KBのフラッシュメモリ、32KBのSRAMも搭載されています。

Amazon
Kuman 5個 超音波 センサーモジュール DC 5V 2cm-450cm 超音波センサHC-SR04+20ピンオスーメスデュポン線+超音波ステント Raspberry Pi B+Robot ロボットに交換 K18
Kuman 5個 超音波 センサーモジュール DC 5V 2cm-450cm 超音波センサHC-SR04+20ピンオスーメスデュポン線+超音波ステント Raspberry Pi B+Robot ロボットに交換 K18

Amazon
DSD TECH 2 PCS OLED 0.91インチディスプレイ IIC I2C シリアルポート Arduino ARM用
DSD TECH 2 PCS OLED 0.91インチディスプレイ IIC I2C シリアルポート Arduino ARM用

0.91インチのOLEDディスプレイ:解像度128 * 32、非常にクリア、黒の背景、青色のテキスト表示。 IIC(I2C)インタフェース:SPIインタフェース画面よりも4つのPIN(VCC、GND、SCL、SDA)だけが簡単です。 他のセンサーを接続するために、さらに多くのポートを残すことができます。

Amazon

Arduinoの参考書

電子部品ごとの制御を学べる! Arduino 電子工作実践講座 改訂第2版
電子部品ごとの制御を学べる! Arduino 電子工作実践講座 改訂第2版

電子パーツを自由自在に組み合わせて電子工作ができるように、Arduinoによる電子部品ごとの制御方法を詳しく解説。初心者や電子工作に躓いた人でも安心して取り組めるよう、豊富な図・写真で徹底解説。2018年発刊の「Arduino 電子工作 実践講座」の改訂版です。

KindleAmazon
Arduinoをはじめよう 第3版 (Make:PROJECTS)
Arduinoをはじめよう 第3版 (Make:PROJECTS)

本書では、開発者自らが、Arduinoの哲学、ハードウェア、ソフトウェアの基礎を解説、誰にでもできる簡単なチュートリアルを行います。

Amazon

最後まで読んでいただきありがとうございました。

「この記事が参考になったよ」という方は、ぜひ記事をシェアをしていただけるととても嬉しいです。

今後も有益な記事を書くモチベーションにつながりますので、どうかよろしくお願いいたします。↓↓↓↓↓↓↓

あなたにおすすめ