PR

HC-SR501の使い方|ピン配置・データシート・回路図まとめ【Raspberry Pi Pico 2 W】

ハードウェア制御 / 電子工作

PICO SENSOR LAB / HC-SR501

  1. HC-SR501(人感センサー)でできること|この記事の完成形
  2. HC-SR501とは?PIR(焦電型赤外線)モーションセンサーの仕組み
    1. 焦電素子2つの「差」で動きをとらえる
    2. 静止している人には反応しない
    3. 制御IC は BISS0001
  3. HC-SR501のデータシート(主な仕様)と実測値
    1. Time Delay 最小で HIGH が続いた時間は2.0〜3.3秒(実測)
    2. 出力は 3.3V なので Pico・ESP32 にそのまま入力できる
  4. HC-SR501のピン配置(pinout)とジャンパ・ボリュームの設定
    1. ピン配置は「左から GND・OUT・VCC」
    2. ジャンパ H(リピート)と L(シングル)の違い
    3. Sensitivity(感度)と Time Delay(保持時間)のボリューム
    4. 知っておきたい HC-SR501 のクセ
  5. この記事で使う部品(Raspberry Pi Pico 2 W・HC-SR501・2SC1815 ほか)
  6. HC-SR501の使い方①:Raspberry Pi Pico 2 W(MicroPython)の回路図とコード
    1. 回路図(センサーだけの最小構成)
    2. VCC は 3V3 ではなく VBUS(5V)へ
    3. 37番 3V3_EN と 38番 GND を間違えない
    4. 動作確認コード(sensor_test.py:0/1 を表示する)
    5. Pin.IN にプルアップ・プルダウンを付けない理由
  7. HC-SR501の使い方②:Arduino Unoの配線とスケッチ(参考)
    1. 3.3V の出力でも Arduino Uno は HIGH と判定できる
  8. 応用:100均LEDライトをHC-SR501で人感ライトにする回路図とコード
    1. ライトの中身と改造(赤線=LEDの−、灰色線=電池の−)
    2. トランジスタ 2SC1815 で駆動する理由と電流の計算
    3. 回路図と 2SC1815 の足の並び
    4. 実体配線
    5. ライト単体テスト(light_test.py:GP15 で点滅させる)
    6. 完成版のコード(main.py:最後の検知から10秒で消灯)
    7. タイミング図と動作デモ
  9. HC-SR501が動かない・ずっとHIGHのときのチェックポイント(FAQ)
  10. まとめと次回予告
スポンサーリンク

HC-SR501(人感センサー)でできること|この記事の完成形

こんにちは。ニンジンです🥕

人が近づくとパッと点く「人感ライト」。玄関や廊下でおなじみのあの仕掛けの中身は、多くの場合「PIRセンサー」と呼ばれる人感センサーです。電子工作の世界では HC-SR501 というモジュールが定番で、1個あたり数百円で手に入ります。

この記事では、HC-SR501 の使い方を「資料として引ける情報」と「実際に動かす工作」の両方からまとめます。前半はデータシートの仕様・ピン配置(pinout)・ジャンパとボリュームの設定・回路図といったリファレンス、後半は Raspberry Pi Pico 2 W と組み合わせて、ダイソーのLEDライトを人感ライトに改造する応用編です。

まずは完成形です。手をかざすとライトが点き、最後に検知してから10秒で消えます。

▲ 手をかざすと点灯し、最後の検知から10秒で消灯する

HC-SR501 早見表

項目要点
ピン配置ピンを上にして部品面から見て、左から GND・OUT・VCC(レンズを外すと印字がある)
電源4.5V以上が必要。Pico なら 3V3 ではなく VBUS(5V) から取る
出力検知すると OUT が HIGH(3.3V)になる。3.3Vマイコンにそのまま入力できる
おすすめ設定ジャンパは H(リピート)、Sensitivity・Time Delay は両方とも左いっぱい。点灯時間はマイコン側で管理する
注意電源を入れてから約1分は誤検知する/静止している人には反応しない

この記事で分かること

  • HC-SR501 が「動き」を検知する PIR(焦電型赤外線)センサーの仕組み
  • データシートの主な仕様と、実機で測った値との違い
  • ピン配置(pinout)、ジャンパ H/L の違い、2つのボリュームの役割
  • Raspberry Pi Pico 2 W(MicroPython)での回路図とコード(Arduino Uno の配線とスケッチは参考として掲載)
  • トランジスタ 2SC1815 を使って100均LEDライトを人感ライトにする回路とコード
  • 「出力がずっと1のまま」など、動かないときのチェックポイント

なお、Pico への MicroPython の書き込みと Thonny のセットアップは過去記事で解説しているので、この記事では省略します。

