LoginSignup
2
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-01-16

超音波距離センサー(HC-SR04)とは?

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

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

pic-2-01.jpg

pic-2-02.jpg

HC-SR04のデータシート

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

回路図

回路図

Gradleの設定ファイルに追記

app/build.gradleのdependencies内に以下を追記

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

AndroidManifest.xmlに追記

<application>直下に以下を追記

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

MainActivityに必要な記述を追記

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

2
4
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
2
4