Arduino Mega 2560 LESSON:10 超音波センサーモジュール

提供:yonewiki
2026年10月14日 (水) 16:54時点におけるYo-net (トーク | 投稿記録)による版

Arduino Mega 2560に戻る。

概要

 超音波センサーモジュールを接続するレッスンです。


 接続図はTinkercadでは同じ超音波センサーモジュールが無いので作れませんでした。


 完成図は以下のような感じです。


完成図


 コードは以下のようなモノです。

//www.elegoo.com
//2016.12.08
#include "SR04.h"
#define TRIG_PIN 12
#define ECHO_PIN 11
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
long a;

void setup() {
   Serial.begin(9600);
   delay(1000);
}

void loop() {
   a=sr04.Distance();
   Serial.print(a);
   Serial.println("cm");
   delay(1000);
}


ライブラリの中身 SR04.h

Arduino Mega 2560 LESSON:10 超音波センサーモジュール SR04.h


ライブラリの中身 SR04.cpp

Arduino Mega 2560 LESSON:10 超音波センサーモジュール SR04.cpp


 机から天井の高さ、机から床までの高さ、あわせて床から天井までの高さなど、短いメジャーで測れないような長さもおおよその距離が測れるのでいいですね。但し、コンピュータに接続しておかなければならず、LCDなどをMega2560に搭載して、電池駆動にしないと携帯性がないのでいろんなところを測るというのは難しい。あとは面との距離なので、測りたいところに板などを当ててあげないといけないですね。おおよその距離なので、実際に表示された距離を信じると誤差があるのでピッタリにおさまるような設計をしたいときなんかには使えない距離です。おおよそを測りたいときに向いてる。目に見えないところの距離を測っているので、どことどこの距離なのかがわからない謎仕様であるので、使い道はかなり限られると思うな。


ライブラリを使わなくても

#define TRIG_PIN 12
#define ECHO_PIN 11

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

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

    digitalWrite(TRIG_PIN, LOW);
}

void loop() {
    // ① 超音波の発射を指示 10μsecのHIGHパルスをトリガピンに信号を送る
    digitalWrite(TRIG_PIN, LOW);
    delayMicroseconds(2);

    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN, LOW);

    // ② 反射波の往復時間を測定(µs)
    unsigned long duration = pulseIn(ECHO_PIN, HIGH, 30000UL);

    // ③ 往復時間から距離を計算(cm)
    if (duration == 0) {
        Serial.println("測定できませんでした");
    } else {
        float distance = duration * 0.034 / 2.0;
        //秒速340mなので秒速34000cmで1μ秒あたりだと0.034cm/μsecになる。これに掛かった時間を掛ける
        //往復にかかった時間なので2で割ると片道の距離cmになる。

        Serial.print("時間: ");
        Serial.print(duration);
        Serial.print(" us  距離: ");
        Serial.print(distance, 2);
        Serial.println(" cm");
    }

    delay(1000);
}


 ライブラリのcm換算するときの計算式は


\[ t=\frac{2}{340}\times1000000 \]


\[ t \approx5882\ \mu s \]


となっていて、音が往復 \( 2[m] \) 進むのにかかる時間として \( 2[m]\div340[m/s] =0.005882[s] \)を計算しています。つまり\( 1[m] \)進むのに\( 5882[\mu s] \)かかるということです。なのでパルス幅の時間\( [\mu s] \)を\( 5882[\mu s] \)で割れば距離が求まるという仕組みを使っています。最後に100を掛けてmで表示されていた単位をcmに変換しています。


\[ 距離(cm)=\frac{測定時間(\mu s)\times100}{5882} \]


ライブラリのほうはタイムアウトしたときに変な値が返ってくるのですが、自分で測定した方は「計測できませんでした」と返すことができています。ライブラリよりは自分で作った方がわかりよいこともありますね。


何が原因かわからないですが、HC-SR04は何も検出しない場合に69.4msecあたりで信号を打ち切るみたいなので、ライブラリのように150msのタイムアウトだと長すぎるみたいです。どうせ400cmくらいまでしかはかれないんだから、30msecくらいがいいですね。次の信号を受け取るときは、逆にディレイは短すぎるか?25msになってるね。ライブラリがとても良いものだと過信するのはよくないかもしれませんね。自分で自分の部品にあった動作をしているか確認する癖くらいは付けておいた方がいいでしょうね。人間には聞こえないけどペットには嫌なものの可能性もあるよコレ。

 

Arduino Mega 2560に戻る。