🔧 事前準備|MICROPYTHON ラズパイPico WとDHT11で温湿度を測定する方法|配線図とMicroPythonコード Pico への MicroPython 書き込みと Thonny の導入手順を、実機の画面つきで解説しています。 →

スポンサーリンク

HC-SR501とは?PIR(焦電型赤外線)モーションセンサーの仕組み

HC-SR501 は、PIR(Passive Infrared)方式の人感センサーモジュールです。「Passive(受け身)」という名前のとおり、センサー自身は赤外線を出しません。人の体から出ている赤外線(体温による熱)を受け取るだけです。

焦電素子2つの「差」で動きをとらえる

白いドームの下には、焦電素子(温度が変化したときにだけ電圧を出す素子)が2つ並んでいます。白いドームはフレネルレンズで、周囲をいくつもの検知ゾーンに分けて素子に光(赤外線)を集めています。

人がセンサーの前を横切ると、まず素子A側のゾーンに体温が入り、次に素子B側に移ります。HC-SR501 は2つの素子の差を見ているので、このとき「+の山 → −の谷」という信号が出て、「何かが動いた」と判定し、OUT ピンを HIGH にします。

PIRセンサーが動きを検知するしくみ
▲ 人が横切ると、素子A・Bに順番に熱が入り、差分に山と谷が出る。これを検知してOUTがHIGHになる

静止している人には反応しない

逆に言うと、人がじっと動かずにいると、2つの素子の差はゼロのままです。そのため静止している人には反応しません。「部屋にいるのにライトが消えた」というのは、PIR センサーのこの性質によるものです。また、センサーに向かってまっすぐ近づく動きより、センサーの前を横切る動きのほうが検知しやすくなります。

制御IC は BISS0001

部品面にある16ピンのICは BISS0001 という PIR 専用の制御ICです。素子からの微弱な信号の増幅、検知の判定、出力を HIGH にしておく時間(Time Delay)の管理までをこのICが受け持っています。マイコン側は OUT ピンが HIGH か LOW かを読むだけで済みます。


スポンサーリンク

HC-SR501のデータシート(主な仕様)と実測値

一般的なデータシートに載っている主な仕様です。

項目値(一般的なデータシート値)
動作電圧DC 4.5〜20V
待機電流50µA 未満
出力HIGH 3.3V / LOW 0V
検知距離最大 約7m(Sensitivity で調整)
検知角度約110〜120°
保持時間(Time Delay)約5秒〜300秒(調整可)
ブロック時間約2.5秒
トリガーL:シングル / H:リピート(ジャンパで切り替え)
動作温度−15〜+70℃
基板サイズ32×24mm(レンズ径 23mm)

出典: HC-SR501 PIR Sensor(components101)

Time Delay 最小で HIGH が続いた時間は2.0〜3.3秒(実測)

今回の個体は Time Delay を左いっぱい(最小)にし、後で紹介する sensor_test.py で OUT を読みながら、HIGH が続いた時間を測りました。手を3回かざした結果は 2.0秒・3.3秒・2.2秒で、データシートの「約5秒〜」より短い値でした。手をかざしていた時間の長さによっても変わります。HC-SR501 は多くのメーカーから互換品が出ているので、数値は目安で、個体差があると考えておくのが安全です。

出力は 3.3V なので Pico・ESP32 にそのまま入力できる

電源は5V(4.5V以上)で入れますが、基板上のレギュレータで3.3Vを作っているので、OUT の HIGH は 3.3V です。Raspberry Pi Pico や ESP32 のような 3.3V マイコンの GPIO に、抵抗などを挟まずそのままつなげます。超音波センサー HC-SR04 のように分圧する必要はありません。


スポンサーリンク

HC-SR501のピン配置(pinout)とジャンパ・ボリュームの設定

HC-SR501 各部の名称(部品面)
▲ HC-SR501 の部品面。ピン・ジャンパ・2つのボリュームの位置

ピン配置は「左から GND・OUT・VCC」

ピンは3本です。ピンを上にして、部品面(ICやボリュームが載っている面)から見ると、左から GND・OUT・VCC です。上の解説画像と同じ向きです。

ピン役割つなぐ先
GNDマイナス(0V)マイコンの GND
OUT検知すると HIGH(3.3V)マイコンの入力ピン
VCC電源 4.5〜20V5V(Pico なら VBUS)

白いドーム(レンズ)は手で引っ張れば外れ、その下の基板にピン名が印字されています。互換品によってはピンの並びが違うことがあるので、配線する前に一度レンズを外して印字を確認してください。

ジャンパ H(リピート)と L(シングル)の違い

