部品 · 読了まで6分

PIR人感センサー(HC-SR501):Arduino、ESP32、Picoで動きを検知する

PIR人感センサーはどう動くのか。HC-SR501の配線、感度と時間の調整、H/Lトリガーモード、Arduino・ESP32・Picoのコード、人感ライト、誤検知を防ぐ方法を解説します。

PIR(Passive InfraRed:受動型赤外線)センサーは、視野の中で人や動物が動いたことを検知する、安くて消費電力がとても小さいセンサーです。自動で点く階段の照明、防犯システム、自動のドアチャイムの多くはPIRを使っています。「受動型」とは、センサー自身は何も出さず、周囲の温かい物体が出す赤外線を受け取るだけ、という意味です。Arduinoのプロジェクトでいちばん人気のモデルはHC-SR501です。

HC-SR501 PIR人感センサー
HC-SR501 PIRセンサー:白いドームはフレネルレンズです。下の基板には調整用の半固定抵抗(トリマー)が2つと、トリガー切り替えのジャンパーがあります。

PIRセンサーはどう動く?

絶対零度より温かい物体はすべて赤外線を出していて、人の体は9〜10マイクロメートルの波長でもっとも強く放射します。センサーの中心には、この放射に反応する焦電素子があり、2つの半分に分かれています。何も動いていないときは両方が同じ量の放射を受け、信号が打ち消し合って出力は静かなままです。誰かが視野を横切ると、まず片方、次にもう片方がより多くの放射を受けます。モジュールの回路がこの差をとらえ、OUTピンがHIGHになります。

上の白いドームはフレネルレンズです。視野を数十個の小さなゾーンに分け、各ゾーンからの放射を素子に集めます。人があるゾーンから次のゾーンへ動くと信号が変わります。そのため、PIRセンサーは動きの検知は得意ですが、まったく動かずに立っている人は検知できません。

HC-SR501の仕様

項目値
電源電圧4.5〜20 V(推奨5 V)
待機電流約50 µA
出力デジタル:動きありで3.3 V、なしで0 V
検知距離3〜7 m(調整可能)
検知角度約110°
出力時間約3秒〜5分(調整可能)
ブロッキング時間出力がオフになってから約2.5秒
ウォームアップ時間電源投入時に30〜60秒

モジュールの設定

  • Sx(感度)半固定抵抗:検知距離を設定します。時計回りに回すと、距離が約3メートルから7メートルまで広がります。
  • Tx(時間)半固定抵抗:動きを検知したあと出力がHIGHのままでいる時間を設定します。時計回りに回すと長くなります。
  • トリガージャンパーH(リピート):動きが続いている間、タイマーが毎回リセットされます。照明の制御に最適です。
  • トリガージャンパーL(シングル):動きが続いていても、時間が切れると出力がLOWになります。その後は新たなトリガーが必要です。
  • ブロッキング時間:出力がLOWになってから約2.5秒間は、新しい動きを検知しません。これは調整できません。
試し始めるときは、2つの半固定抵抗をどちらもいっぱいまで反時計回りに回し(時間が最短、感度が最低)、ジャンパーをHにしておきましょう。こうすればテストのたびに何分も待たずに済みます。時間はあとからコードで設定するほうがずっと柔軟です。

HC-SR501のピン配置と配線

ピン機能Arduino UnoESP32Raspberry Pi Pico
VCC電源5VVIN (5V)VBUS (5V)
OUTデジタル出力(3.3 V)D2GPIO 27GP16
GNDグラウンドGNDGNDGND
ほとんどのモジュールでは、ピン名が基板の表、白いドームの下に印刷されています。ドームはそっと引っぱれば外せるので、表示を読んでから押し戻してください。

Arduinoで動きを検知する

下のコードはセンサーのウォームアップを待ってから、動きが始まったときと終わったときに1回ずつシリアルモニタにメッセージを表示し、Arduinoの内蔵LEDをオン・オフします。出力を何度も表示し続けるのではなく状態の変化だけを見るのは、実際のプロジェクトでも使う考え方です。

