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

こんにちは。
今日はとあるプロジェクトで、超音波SENSORを使うことになりました。大量買ってしまいました。
![IMG_3801.jpg](https://qiita-image-store.s3.amazonaws.com/0/137182/85959478-60bb-9ad4-79a9-c0068a481762.jpeg)

#序論

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

![Ultrasonic-Sensor-Equasions.png](https://qiita-image-store.s3.amazonaws.com/0/137182/3de38fbb-cb8f-f56f-efff-8e4396f96a5a.png)

http://howtomechatronics.com/wp-content/uploads/2015/07/Ultrasonic-Sensor-Equasions.png?e739c9

##HC-SR04
DATASHEET : [Ultrasonic Ranging Module HC - SR04 
](http://www.micropik.com/PDF/HCSR04.pdf)
HC-SR04というmoduleは下のschematicらしいです。
![XGuLm.png](https://qiita-image-store.s3.amazonaws.com/0/137182/fc9e1b31-cf64-9715-0e92-829e1098dbcd.png)

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

![그림1.png](https://qiita-image-store.s3.amazonaws.com/0/137182/ee3241b3-4ced-fde6-fc5e-552e61109a5c.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](https://qiita-image-store.s3.amazonaws.com/0/137182/46ed1ed0-3afc-8041-7894-b2dc8e55360e.jpeg)-DATASHEETにより

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

![02.JPG](https://qiita-image-store.s3.amazonaws.com/0/137182/cedd4b6d-8534-1b28-86a7-4e9e96373877.jpeg)

#本論

ARDUINO UNOを使いました。
コードは二つの方法があります。Libraryを利用しない方法、Libraryを使う方法です。
Libraryは [NewPing](http://playground.arduino.cc/Code/NewPing) Libraryを使います。

1. Libraryを利用しない方法

```cpp: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を一緒に使う。

```cpp
#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節約できます。

３．複数の超音波SENSOR使い。

```cpp: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](https://qiita-image-store.s3.amazonaws.com/0/137182/04d9ed05-47aa-bfc9-8ec4-5246d03bdb55.jpeg)

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

![03.JPG](https://qiita-image-store.s3.amazonaws.com/0/137182/ccdfa12f-bf73-eaee-e3ce-821cf8465865.jpeg)

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

**Dreamwalker**