ピンの反対側にある3ピンのジャンパで、検知したときの出力の出し方を切り替えます。

  • H(リピートトリガー):人が動き続けている間は、HIGH が延長され続ける
  • L(シングルトリガー):一定時間 HIGH になったら、動き続けていても一度 LOW に戻る。その後のブロック時間(約2.5秒)が過ぎてから、また HIGH になる
ジャンパH・Lで変わるOUT出力
▲ 同じように人が動き続けても、H は HIGH が続き、L は途切れ途切れになる

人感ライトのように「人がいる間は点けっぱなしにしたい」用途では H が向いています。この記事では H で使います(解説画像の写真はL側に刺さった状態で撮っています)。

Sensitivity(感度)と Time Delay(保持時間)のボリューム

オレンジ色のつまみが2つあります。どちらも右に回すと増える向きです。

  • Sensitivity(感度):検知できる距離。右に回すと遠くまで(最大 約7m)、左に回すと近く(約3m)
  • Time Delay(保持時間):検知したあと OUT を HIGH にしておく時間。右に回すと長く、左に回すと短く

筆者は最初、買ったときの位置のまま使っていて、検知が安定しませんでした。両方とも左いっぱい(最小)にしたところ、動作が安定しました。点灯時間は、マイコンのコードで決めます(後半で解説します)。

知っておきたい HC-SR501 のクセ

使っていると、いくつかクセがあることに気づきます。まず、電源を入れてから約1分は出力が安定せず、誤検知します。この間の HIGH は無視します。また、OUT が LOW に戻った直後の約2.5秒は、ブロック時間と呼ばれる仕様で反応しません。

動きの向きにも得意・不得意があり、センサーの前を横切る動きには強く、まっすぐ近づく動きには弱めです。設置する向きを考えるときに気にしておくとよいです。

熱源や日光、電源ノイズで誤検知することもあります。エアコンの吹き出し口やヒーター、直射日光の当たる場所は避けます。Pico 2 W の Wi-Fi チップのすぐそばに置くのも避けたほうが無難です。


スポンサーリンク

この記事で使う部品(Raspberry Pi Pico 2 W・HC-SR501・2SC1815 ほか)

今回使った部品です。Pico まわりは、これまでの Pico 記事と同じ定番パーツです。

Ren He HC-SR501 人体赤外線感応モジュール(3個入り)
必須

3個入りなので、1個はテスト用、残りは次の工作用に

Ren He HC-SR501 人体赤外線感応モジュール(3個入り)

この記事の主役の人感センサー。ジャンパとボリュームが付いた定番の HC-SR501 モジュールで、電源5V・出力3.3Vです。

PIR人感センサー出力3.3V3個入り
ヘッダー ハンダ付け済み Raspberry Pi Pico 2WH
必須

ピンヘッダー実装済みで、届いたその日からブレッドボードに挿せる

ヘッダー ハンダ付け済み Raspberry Pi Pico 2WH

今回のマイコン。無線付き(W)・ピンヘッダー実装済み(H)モデルで、MicroPython で動かします(筆者は Pico 2 W でのみ動作確認)。

無線+ヘッダー実装済みMicroPython
Freenove Raspberry Pi Pico 用ブレイクアウトボード
あると便利

ピン名が印字されていて確認しやすい(それでも筆者は37番に挿しました…)

Freenove Raspberry Pi Pico 用ブレイクアウトボード

Pico を挿すだけで、全ピンがネジ端子とピン名の印字付きで引き出されます。ピンを端から数える手間が減ります。

ネジ端子ピン名印字
2SC1815 NPN型トランジスタ
ライト改造で使用

Pico の GPIO では足りない電流を、これ1個で流せる

2SC1815 NPN型トランジスタ

ライトの LED をオン・オフするスイッチ役。コレクタ電流は最大150mAで、今回の約46mAには十分な余裕があります。

NPN最大150mA
GOODCHI 金属皮膜抵抗器 抵抗セット(10Ω〜1MΩ・30種類)
ライト改造で使用

1kΩ・20kΩ など、回路に合わせてすぐ選べる

GOODCHI 金属皮膜抵抗器 抵抗セット(10Ω〜1MΩ・30種類)

ベース抵抗の 1kΩ と、起動時の誤点灯を防ぐ 20kΩ に使用。セットで持っておくと、ほかの工作でも困りません。

30種類×各20本収納ケース付き
ダイソー タッチライトブロック(JAN 4972822310628)
改造するライト

電池ボックス・LED・抵抗がそろった「光る部分」を丸ごと流用できる

ダイソー タッチライトブロック(JAN 4972822310628)

単4電池3本で白色LED4個が光るタッチライト。中の基板と電池をそのまま使い、スイッチ役だけを Pico に任せます。

