距離計 > HC-SR04 + GP2Y0A710K > HC-SR04の測定ではまった > プルアップ抵抗 / 回路図

```txt:動作環境
ESP-WROOM-02 (以下ESP8266)
昇圧回路 (3V -> 5V) (http://akizukidenshi.com/catalog/g/gM-03451/)
距離センサー: HC-SR04 (http://akizukidenshi.com/catalog/g/gM-08762/)
距離センサー: GP2Y0A710K (http://akizukidenshi.com/catalog/g/gI-03157/)
```

距離計に使う HC-SR04とGP2Y0A710Kを入手済。
ブレッドボードに昇圧回路、HC-SR04(左)、GP2Y0A710K (右:線は未接続)を実装。

![DSC_0184.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/24ca1931-c7c2-19ee-7a22-86ca1bb16598.jpeg)

## GP2Y0A710Kの「距離-電圧」関係式

GP2Y0A710Kのデータシート（紙）に「距離-電圧」の関係式が掲載されている。[youtubeの動画](https://www.youtube.com/watch?v=41_s3jayJEg&index=29&list=WL)など見ていると、「距離-電圧」の関係式は実際の測定データから求めるようだ。

定規を用意して、距離を設定しながらデータを測定していく。そのデータから関係式を導出する。

面倒だ。もっと簡単な方法はないものか。

ふと、HC-SR04で測定しながら、GP2Y0A710Kの電圧を取込んで二者のデータから関係式を作ればいいと思った。

4時間後、HC-SR04がうまく動かない状況の中、「簡単な方法」を実装しようとする自分がいた。。。

## HC-SR04のコード

### code > 間違ったコード

<font color=red>(追記 2016/07/11)
以下のコードではkTrigPinをHレベルにした後１００msec待機している。待機時間の単位が間違っていて、正しくは10usec以上であった。
</font>


HC-SR04のコードは@exabugsさんの[コード](http://qiita.com/exabugs/items/088f3f9229674be9e436)を参考にさせていただいた。

ただし、以下ではGPIO12, GPIO13を使っている。理由は後述。
温度補正はまだ入っていない。

```c:esp8266_160708_HC-SR04.ino
/*
 * v0.1 2016 Jul. 09
 *   - calculate distance in [cm]
 *   - receive echo in loop() 
 *   - send trigger in loop()
 *   - set pinMode() at setup()
 */

#include <ESP8266WiFi.h>

static const int kTrigPin = 12;
static const int kEchoPin = 13;

void setup() {
  WiFi.disconnect(); // avoid watchdog reset by WiFi thread

  Serial.begin(115200);
  Serial.println("");

  pinMode(kTrigPin, OUTPUT);
  pinMode(kEchoPin, INPUT);
}

void loop() {
  // trigger
  digitalWrite(kTrigPin, HIGH);
  delay(100); // msec
  digitalWrite(kTrigPin, LOW);

  // echo
  int interval_us;
  interval_us = pulseIn(kEchoPin, HIGH) / 2; // 2: round-trip
  
//  Serial.print(interval_us);
//  Serial.print(", ");
  
  float dst_m = (float)interval_us * 340.0 / 1000.0 / 1000.0;
  float dst_cm = dst_m * 100.0;

  Serial.println(dst_cm);
  delay(10); // msec

//  delay(1000); // msec
}
```

### はまった点

IO4, IO5は気圧計や距離計の実装で使った基板でプルアップしたものを使用していた。
プルアップしているから、ECHOピンはずっとHIGHになってしまい、pulseIn()が戻らずに待ちが長すぎてwatchdog resetがかかる、という今から思えば簡単な失敗を続けていた。

IO12, IO13(プルアップしていない)を使うことで、ようやく測定ができるようになった。

### 測定例

シリアルプロッタを使ってみた (参考 http://qiita.com/umi_kappa/items/632c02d5d749004619ef )。

HC-SR04の前に置いた箱を前後に移動した状況が下記の図で定性的に測定できた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1ac3ac10-89c2-9ee8-4c9c-8e4a0421009f.png)


### 回路図

（追記 2016/07/10)

GP2Y0A710Kも接続する時の回路図は以下となる。
FTDIアダプタの接続は省略した。
https://upverter.com/7of9/0440e7247433a89e/160710_ESP8266_HC-SR04_GP2Y0A710K/

### code > 訂正版

(追記 2016/07/11)

前述のコードではkTrigPinをHレベルにした後の待機時間の単位が間違っていた。以下に訂正する。

```c:esp8266_160708_HC-SR04.ino
/*
 * v0.2 2016 Jul. 11
 *   - fix bug > wait for kTrigPin was in msec not in usec
 * v0.1 2016 Jul. 09
 *   - calculate distance in [cm]
 *   - receive echo in loop() 
 *   - send trigger in loop()
 *   - set pinMode() at setup()
 */

#include <ESP8266WiFi.h>

static const int kTrigPin = 12;
static const int kEchoPin = 13;

void setup() {
  WiFi.disconnect(); // avoid watchdog reset by WiFi thread

  Serial.begin(115200);
  Serial.println("");

  pinMode(kTrigPin, OUTPUT);
  pinMode(kEchoPin, INPUT);
}

void loop() {
  // trigger
  digitalWrite(kTrigPin, HIGH);
  delayMicroseconds(100);
  digitalWrite(kTrigPin, LOW);

  // echo
  int interval_us;
  interval_us = pulseIn(kEchoPin, HIGH) / 2; // 2: round-trip

//  Serial.print(interval_us);
//  Serial.print(", ");

  float dst_m = (float)interval_us * 340.0 / 1000.0 / 1000.0;
  float dst_cm = dst_m * 100.0;

  Serial.println(dst_cm);
  delay(100); // msec

//  delay(1000); // msec
}
```