C++ (Arduino IDE)
1const int PIR_PIN = 2;
2const int LED_PIN = 13;        // dahili LED / built-in LED
3
4bool motion = false;
5
6void setup() {
7  pinMode(PIR_PIN, INPUT);
8  pinMode(LED_PIN, OUTPUT);
9  Serial.begin(9600);
10  Serial.println("Sensör ısınıyor / warming up...");
11  delay(30000);                  // ilk 30 sn kararsız / unstable for ~30 s
12  Serial.println("Hazır / ready");
13}
14
15void loop() {
16  bool now = digitalRead(PIR_PIN);
17  if (now && !motion) {
18    Serial.println("Hareket algılandı / motion detected");
19    digitalWrite(LED_PIN, HIGH);
20    motion = true;
21  } else if (!now && motion) {
22    Serial.println("Hareket bitti / motion ended");
23    digitalWrite(LED_PIN, LOW);
24    motion = false;
25  }
26}
電源を入れた直後、センサーは30〜60秒かけて周囲を「学習」し、その間に勝手にトリガーすることがあります。コードでその時間だけ待つか、最初のトリガーを無視すれば、システムを起動するたびの誤報を防げます。

人感ライト:millis()で時間を管理する

点灯時間をモジュールのTx半固定抵抗ではなくコードで管理するほうが、ずっと柔軟です。下のコードは動きを検知するたびに時刻を記録し、最後の動きから20秒後にライトを消します。そのため、部屋の中で誰かが動いている間はライトが点いたままになります。LIGHT_PINにはLEDを、商用電源のランプならリレーモジュールをつなぎます。アクティブLOWのリレーを使う場合は、最後の行のHIGHとLOWを入れ替えてください。リレーの配線はリレーモジュールとは?で解説しています。

C++ (Arduino IDE)
1const int PIR_PIN = 2;
2const int LIGHT_PIN = 7;               // LED ya da röle / LED or relay
3const unsigned long ON_TIME = 20000;   // son hareketten sonra 20 sn / 20 s after last motion
4
5unsigned long lastMotion = 0;
6
7void setup() {
8  pinMode(PIR_PIN, INPUT);
9  pinMode(LIGHT_PIN, OUTPUT);
10}
11
12void loop() {
13  if (digitalRead(PIR_PIN) == HIGH) {
14    lastMotion = millis();             // her harekette süreyi yenile / refresh on every motion
15  }
16  bool on = (lastMotion != 0) && (millis() - lastMotion < ON_TIME);
17  digitalWrite(LIGHT_PIN, on ? HIGH : LOW);
18}

ESP32とRaspberry Pi PicoでPIRを使う

HC-SR501の出力はもともと3.3 Vなので、分圧回路なしでESP32やPicoに直接つなげます。ただし、モジュール自体は5 Vから給電してください。基板上のレギュレーターが4.5 V未満では不安定になるためです。ESP32では同じArduinoのコードが動きます。電池で動かすプロジェクトでは、ESP32をディープスリープにしてPIRの出力で起こす(ext0 wakeup)と、電池の持ちが何週間も延びます。MicroPythonを使うPicoでは、割り込みを使えば動きを取りこぼさずにとらえられます。

MicroPython
1from machine import Pin
2import time
3
4pir = Pin(16, Pin.IN)            # GP16
5led = Pin(25, Pin.OUT)           # dahili LED; Pico W'de Pin("LED") / onboard LED; Pin("LED") on Pico W
6
7def on_motion(pin):
8    led.value(pin.value())       # hareket varken yanar / on while there is motion
9    print("Hareket / motion" if pin.value() else "Bitti / ended")
10
11pir.irq(trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING, handler=on_motion)
12
13while True:
14    time.sleep(1)

誤検知を防ぐ

  • 熱源に向けない:暖房器具、エアコンの吹き出し口、日の当たる窓、熱いランプは、急な温度変化でセンサーをトリガーします。
  • 動く物から離す:カーテン、植物、風に揺れる枝は、日光で温まっていると動きのように見えます。
  • 電源をきれいにする:リレーやWi-Fiモジュールは電源にノイズを乗せます。センサーのVCCとGNDの間に100 µFのコンデンサを入れてください。
  • ESP32から少し離す:Wi-Fiアンテナのすぐ横にあるHC-SR501は、ときどき勝手にトリガーすることがあります。数センチ離して配線を短くすれば、たいてい直ります。
  • ペットがいる場合:感度を下げ、センサーを高い位置に少し下向きに取り付けてください。
  • ガラスの向こうに置かない:ふつうのガラスは赤外線を通さないので、窓の内側にあるセンサーは外の動きを検知できません。