単4×3本白色LED×4
ブレッドボード 400穴
必須

はんだ付けなしで回路を組み替えられる基本の作業台

ブレッドボード 400穴

トランジスタと抵抗を挿すのに使用。今回の回路は400穴サイズで十分収まります。

はんだ付け不要
ELEGOO 120pcs 多色デュポンワイヤー
必須

オス-オス・オス-メス・メス-メスがそろって、どんな配線にも使える

ELEGOO 120pcs 多色デュポンワイヤー

センサー・Pico・ブレッドボードの間の配線に使用。色を「赤=5V・黒=GND・緑=信号」とそろえると、後から見直すときに楽です。

3種類×40本多色

このほか、ライトの改造にははんだごてと、線を通す穴を開けるためのリューター(またはドリル)を使いました。

USBケーブルについて:Pico 2WH は micro USB です。充電専用のケーブルだと PC が Pico を認識しないので、データ通信対応のケーブルを使ってください。

※リンクはアフィリエイトを含みます。価格・在庫・同梱内容は変わることがあるので、購入前に各商品ページをご確認ください。


スポンサーリンク

HC-SR501の使い方①:Raspberry Pi Pico 2 W(MicroPython)の回路図とコード

まずはライトをつながず、センサーだけを Pico につないで動作を確かめます。いきなり全部を組むより、動かなかったときに原因を切り分けやすくなります。

回路図(センサーだけの最小構成)

HC-SR501 と Pico 2 W の最小配線
▲ HC-SR501 と Pico 2 W の最小配線。線は3本だけ
HC-SR501Pico 2 W線の色(筆者の実機)
VCCVBUS(40番)赤
OUTGP16(21番)緑
GNDGND(38番)黒

VCC は 3V3 ではなく VBUS(5V)へ

HC-SR501 の動作電圧は 4.5V 以上です。Pico の 3V3(36番)から取ると電圧が足りません。Pico を USB から給電しているなら、VBUS(40番)に USB の 5V がそのまま出ているので、ここから取ります。

今回使う Pico 2 W のピン
▲ 今回使う Pico 2 W のピン。37番 3V3_EN と 38番 GND が隣り合っている点に注意

37番 3V3_EN と 38番 GND を間違えない

GND は 38番 です。すぐ隣の 37番は 3V3_EN(Pico の電源を止めるためのピン)で、ここに GND の線を挿しても見た目では気づきにくいです。筆者はまさにこれをやって、「センサーの出力がずっと1のまま」という症状でしばらく原因が分かりませんでした(詳しくは後半のFAQで書きます)。

37番 3V3_EN と 38番 GND の位置
▲ ブレイクアウトボードでも EN と GND は隣り合っている。筆者は最初、37番(EN)に挿していた

動作確認コード(sensor_test.py:0/1 を表示する)

センサーの出力を読み、変化したときだけ 0 か 1 を表示する最小のコードです。経過秒数も一緒に表示するので、HIGH が何秒続いたかも分かります。本体のLEDもセンサーの状態に合わせて点灯します。

# HC-SR501 単体の動作確認(センサーの出力を0/1で表示するだけ)
# Raspberry Pi Pico 2 W / MicroPython
#
# 配線:
#   HC-SR501 VCC -> VBUS(40番ピン)
#   HC-SR501 OUT -> GP16(21番ピン)
#   HC-SR501 GND -> GND(38番ピン)  ※隣の37番(3V3_EN)と間違えない
#
# 期待する動き:
#   起動直後の約1分は不安定(1が出ても気にしない)
#   その後、手をかざすと 1、離れて数秒たつと 0 に戻る

from machine import Pin
import time

pir = Pin(16, Pin.IN)                   # SR501は自分でHIGH/LOWを出すのでプルなし
onboard = Pin("LED", Pin.OUT, value=0)  # 本体LEDにもセンサーの状態を表示

last = None
start = time.ticks_ms()
while True:
    v = pir.value()
    onboard.value(v)
    if v != last:  # 変化したときだけ表示する
        sec = time.ticks_diff(time.ticks_ms(), start) / 1000
        print(f"{sec:6.1f}秒  センサー = {v}")
        last = v
    time.sleep_ms(50)
sensor_test.py 実行中の Thonny
▲ 手をかざすと1、離れると0に戻る。この実行では HIGH が 2.0秒・3.3秒・2.2秒続いた

動かしてから約1分は、手をかざさなくても1が出ることがあります。センサーが安定するまでの時間なので、気にしなくて大丈夫です。1分ほど待ってから、手をかざして 1 → 数秒後に 0 と変化すれば成功です。

