こんにちは。
今日はとあるプロジェクトで、超音波SENSORを使うことになりました。大量買ってしまいました。
#序論
超音波SENSOR(ウルトラソニック・ウエーブ)はウルトラソニックを送って、あるものにぶつけって戻ってくるウエーブの時間を計算して、距離を出します。ウエーブの速度は340[m/s]です。
##HC-SR04
DATASHEET : Ultrasonic Ranging Module HC - SR04
HC-SR04というmoduleは下のschematicらしいです。
私が後ろを見てみました。
1.TI(Texas Instrument) LM324 : Quadruple Operational Amplifier
2. 不明
3. MAX3232 : MAX3232 3-V to 5.5-V Multichannel RS-232 Line Driver/Receiver
文書によると、まず、10USのHIGH SIGNALがTRIGGERになると、WAVEが8度出ますね。後、ECHO PINにHIGH SIGNALになる時間を計算します。
#本論
ARDUINO UNOを使いました。
コードは二つの方法があります。Libraryを利用しない方法、Libraryを使う方法です。
Libraryは NewPing Libraryを使います。
- Libraryを利用しない方法
const int TRIGGER = 2;
const int ECHO = 4;
void setup()
{
Serial.begin(9600);
pinMode(TRIGGER, OUTPUT); //Trig: output
pinMode(ECHO, INPUT); //Echo: input
}
void loop()
{
long duration, distance;
digitalWrite(TRIGGER, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER, LOW);
//Echo
duration = pulseIn(ECHO, HIGH); //return : time (us)
//音波の反射の時間計算
//1cm移動時間 29us.
//音波の移動距離 = ラウンドトリップ時間/1cm移動距離 / 2
distance = duration / 29 / 2; //센치미터로 환산
Serial.print(distance);
Serial.print("cm");
Serial.println();
delay(100);
}
2.Libraryを使う方法。
ECHOとTRIGGERを一緒に使う。
#include <NewPing.h>
// trigger and echo pins for each sensor
#define SONAR 2
#define MAX_DISTANCE 1000 // maximum distance for sensors
NewPing sonar = NewPing(SONAR, SONAR, MAX_DISTANCE);
void setup() {
Serial.begin(9600);
}
void loop() {
delay(50);
// print all distances
Serial.print("Sonar distance: ");
Serial.println(sonar.ping_cm());
}
どっちがもっと簡単でしょうか
ARDUINOはPORT数が少ないので、NewPing Libraryを使うと、多数のHC-SR04を使うとき、port節約できます。
3.複数の超音波SENSOR使い。
#include <NewPing.h>
#define SONAR1 2
#define SONAR2 3
#define SONAR3 4
#define MAX_DISTANCE 500
#define NUM_SONAR 3 //使うsensorの数量
int distance[NUM_SONAR];
NewPing sonar[NUM_SONAR] = {
NewPing(SONAR1, SONAR1, MAX_DISTANCE),
NewPing(SONAR2, SONAR2, MAX_DISTANCE),
NewPing(SONAR3, SONAR3, MAX_DISTANCE)
};
void setup() {
Serial.begin(9600);
}
void loop() {
delay(50);
updateSonar();
Serial.print("Sonar 1: ");
Serial.print(distance[0]);
Serial.print(" Sonar 2: ");
Serial.print(distance[1]);
Serial.print(" Sonar 3: ");
Serial.println(distance[2]);
}
void updateSonar() {
for (int i = 0; i < NUM_SONAR; i++) {
distance[i] = sonar[i].ping_cm(); // update distance
if (distance[i] == 0)
distance[i] = MAX_DISTANCE;
}
}
#結論
ping_cm()を使うとこんな感じになります。
読みいただきありがとうございました。
次のPostで会いましょう!
Dreamwalker