Android Things에서 적외선 민감 센서 (HC-SR501) 사용

인감 센서(HC-SR501)란?



영어로는 「PIR Motion Sensor」(PIR 모션 센서)
일본어에서는 「초전형 인감 센서 모듈」등이라고 불리고 있습니다.

적외선으로 사람이 통과, 이동하고 있는 것을 검지하는 센서입니다.
Amazon 등에서도 저렴하게 구입할 수 있습니다.





HC-SR501 데이터시트



h tp // w w. 다만 t. jp / 세아 rch. php? 수 rd = HC-SR501
이 근처에서 사양서를 다운로드할 수 있습니다.

회로도





Gradle 설정 파일에 추가



app/build.gradle의 dependencies 내에 다음을 추가
provided 'com.google.android.things:androidthings:0.1-devpreview'

AndroidManifest.xml에 추가



아래 아래에 추가
<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.GpioCallback;
import com.google.android.things.pio.PeripheralManagerService;

import java.io.IOException;

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

    // 上の配線でBCM18の位置に接続している為、BCM18を指定します。
    String mPinName = "BCM18";
    Gpio mGpio;

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

        PeripheralManagerService service = new PeripheralManagerService();
        try {
            mGpio = service.openGpio(mPinName);

            // ピンをインプットモードで動作させます
            mGpio.setDirection(Gpio.DIRECTION_IN);

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

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

    GpioCallback mGpioCallback = new GpioCallback() {
        @Override
        public boolean onGpioEdge(Gpio gpio) {
            try {
                if (gpio.getValue()) {
                    // 人の動きを検知
                    Log.i(TAG, "GPIO High");
                } else {
                    // 人が動かずに一定時間経過
                    Log.i(TAG, "GPIO Low");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return true;
        }

        @Override
        public void onGpioError(Gpio gpio, int error) {
            Log.w(TAG, gpio + ": Error event " + error);
        }
    };

    @Override
    protected void onStart() {
        super.onStart();

        if(mGpio != null) {
            try {
                // コールバックを登録
                mGpio.registerGpioCallback(mGpioCallback);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        if(mGpio != null) {
            // コールバックを解除
            mGpio.unregisterGpioCallback(mGpioCallback);
        }
    }
}

실행 결과


  • 사람의 움직임을 감지했다
  • 01-05 20:24:49.800 13954 13954 I MainActivity: GPIO High
    
  • 사람의 움직임을 일정 시간 감지하지 못함
  • 01-05 20:24:51.590 13954 13954 I MainActivity: GPIO Low
    

    Gpio#setDirection에 지정할 수 있는 값



    핀 입출력 유형과 기본값을 지정할 수 있습니다.



    의미


    Gpio.DIRECTION_IN
    입력 모드

    Gpio.DIRECTION_OUT_INITIALLY_HIGH
    출력 모드(초기값 HIGH)

    Gpio.DIRECTION_OUT_INITIALLY_LOW
    출력 모드(초기값 LOW)


    Gpio#setActiveType에 지정할 수 있는 값



    HIGH가 돌아올 때 반환할 값을 지정합니다.



    의미


    Gpio.ACTIVE_HIGH
    HIGH가 반환되면 true를 반환합니다.

    Gpio.ACTIVE_LOW
    HIGH가 반환되면 false를 반환합니다.


    Gpio#setEdgeTriggerType에 지정할 수 있는 값



    무엇을 트리거에 값의 변화를 감지하는지 지정



    의미


    Gpio.EDGE_NONE
    기본값(값 변경을 감지하지 않음)

    Gpio.EDGE_BOTH
    HIGH 또는 LOW로 값이 변경되었을 때

    Gpio.EDGE_RISING
    LOW에서 HIGH로 값이 변할 때

    Gpio.EDGE_FALLING
    HIGH에서 LOW로 값이 변경되면

    좋은 웹페이지 즐겨찾기