Pin.IN にプルアップ・プルダウンを付けない理由

コードでは Pin(16, Pin.IN) とだけ書き、Pin.PULL_DOWN などは付けていません。HC-SR501 の OUT は、自分で HIGH(3.3V)と LOW(0V)を出力しているので、マイコン側で引っ張る必要がないためです。

さらに Pico 2(RP2350)には、内蔵プルダウンが期待どおりに働かないことがあるという既知の不具合(エラッタ E9)があります。入力ピンを一度 HIGH にしたあと、内蔵プルダウンだけでは LOW に戻りきらないことがある、というものです。不要なプルは付けないのが安全です。


スポンサーリンク

HC-SR501の使い方②:Arduino Unoの配線とスケッチ(参考)

この章は参考情報です。筆者は Arduino Uno での動作を実機では確認していません。配線とスケッチは、HC-SR501 と Arduino Uno の仕様から組み立てたものです。

HC-SR501 は Arduino でもよく使われます。つなぎ方は Pico とほぼ同じです。

HC-SR501 と Arduino Uno の配線(参考図)
▲ HC-SR501 と Arduino Uno の配線(参考図)
HC-SR501Arduino Uno
VCC5V
OUTD2
GNDGND

OUT の状態を Uno の内蔵LED(13番)に表示し、変化したときだけシリアルモニタに出力するスケッチです。

const int PIR_PIN = 2;
const int LED_PIN = 13;
int last = -1;

