こんにちは! けい(Twitter)です.
今回は,Raspberry Piで人感センサーを使う方法についてまとめていきたいと思います.
人感センサーは他のものと組み合わせると面白いものが作れるので,ぜひ使えるようにしたいセンサーです.
目次
人感センサーについて
HC-SR501
今回使う人感センサーは,Amazonで150円で買えます.結構お値打ちの商品です.
(私は,大須の店で580円で買いました(泣))
白い半球の中で,人体から出る赤外線を感知する仕組みです.データシート
注意するべきなのは,このセンサーは赤外線の変化を検知します.
なので,ずっと同じ場所に人間がいてもセンサーは反応しません.人間がセンサーの前に現れたり,いなくなったりする時に反応します.
商品ページには人感センサーとだけ書いてありますが,実はモーションセンサーです.
ピン配置
私が買った商品には,このような紙にピン配置がまとめられていました.

右側がVcc,真ん中がOUT,左側がGND
というピン配置になっています.
Vccは4.5~20Vです.Raspberry Piで使う場合は5Vで使えます.
OUTは,センサーがonのとき3.3V,センサーがoffのとき0Vを出力します.
つまみ調整
センサーに回せるつまみが2つついています.
一つはセンサー感度で,センサーが感知する距離を設定できます.(3~7m)
もう一つはON時間調整で,センサーがonになった時に,onを維持する時間を調整できます.(5~200s)
例えば,ON時間調整を最大の200秒に設定した場合,一度センサーがonになったら200秒間onが維持されます.つまり,200秒間OUTピンから3.3Vが出力されます.

写真の状態のつまみの方向を「左」とします.このときそれぞれが最小になります.
センサー感度が3mで,ON時間調整が5sです.
これを時計回りに回転し,「右」の状態のとき,最大になります.
センサー感度が7mで,ON時間調整が200sです.
トリガーのジャンパー
先ほどのピン配置の写真を見ると,H/L切り替え端子があります.
Raspberry Piで遊んでみる
回路構成
人感センサーの使い方を学ぶために,簡単な回路を組んでみましょう.

fritzingで人感センサーがなかったので,上の画像のトランジスタを人感センサーに見立ててください.
gpio17に人感センサーのOUT端子,gpio18にLEDの+端子を繋げます.
サンプルコード
上の回路で人感センサーを試してみるサンプルコードをpythonで作りました.
GPIOは,pigpioライブラリを用います.なので,サンプルコードを実行する前に次のコマンドを実行してください.
$ sudo pigpiod
コマンドを実行したら,以下のpythonコードを実行してみてください.
import pigpio
import time
GPIO_IN = 17
GPIO_OUT = 18
pi = pigpio.pi()
pi.set_mode(GPIO_IN, pigpio.INPUT)
pi.set_mode(GPIO_OUT, pigpio.OUTPUT)
pi.set_pull_up_down(GPIO_IN, pigpio.PUD_DOWN)
pi.write(GPIO_OUT, 0)
try:
while True:
DATA = pi.read(GPIO_IN)
print(DATA)
if DATA:
pi.write(GPIO_OUT, 1)
else:
pi.write(GPIO_OUT, 0)
time.sleep(0.5)
except KeyboardInterrupt:
pi.write(GPIO_OUT, 0)
pi.stop()
動作確認
サンプルコードでは,
人感センサーがHIGHのとき,LEDが光る.
人感センサーがLOWのとき,LEDの光を消す.
というようなプログラムが動いています.
プログラムを実行中に,手などを動かしてみてLEDが光れば正常に動いています.人感センサーの出力は,コマンドライン上で’0’または’1’で確認することもできます.
また,Ctrl+Cでプログラムを中断することができます.


左がLOWの状態で,右がHIGHの状態です.
出力値がLOWで0V,HIGHで約3.3V出ていることが分かります.
まとめ
人感センサーは,様々な場所で用いられています.トイレ,夜道のライト,etc..
トイレに長時間いると,勝手にライトが消える経験をしたことはないでしょうか.あの現象は人感センサーはモーションセンサーであるためです.
長時間同じ体勢でいると,赤外線量の差分がなくなって,LOWになってしまいます.
なので,トイレでライトが消えたら激しく体を動かして,センサーにアピールしてみてくださいね.
ではまた!
・H:リピートトリガー
モーションが検出されるたびに,遅延タイマーが再起動されます.つまり,動きがあれば常にOUTピンから3.3Vが出力されます.
・L:シングルトリガー
動きが検出されるとすぐに出力がHIGHになります.ON時間調整によって設定された時間,HIGHを維持します.この期間中の動きは処理されず,タイマーは再起動されません.
つまり,一回動きが検出されると,ON時間調整の時間だけHIGHになり,動きがあっても自動的にLOWにもどります.