PIR、マイクロ波レーダー、超音波のどれを選ぶ?

項目PIR(HC-SR501)マイクロ波レーダー(RCWL-0516)超音波(HC-SR04)
検知するもの温かく、動いている物体あらゆる動き前方の物体までの距離
薄い壁やケース越しの検知不可可能不可
じっと立っている人検知しない検知しない距離として測る
消費電力非常に小さい(約50 µA)小さい(約3 mA)中くらい(約15 mA)
主な用途照明、防犯アラーム隠しセンサー、自動ドア障害物の検知、水位の測定

部屋に誰かがいるかどうかではなく、誰かが動いているかどうかを知りたいなら、PIRがいちばん経済的です。物体までの距離を測りたい場合はHC-SR04距離センサーを見てみてください。

PIRセンサーのプロジェクトアイデア

  • 廊下の自動照明:動きを検知したらリレーでランプを点け、30秒間動きがなければ消します。
  • 防犯アラーム:夜間モードで動きを検知したらブザーを鳴らします。音の部分はブザーとは?を参照してください。
  • スマート常夜灯:PIRとLDR光センサーを組み合わせ、暗いときに人が動いた場合だけ点くランプを作ります。
  • スマホに通知:動きを検知したらESP32からTelegramのメッセージを送ります。
  • 省電力ディスプレイ:人が近づいたらLCDのバックライトを点け、離れたら消します。
  • 来場者カウンター:出入口を通る動きを1回ずつ数え、ディスプレイに表示します。

よくあるミスと直し方

  • 出力がずっとHIGHのまま:Txの時間が長すぎるか、Hモードで動きが続いています。半固定抵抗を下げ、センサーが熱源に向いていないか確認してください。
  • まったく反応しない:VCCが5 Vになっていない、センサーがまだウォームアップ中、またはOUTの線がコードと違うピンにつながっている可能性があります。
  • 数秒ごとに勝手に反応する:電源にノイズがあります。コンデンサを追加し、リレーやWi-Fiモジュールから離してください。
  • 動きが終わった直後に再検知しない:約2.5秒のブロッキング時間は正常な動作で、センサーの故障ではありません。
  • 取り付けの向きが悪い:PIRは視野を横切る動きをもっともよく検知します。まっすぐ近づいてくる人に気づくのは遅れます。

PIRセンサーは、初めてのスマートホームプロジェクトにぴったりの出発点です。3本の線でつながり、すぐに結果が見えます。BlueGraysアプリには、人感ライト、ドアチャイム、防犯アラームのプロジェクトが回路図とコード付きでステップごとに載っています。

よくある質問

PIRセンサーはどのくらいの距離まで検知できますか?

HC-SR501は、約110度の角度で3〜7メートルの範囲を検知します。距離はモジュールのSx(感度)半固定抵抗で設定し、時計回りに回すと広がります。

PIRセンサーはじっと立っている人を検知しますか?

いいえ。PIRが検知するのは赤外線の変化、つまり動きだけです。まったく動かずに座っている人には気づきません。部屋に人がいるかどうかを知るには、LD2410のようなミリ波(mmWave)の在室検知レーダーが使われます。

PIRセンサーはガラス越しに使えますか?

いいえ。ふつうの窓ガラスは人の体が出す赤外線を通さないので、ガラスの内側にあるセンサーは外の動きを検知できません。屋外で使う場合は、雨の当たらない場所にセンサーを屋外向きに取り付けてください。

HC-SR501は3.3 Vで動きますか?

レギュレーターが4.5 V未満では不安定になるので、5 Vの電源が必要です。出力はもともと3.3 Vなので、ESP32やPicoには直接つなげます。すべて3.3 Vでそろえたい場合は、2.7〜12 Vで動く小型のAM312 PIRモジュールを使ってください。

PIRセンサーが勝手に反応するのはなぜですか?

いちばん多い原因は、ウォームアップ期間、センサーが向いている熱源(暖房器具、日光、エアコン)、電源のノイズです。最初の60秒は無視し、センサーを熱源からそらし、VCCとGNDの間にコンデンサを入れ、Wi-Fiモジュールから離してください。

