LoginSignup
3
7

More than 5 years have passed since last update.

[ARDUINO] 超音波SENSOR(HC-SR04)を使って距離測定。

Posted at

こんにちは。
今日はとあるプロジェクトで、超音波SENSORを使うことになりました。大量買ってしまいました。
IMG_3801.jpg

序論

超音波SENSOR(ウルトラソニック・ウエーブ)はウルトラソニックを送って、あるものにぶつけって戻ってくるウエーブの時間を計算して、距離を出します。ウエーブの速度は340[m/s]です。

Ultrasonic-Sensor-Equasions.png

HC-SR04

DATASHEET : Ultrasonic Ranging Module HC - SR04

HC-SR04というmoduleは下のschematicらしいです。
XGuLm.png

私が後ろを見てみました。

그림1.png

1.TI(Texas Instrument) LM324 : Quadruple Operational Amplifier
2. 不明
3. MAX3232 : MAX3232 3-V to 5.5-V Multichannel RS-232 Line Driver/Receiver

PARAM

01.JPG-DATASHEETにより

文書によると、まず、10USのHIGH SIGNALがTRIGGERになると、WAVEが8度出ますね。後、ECHO PINにHIGH SIGNALになる時間を計算します。

02.JPG

本論

ARDUINO UNOを使いました。
コードは二つの方法があります。Libraryを利用しない方法、Libraryを使う方法です。
Libraryは NewPing Libraryを使います。

  1. Libraryを利用しない方法
arduino.ino
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使い。

multi_sound.ino

#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;
  }
}

結論

IMG_3803.jpg

ping_cm()を使うとこんな感じになります。

03.JPG

読みいただきありがとうございました。
次のPostで会いましょう!

Dreamwalker

3
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7