2017-08-18

HC-SR04 超音波センサーモジュールをテスト

HC-SR04は安価な超音波センサーモジュール。
超音波の反射時間を出力してくれるので、音速との積を求めることで距離を測定できる。スペック上の測定可能距離は2cmから450cmと使い勝手がよさそうな感じ。

セットアップ

動作確認用に測定距離を表示できるものを作成する。

以下を用意。

  • HC-SR04 超音波センサーモジュール
  • TM1637 デジタルチューブ
  • Arduino Nano

HC-SR04のTRIGとD9を接続、ECHOをD10と接続。TM1637のDIO、CLKはそれぞれD11、D12に接続。VCCは5Vを使用、GNDをショート。

コード

完全版はGitHubから。
TM1637の制御にDigitalTube librariesを使用。

音速は以下の近似式で求めることができるが、今回は簡便に音速340.29m/sとして計算を行った。

日常生活上の音速の近似式
331.5 + 0.61t

※t=摂氏温度
#include <Arduino.h>
#include <TM1637.h>

const int CLK = 12;
const int DIO = 11;
const int TRIG = 9;
const int ECHO = 10;

const int OFF = 0x7E;

TM1637 tm1637(CLK,DIO);

double duration = 0;
double current = 0;

int8_t DispData[4] = {OFF, OFF, OFF, 0x00};

void display()
{
  int value = current > 9999 ? 9999 : current;
  for (int i=0; i<4; i++) {
    if (value == 0) {
      DispData[3-i] = i == 0 ? 0 : OFF;
    } else {
      DispData[3-i] = value % 10;
      value /= 10;
    }
  }
  tm1637.display(DispData);
}

void setup()
{
  Serial.begin(9600);

  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL);
  display();

  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
}

void loop()
{
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  duration = pulseIn(ECHO, HIGH);  // 往復時間 (usec)
  Serial.println(duration);
  if (duration > 0) {
    // 音速 340.29m/sで計算
    current = duration * 340.29 / 2 / 1000;  // 距離 (mm)
    display();
  }
  delay(250);
}

結果

正確な距離を測定するのはもちろん向いてないので、ドアの開閉を非接触で検知する等、大雑把な使用法が主ではないでしょうか。 見た目が可愛らしいので自走ロボの顔として衝突回避に使うのも良いかもしれません。

あるいは、背後を常に獣の脅威にさらされている方は、後ろ向きに装着して危機に備えるのもよいでしょう。