HC-SR501のHモードとLモードの違いは何ですか?

H(リピート)モードでは、動きが続いている間、検知のたびに出力タイマーがリセットされるので、動きがある限りライトは点いたままです。L(シングル)モードでは、動きが続いていても設定時間が切れると出力がオフになり、次のトリガーはブロッキング時間のあとになります。

全プロジェクトを見る
人感センサーで動きを検出
#24初級
プレミアム

人感センサーで動きを検出

誰かが部屋に入ると知らせる、シンプルな見張り役です。人感センサーが人体から放出される熱を捉え、Arduinoは動きがある間LEDを点灯させ、動きが止まると消灯させます。玄関先で自動点灯する照明や、警報システムの基本となる仕組みです。

4.6(47)
67
モーションセンサーで作るドアベルとライト
#25中級
プレミアム

モーションセンサーで作るドアベルとライト

玄関に誰かが近づくと、呼び鈴を押す前にわかります。モーションセンサーが人を検知するとLEDが点灯し、ブザーが高い音から低い音へ3音のチャイムを鳴らします。メロディーが終わるとライトが消え、センサーは再び待機します。音と光の両方で知らせるシンプルな玄関の見張り役です。

4.7(54)
71
ESP32 PIR人感センサーによる自動照明
#121中級
プレミアム

ESP32 PIR人感センサーによる自動照明

このプロジェクトでは、HC-SR501 PIR人感センサーで部屋に入った人を検知し、LEDを自動で点灯させます。millis()で点灯時間を管理します。センサーの値がHIGHの間は最後に動きを検知した時刻を更新し、最後にHIGHを読み取ってから少なくとも10秒後にLEDを消灯します。現在のコードは各ループでdelay(50)により50 ms待機するため、完全にノンブロッキングではありません。階段や廊下、浴室、戸棚内の照明などに応用できます。

4.4(24)
38
ESP32スマート照明(PIR + LDR + リレー + OLED)
#141上級
プレミアム

ESP32スマート照明(PIR + LDR + リレー + OLED)

ESP32で廊下やトイレ、食品庫の照明をスマート化します!PIRモーションセンサー、LDR光センサー、リレーモジュールを使い、「暗い場所で動きを検知すると点灯する」定番の仕組みを作ります。周囲が明るければ動きを検知しても点灯しないため、日中の無駄な電力消費を抑えられます。照明は30秒間点灯し、動きが続くとタイマーがリセットされて点灯時間が延びます。SSD1306 OLEDには大きな文字で状態(ON / DAYTIME / WAITING)とカウントダウンを表示します。

4.3(6)
11
ESP32動体検知アラーム(PIR + ブザー + LED + Telegram)
#145上級
プレミアム

ESP32動体検知アラーム(PIR + ブザー + LED + Telegram)

PIRセンサーが動きを検知するとブザーとLEDを作動させ、同時にTelegramで持ち主に即座に通知するスマート防犯アラームです。アラームが繰り返される頻度を抑えるため、30秒のクールダウン(待ち時間)を設けています。この仕組みはPIRの検知が正しいかを確認したり、誤検知をなくしたりするものではありません。家の防犯、ガレージの監視、倉庫や作業部屋などに使えます。ESP32-CAMなら写真付きの通知を追加でき、通常のESP32 DevKit V1ではテキストで通知します。

0.0(0)
9
レーザー警報システム
#22中級
プレミアム

レーザー警報システム

映画のような、目に見えない光のフェンスを作ります。向かい側の光センサーにレーザーを当て、人が通って光を遮るとすぐにLEDが点灯し、ブザーが鳴ります。光が再び届くと、LEDが消灯し、ブザーも止まります。ドアや廊下に使える、シンプルながら印象的な警報装置です。

4.8(64)
83
レーザー防犯システム
#23上級
プレミアム

レーザー防犯システム

映画のレーザーを使った強盗シーンのように、光センサーにレーザー光を当て、人が間に入って光を遮ると、赤いLEDが点灯してブザーが鳴り始めます。警報は自動では止まらず、ボタンやリモコンの電源ボタンで停止します。異常がないときは緑のLEDが点灯します。ドアや引き出しに、目に見えない見張り役を置くユニークな方法です。

4.8(60)
77