Android Thingsで超音波距離センサー(HC-SR04)を使う

# 超音波距離センサー(HC-SR04)とは？
英語では「Ultrasonic Module」（超音波モジュール）、Distance Measuring Transducer Sensor、Ultrasonic Range Sensor、
日本語では「測距センサー」「距離センサー」などと呼ばれています。

センサーから超音波を発生させ、物体にぶつかって反射して戻ってくるまでの時間で距離を測定するモジュールです
Amazonなどでも安価に購入することが出来ます。

![pic-2-01.jpg](https://qiita-image-store.s3.amazonaws.com/0/129712/ba026348-c082-e121-fb47-bc34a7e2b9a5.jpeg)

![pic-2-02.jpg](https://qiita-image-store.s3.amazonaws.com/0/129712/7baae80f-11ae-0a67-29e4-123a4adec4c2.jpeg)

# HC-SR04のデータシート
http://www.datasheet.jp/search.php?sWord=HC-SR04
この辺から仕様書をダウンロードできます

# 回路図

![回路図](https://qiita-image-store.s3.amazonaws.com/0/129712/4fa921e5-1480-460d-73c7-0eac66360b37.png)



# Gradleの設定ファイルに追記
app/build.gradleのdependencies内に以下を追記

```
provided 'com.google.android.things:androidthings:0.1-devpreview'
```

# AndroidManifest.xmlに追記
**&lt;application&gt;**直下に以下を追記

```xml
<uses-library android:name="com.google.android.things"/>
```

# MainActivityに必要な記述を追記

```java
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import com.google.android.things.pio.Gpio;
import com.google.android.things.pio.PeripheralManagerService;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

public class MainActivity extends Activity {
    static final String TAG = MainActivity.class.getSimpleName();

    // 上の配線でBCM4の位置にトリガーピンを接続、BCM17にエコーピンしている為、以下のように指定します。
    String mPinName_Trig = "BCM4";
    String mPinName_Echo = "BCM17";
    Gpio mGpioTrig, mGpioEcho;

    private Thread mThread;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        PeripheralManagerService service = new PeripheralManagerService();

        try {
            mGpioTrig = service.openGpio(mPinName_Trig);
            mGpioEcho = service.openGpio(mPinName_Echo);

            // トリガーピンをアウトプットモード（デフォルト値=LOW）で動作させます
            mGpioTrig.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);

            // エコーピンを入力モードで動作させます
            mGpioEcho.setDirection(Gpio.DIRECTION_IN);

            // センサーがHighを返した時にtrueを返すようにします
            mGpioEcho.setActiveType(Gpio.ACTIVE_HIGH);

            // センサーがHigh,Lowどちらかに変更になった場合にコールバック関数を呼び出す
            mGpioEcho.setEdgeTriggerType(Gpio.EDGE_BOTH);
        } catch (IOException e) {
            Log.e(TAG, "Error on PeripheralIO API", e);
        }

        mThread = new Thread(mRunnable);
        mThread.start();
    }

    Runnable mRunnable = new Runnable() {

        public long mStartTime, mEndTime;

        @Override
        public void run() {
            try {
                mGpioTrig.setValue(true);
                TimeUnit.MICROSECONDS.sleep(10);
                mGpioTrig.setValue(false);

                // trueが返る直前の時間を保持
                while (mGpioEcho.getValue() == false) {
                    mStartTime = System.currentTimeMillis();
                }

                // falseが返る直前の時間を保持
                while (mGpioEcho.getValue() == true) {
                    mEndTime = System.currentTimeMillis();
                }

                long timepassed = mEndTime - mStartTime;
                Log.d(TAG, "経過時間(ミリ秒): " + timepassed);
                long distance = timepassed * 17150 / 1000;
                Log.d(TAG, "距離(cm): " + distance);

            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
}
```

# 実行結果

```
01-15 15:56:59.405 27868-27885/? D/MainActivity: 経過時間(ミリ秒): 2
01-15 15:56:59.405 27868-27885/? D/MainActivity: 距離(cm): 34
```

# 距離の計算式

音速 = 34300cm/s で計算

距離 = 速度 * 時間 / 2
距離 = 速度 * 34300 / 2
距離 = 速度 * 17150