超音波距離センサー(HC-SR04)とは?
英語では「Ultrasonic Module」(超音波モジュール)、Distance Measuring Transducer Sensor、Ultrasonic Range Sensor、
日本語では「測距センサー」「距離センサー」などと呼ばれています。
センサーから超音波を発生させ、物体にぶつかって反射して戻ってくるまでの時間で距離を測定するモジュールです
Amazonなどでも安価に購入することが出来ます。
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