「Arduino Mega 2560 LESSON:10 超音波センサーモジュール」の版間の差分
編集の要約なし |
(→概要) |
||
| (同じ利用者による、間の1版が非表示) | |||
| 66行目: | 66行目: | ||
== '''概要''' == | == '''概要''' == | ||
超音波センサーモジュール(HC-SR04)を接続するレッスンです。 | |||
| 182行目: | 182行目: | ||
何が原因かわからないですが、HC-SR04は何も検出しない場合に69.4msecあたりで信号を打ち切るみたいなので、ライブラリのように150msのタイムアウトだと長すぎるみたいです。どうせ400cmくらいまでしかはかれないんだから、30msecくらいがいいですね。次の信号を受け取るときは、逆にディレイは短すぎるか?25msになってるね。ライブラリがとても良いものだと過信するのはよくないかもしれませんね。自分で自分の部品にあった動作をしているか確認する癖くらいは付けておいた方がいいでしょうね。人間には聞こえないけどペットには嫌なものの可能性もあるよコレ。 | 何が原因かわからないですが、HC-SR04は何も検出しない場合に69.4msecあたりで信号を打ち切るみたいなので、ライブラリのように150msのタイムアウトだと長すぎるみたいです。どうせ400cmくらいまでしかはかれないんだから、30msecくらいがいいですね。次の信号を受け取るときは、逆にディレイは短すぎるか?25msになってるね。ライブラリがとても良いものだと過信するのはよくないかもしれませんね。自分で自分の部品にあった動作をしているか確認する癖くらいは付けておいた方がいいでしょうね。人間には聞こえないけどペットには嫌なものの可能性もあるよコレ。 | ||
回路 | |||
*Conn_01x04 | |||
*+5V | |||
*GND | |||
*PWR_FLAG | |||
フットプリント | |||
*Conn_01x04:Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | |||
*Conn_01x04:Connector_PinSocket_2.54mm:PinSocket_1x04_P2.54mm_Vertical | |||
■PCB図 | |||
[[ファイル:Mega2560 L10 02 PCB図.png|380px||none|PCB図]] | |||
■3D Preview図 | |||
[[ファイル:Mega2560 L10 03 3DPreview図.png|380px||none|3D Preview図]] | |||
[[Arduino Mega 2560]]に戻る。 | [[Arduino Mega 2560]]に戻る。 | ||
2026年10月14日 (水) 17:29時点における最新版
概要
超音波センサーモジュール(HC-SR04)を接続するレッスンです。
接続図は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になってるね。ライブラリがとても良いものだと過信するのはよくないかもしれませんね。自分で自分の部品にあった動作をしているか確認する癖くらいは付けておいた方がいいでしょうね。人間には聞こえないけどペットには嫌なものの可能性もあるよコレ。
回路
- Conn_01x04
- +5V
- GND
- PWR_FLAG
フットプリント
- Conn_01x04:Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical
- Conn_01x04:Connector_PinSocket_2.54mm:PinSocket_1x04_P2.54mm_Vertical
■PCB図
■3D Preview図