void setup() {
  pinMode(PIR_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
  Serial.println("Warming up (60s)...");
  delay(60000);  // 電源投入直後の誤検知を避ける
  Serial.println("Ready");
}

void loop() {
  int v = digitalRead(PIR_PIN);
  digitalWrite(LED_PIN, v);
  if (v != last) {  // 変化したときだけ表示
    Serial.print(millis() / 1000.0);
    Serial.print(" s  sensor = ");
    Serial.println(v);
    last = v;
  }
  delay(50);
}

3.3V の出力でも Arduino Uno は HIGH と判定できる

Arduino Uno は 5V で動くマイコンですが、入力が約3.0V以上あれば HIGH と判定します。HC-SR501 の OUT は 3.3V なので、HIGH として読めます。ただし余裕は 0.3V ほどしかありません。線を長く引き回すなどで電圧が下がると、読み取りが不安定になる可能性があります。


スポンサーリンク

応用:100均LEDライトをHC-SR501で人感ライトにする回路図とコード

ここからは応用編です。ダイソーの「タッチライトブロック」を、HC-SR501 と Pico 2 W で人感ライトにします。

改造するときの注意
分解・改造は自己責任で行ってください。改造したライトは元に戻せません。作業中は必ず電池を抜いてください。電池の+と−が直接触れると(ショート)、線や電池が熱くなって危険です。はんだごては高温になるので、やけどと周りの物の焦げにも注意してください。

ライトの中身と改造(赤線=LEDの−、灰色線=電池の−)

ライトを分解すると、電池ボックス、白色LED 4個が載った基板、スイッチがあります。

改造の方針は、「LED の − 側と電池の − 側の間にトランジスタを入れて、Pico でオン・オフする」です。ライトのスイッチは ON にしたまま使い、実際の点灯・消灯は Pico に任せます(ローサイドスイッチと呼ばれる形です)。そのために、LED基板の − 側の配線を外し、外に2本の線を引き出しました。

ここで一番注意してほしいのが、引き出した線の色です。
赤線 = LED の − 側(トランジスタのコレクタにつなぐ)
灰色線 = 電池の −(GND につなぐ)
一般的に「赤=+」なので、赤線を+側だと思い込みやすいですが、この改造では赤線は − 側です。ご自分で改造するときは、+の線を赤にしないなど、色の意味をそろえておくと間違いが減ります。

トランジスタ 2SC1815 で駆動する理由と電流の計算

Pico の GPIO から直接 LED を光らせないのは、流せる電流が足りないからです。

ライトの LED に流れる電流を見積もってみます。電池は単4×3本で 4.5V、白色LEDの電圧降下(Vf)を約3.1V、トランジスタの電圧降下(Vce)を約0.2V とし、ライトに元から付いている 26Ω の抵抗で割ります。

(4.5V − 3.1V − 0.2V) ÷ 26Ω ≒ 0.046A = 約46mA

新品の電池(1本1.6V前後で合計4.8V程度)でも約60mAです。Pico の GPIO 1本で安全に流せる電流は数mA〜十数mAほどなので、直接は駆動できません。そこで、GPIO からは少しの電流(ベース電流)だけを流し、大きな電流(コレクタ電流)はトランジスタに流してもらう形にします。2SC1815 はコレクタ電流が最大150mAなので、60mA でも十分な余裕があります。

ベース電流は、GP15 の 3.3V からベース・エミッタ間の約0.7V を引いて、1kΩ で割った値です。

(3.3V − 0.7V) ÷ 1kΩ ≒ 2.6mA

2SC1815 の増幅率(hFE)は小さく見積もっても70倍ほどあるので、2.6mA × 70 ≒ 180mA と、必要な60mAを十分に上回ります。トランジスタは完全にオン(飽和)の状態になり、LED が暗くなることはありません。

回路図と 2SC1815 の足の並び

HC-SR501 と Pico 2 W で100均ライトを点灯する回路図
▲ 全体の回路図。点線の中は100均ライトの基板をそのまま流用している部分
  • GP15 → 1kΩ → 2SC1815 のベース
  • ベース → 20kΩ → GND(Pico の起動中や停止中に GP15 が浮いて、ライトが勝手に点くのを防ぐ)
  • 2SC1815 のコレクタ ← ライトの赤線(LED の − 側)
  • 2SC1815 のエミッタ → GND
  • ライトの灰色線(電池の −)→ GND(18番)。電池の − と Pico の GND を必ず共通にする
2SC1815 の足の並び
▲ 2SC1815 の足の並び。平らな面を手前・足を下にして、左から E・C・B

2SC1815 は、平らな面(文字が書いてある面)を手前にして足を下に向けると、左から E(エミッタ)・C(コレクタ)・B(ベース)です。ここを逆に挿すと光りません。

実体配線

斜めから見た配線
▲ 斜めから見たところ

通電前チェックリスト(USB を挿す前に確認)

  1. センサーの GND は 38番(37番の 3V3_EN ではない)
  2. センサーの VCC は VBUS(40番)(3V3 ではない)
  3. ライトの赤線はコレクタ、灰色線は GND
  4. 2SC1815 の向きは、平らな面を手前にして左から E・C・B
  5. 電池の − と Pico の GND がつながっている(GND共通)
  6. ライト本体のスイッチは ON にしてある

ライト単体テスト(light_test.py:GP15 で点滅させる)

センサーと合体させる前に、ライトだけを Pico から点けたり消したりできるか確認します。

# ライト(2SC1815のローサイドスイッチ)単体の動作確認
# Raspberry Pi Pico 2 W / MicroPython
#
# 配線:
#   GP15(20番ピン) -> 1kΩ -> 2SC1815 ベース(B)、ベース -> 20kΩ -> GND
#   2SC1815 コレクタ(C) <- ライトの赤線(LEDの−側)
#   2SC1815 エミッタ(E) -> GND、ライトの灰色線(電池の−) -> GND(18番ピン)
#
# 期待する動き:
#   ライトが1秒ごとに点灯/消灯を5回くり返して終了する

from machine import Pin
import time

light = Pin(15, Pin.OUT, value=0)

for i in range(1, 6):
    light.on()
    print(f"{i}回目  ライトON")
    time.sleep(1)
    light.off()
    print(f"{i}回目  ライトOFF")
    time.sleep(1)

print("テスト終了")
light_test.py 実行後の Thonny
▲ ON/OFFを5回くり返したあと「テスト終了」と表示される

ライトが1秒ごとに5回点滅すれば、トランジスタまわりの配線は正しくできています。点かない場合は、チェックリストの3〜6を見直してください。

完成版のコード(main.py:最後の検知から10秒で消灯)

センサー単体・ライト単体の両方が動いたら、いよいよ合体です。一般的な人感ライトと同じく、人を検知したら点灯し、検知が続いている間は点灯時間を延長し、最後の検知から10秒で消灯する、という動きにします。

# 人感センサー(HC-SR501)で100均LEDライトを点灯する
# Raspberry Pi Pico 2 W / MicroPython
#
# 一般的な人感ライトと同じ動き:
#   検知したら点灯 → 検知が続く間は延長 → 最後の検知から HOLD_SEC 秒で消灯
#
# センサー側の設定: ジャンパ=H、Time Delay=左いっぱい(最短)
#   → 点灯時間の管理はPico側で行う
#
# 配線:
#   HC-SR501 VCC -> VBUS(40番ピン)
#   HC-SR501 OUT -> GP16(21番ピン)
#   HC-SR501 GND -> GND(38番ピン)
#   GP15(20番ピン) -> 1kΩ -> 2SC1815 ベース
#   ※ライトの電池(−)とPicoのGNDは共通にする

from machine import Pin
import time

PIR_PIN = 16        # センサーのOUT
LIGHT_PIN = 15      # トランジスタのベース(1kΩ経由)
WARMUP_SEC = 60     # センサーが安定するまでの待ち時間
HOLD_SEC = 10       # 最後の検知から消灯までの秒数

pir = Pin(PIR_PIN, Pin.IN)              # SR501は自分でHIGH/LOWを出すのでプルなし
light = Pin(LIGHT_PIN, Pin.OUT, value=0)
onboard = Pin("LED", Pin.OUT, value=0)  # Pico 2 W 本体のLED(センサーの生の状態を表示)


def warmup(sec):
    """電源投入直後は誤検知するので、本体LEDを点滅させながら待つ"""
    print(f"センサー安定待ち({sec}秒)...")
    for i in range(sec):
        onboard.toggle()
        if (sec - i) % 10 == 0:
            print(f"  あと{sec - i}秒")
        time.sleep(1)
    onboard.off()
    print("準備OK! 検知を開始します")


def main():
    warmup(WARMUP_SEC)

    count = 0
    lit = False          # ライトが点いているか
    last_detect = 0      # 最後に検知した時刻(ms)
    last_pir = 0

    while True:
        now_pir = pir.value()
        now_ms = time.ticks_ms()
        onboard.value(now_pir)

        if now_pir:
            last_detect = now_ms  # 検知中はずっと時刻を更新 = 延長

            if not lit:
                count += 1
                lit = True
                light.on()
                print(f"[{count}回目] 人を検知 -> ライトON")
            elif not last_pir:
                print(f"          再検知 -> {HOLD_SEC}秒延長")

        elif lit and time.ticks_diff(now_ms, last_detect) >= HOLD_SEC * 1000:
            lit = False
            light.off()
            print(f"          {HOLD_SEC}秒検知なし -> ライトOFF")

        last_pir = now_pir
        time.sleep_ms(50)


try:
    main()
except KeyboardInterrupt:
    print("停止しました")
finally:
    # 止めたときにライトが点きっぱなしにならないようにする
    light.off()
    onboard.off()

コードで工夫したのは次の3か所です。

① 起動直後の60秒は待つ(warmup())

HC-SR501 は電源を入れてから約1分は誤検知します。この間は本体のLEDを点滅させて「準備中」だと分かるようにし、センサーの値は使いません。

② 「最後に検知した時刻」を覚えておく(last_detect)

センサーが1の間は、ループのたびに last_detect を今の時刻で上書きします。センサーが0になってから HOLD_SEC(10秒)たったら消灯します。検知が続く間は時刻が更新され続けるので、自然に「延長」になります。時間の差は time.ticks_diff() で計算しています。ticks_ms() の値は一定時間で一周して0に戻るため、ticks_diff() を使うと、一周をまたいでも正しい差が出ます。

③ 点灯時間はコードで決める

Time Delay のつまみでも保持時間は変えられますが、つまみの角度で「ちょうど10秒」に合わせるのは困難です。センサー側は最短(実測2.0〜3.3秒)にしておき、何秒点けておくかは HOLD_SEC の数字1つで決めるほうが、正確で変更も簡単です。筆者も最初は30秒にしていましたが、長すぎたので10秒に変えました。

最初は2つの問題が重なっていた
組み立てた直後、ライトはまったく点きませんでした。原因は2つありました。

1つ目は配線ミスです。センサーの GND を 37番(3V3_EN)に挿していたため、センサーの出力がずっと1のままでした(FAQ の Q1 で詳しく書きます)。

2つ目はコードの作りです。最初のバージョンは「センサーが 0 → 1 に変化した瞬間」にだけライトを点ける作りでした。これだと、出力が最初から1のままのとき、0 → 1 の変化が一度も起きないので点灯しません。

ライトが点くようになったのは、配線を38番に直してからです。あわせてコードも、起動時から1のままでも点灯するように、「最後に検知した時刻」で判断する今の形に書き直しました。

タイミング図と動作デモ

センサーの出力とライトの点灯の関係を図にすると、次のようになります。

センサー出力とライト点灯のタイミング
▲ センサー出力(緑)とライト(オレンジ)。検知が続く間は延長され、最後の検知から10秒で消える

実際の動きです。右上の小窓は、同じ時刻の Thonny のシェル出力です。画面下の字幕で「何をしたら、どうなったか」を表示しています。

▲ 手をかざすと点灯 → 10秒で消灯 → 点灯中にもう一度かざすと10秒延長
main.py 実行中の Thonny
▲ main.py 実行中の Thonny。検知・延長・消灯のたびにシェルに表示される

実測では、手をかざしてから消えるまで約12秒でした。センサーが HIGH になっている時間(sensor_test.py の実測で2.0〜3.3秒)と、そこからの10秒を足した時間です。

この記事のコード(sensor_test.py・light_test.py・main.py・Arduino スケッチ)は、まとめてダウンロードできます。

📦 この記事のコード一式をダウンロード(ZIP・sensor_test.py / light_test.py / main.py / Arduinoスケッチ)

関連する過去記事です。

📡 関連記事|トランジスタ ラズパイPico Wで赤外線リモコンを自作|受信・送信回路と38kHz PWM制御 C1815 トランジスタで赤外線LEDを駆動する回路を使っています。トランジスタの使い方をもう少し見たい方に。 → 📏 関連記事|センサー 超音波距離センサーHC-SR04をRaspberry Pi Picoで使う|仕組み・配線・精度検証 同じ Pico 2 W と VBUS 給電で、今度は距離を測るセンサーを動かしています。 →

スポンサーリンク

HC-SR501が動かない・ずっとHIGHのときのチェックポイント(FAQ)

QHC-SR501 の出力がずっと HIGH(1)のままになります。

Aまず配線を疑ってください。筆者の場合、原因はセンサーの GND を Pico の 37番(3V3_EN)に挿していたことでした。37番は GND(38番)のすぐ隣です。3V3_EN は、Pico の内部で抵抗を通して電源(VSYS)側に引き上げられているピンです。電圧は測っていないので推測になりますが、GND の代わりにここへつないだことでセンサーに正しく電源がかからず、OUT の電圧が定まらないまま Pico から1に読めていた、と考えられます。38番につなぎ直したら正常に動き、Pico もセンサーも壊れていませんでした。切り分けは、「センサーだけ(sensor_test.py)」「ライトだけ(light_test.py)」の順に1つずつ確かめるのが近道です。なお、電源を入れてから約1分間 HIGH になるのは正常です。

Q反応しない、反応が鈍いです。

A次の順に確認してください。①電源投入から1分たっているか、②LOW に戻った直後の約2.5秒(ブロック時間)に動いていないか、③センサーの前を横切る方向に動いているか(まっすぐ近づく動きは苦手)、④ボリュームの位置。筆者は Sensitivity と Time Delay を両方とも左いっぱいにしたら安定しました。

Q誰もいないのに反応(誤検知)します。

Aエアコンやヒーターの風、直射日光、窓の外の車など、温度が変化するものが検知範囲に入っていないか確認してください。電源ノイズでも誤検知することがあります。Pico 2 W の Wi-Fi チップのすぐ近くにセンサーを置くのも避けたほうが無難です。

QHC-SR501 は 3.3V で動かせますか?

A基本的には動きません。動作電圧は 4.5V 以上です。Pico なら VBUS(USB の5V)、Arduino Uno なら 5V ピンから給電してください。出力(OUT)のほうは 3.3V なので、3.3V マイコンにそのまま入力できます。

QESP32 や Raspberry Pi(Linux)でも使えますか?

A使えます。どちらも GPIO が 3.3V なので、OUT をそのまま入力ピンにつなげます。電源は 5V ピンから取ります。

Q点灯時間を30秒や1分ちょうどにしたいです。

Aセンサーの Time Delay つまみで合わせるより、マイコンのコードで管理するほうが正確です。この記事の main.py なら HOLD_SEC = 30 のように数字を変えるだけです。


スポンサーリンク

まとめと次回予告

HC-SR501 の仕様・ピン配置・設定から、Pico 2 W での使い方、100均ライトの人感ライト化までをまとめました。

HC-SR501 は、焦電素子2つの差で「動き」を検知するセンサーなので、静止している人には反応しません。ピンは、ピンを上にして部品面から見ると左から GND・OUT・VCC で、電源は 4.5V 以上(Pico なら VBUS)、出力は 3.3V です。

設定は、ジャンパを H(リピート)、ボリュームを両方とも左いっぱいにして、点灯時間はコードで管理するのがおすすめです。そして一番のハマりどころは、Pico の 37番(3V3_EN)と 38番(GND)の取り違えでした。出力が「ずっと1」になったら、まずここを確認してみてください。

次回は、Pico を使わずに MOSFET と CdS(明るさセンサー)で、電池だけで動く防犯ライトを作る予定です。暗いときだけ点く、本格的な人感ライトを目指します。


この記事が役に立ったら、シェアしてもらえると嬉しいです🥕

Xでポスト はてブ LINE Pocket
ニンジン🥕アイコン

Follow me on X

本ブログの中の人「ニンジン🥕」はXやってます。新着記事はいち早くポストでお知らせしているので、見逃したくない方は @ninjin_py_vba をフォローしてみてください🥕

@ninjin_py_vba をフォロー
まとめハブ
ハードウェア制御 / 電子工作
スポンサーリンク

コメント