PICO SENSOR LAB / HC-SR501
- HC-SR501(人感センサー)でできること|この記事の完成形
- HC-SR501とは?PIR(焦電型赤外線)モーションセンサーの仕組み
- HC-SR501のデータシート(主な仕様)と実測値
- HC-SR501のピン配置(pinout)とジャンパ・ボリュームの設定
- この記事で使う部品(Raspberry Pi Pico 2 W・HC-SR501・2SC1815 ほか)
- HC-SR501の使い方①:Raspberry Pi Pico 2 W(MicroPython)の回路図とコード
- HC-SR501の使い方②:Arduino Unoの配線とスケッチ(参考)
- 応用:100均LEDライトをHC-SR501で人感ライトにする回路図とコード
- HC-SR501が動かない・ずっとHIGHのときのチェックポイント(FAQ)
- まとめと次回予告
HC-SR501(人感センサー)でできること|この記事の完成形
こんにちは。ニンジンです🥕
人が近づくとパッと点く「人感ライト」。玄関や廊下でおなじみのあの仕掛けの中身は、多くの場合「PIRセンサー」と呼ばれる人感センサーです。電子工作の世界では HC-SR501 というモジュールが定番で、1個あたり数百円で手に入ります。
この記事では、HC-SR501 の使い方を「資料として引ける情報」と「実際に動かす工作」の両方からまとめます。前半はデータシートの仕様・ピン配置(pinout)・ジャンパとボリュームの設定・回路図といったリファレンス、後半は Raspberry Pi Pico 2 W と組み合わせて、ダイソーのLEDライトを人感ライトに改造する応用編です。
まずは完成形です。手をかざすとライトが点き、最後に検知してから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 のセットアップは過去記事で解説しているので、この記事では省略します。
HC-SR501とは?PIR(焦電型赤外線)モーションセンサーの仕組み
HC-SR501 は、PIR(Passive Infrared)方式の人感センサーモジュールです。「Passive(受け身)」という名前のとおり、センサー自身は赤外線を出しません。人の体から出ている赤外線(体温による熱)を受け取るだけです。
焦電素子2つの「差」で動きをとらえる
白いドームの下には、焦電素子(温度が変化したときにだけ電圧を出す素子)が2つ並んでいます。白いドームはフレネルレンズで、周囲をいくつもの検知ゾーンに分けて素子に光(赤外線)を集めています。
人がセンサーの前を横切ると、まず素子A側のゾーンに体温が入り、次に素子B側に移ります。HC-SR501 は2つの素子の差を見ているので、このとき「+の山 → −の谷」という信号が出て、「何かが動いた」と判定し、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)とジャンパ・ボリュームの設定
ピン配置は「左から GND・OUT・VCC」
ピンは3本です。ピンを上にして、部品面(ICやボリュームが載っている面)から見ると、左から GND・OUT・VCC です。上の解説画像と同じ向きです。
| ピン | 役割 | つなぐ先 |
|---|---|---|
| GND | マイナス(0V) | マイコンの GND |
| OUT | 検知すると HIGH(3.3V) | マイコンの入力ピン |
| VCC | 電源 4.5〜20V | 5V(Pico なら VBUS) |
白いドーム(レンズ)は手で引っ張れば外れ、その下の基板にピン名が印字されています。互換品によってはピンの並びが違うことがあるので、配線する前に一度レンズを外して印字を確認してください。
ジャンパ H(リピート)と L(シングル)の違い
ピンの反対側にある3ピンのジャンパで、検知したときの出力の出し方を切り替えます。
- H(リピートトリガー):人が動き続けている間は、HIGH が延長され続ける
- L(シングルトリガー):一定時間 HIGH になったら、動き続けていても一度 LOW に戻る。その後のブロック時間(約2.5秒)が過ぎてから、また HIGH になる
人感ライトのように「人がいる間は点けっぱなしにしたい」用途では 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 記事と同じ定番パーツです。






電池ボックス・LED・抵抗がそろった「光る部分」を丸ごと流用できる
ダイソー タッチライトブロック(JAN 4972822310628)
単4電池3本で白色LED4個が光るタッチライト。中の基板と電池をそのまま使い、スイッチ役だけを Pico に任せます。
このほか、ライトの改造にははんだごてと、線を通す穴を開けるためのリューター(またはドリル)を使いました。
※リンクはアフィリエイトを含みます。価格・在庫・同梱内容は変わることがあるので、購入前に各商品ページをご確認ください。
HC-SR501の使い方①:Raspberry Pi Pico 2 W(MicroPython)の回路図とコード
まずはライトをつながず、センサーだけを Pico につないで動作を確かめます。いきなり全部を組むより、動かなかったときに原因を切り分けやすくなります。
回路図(センサーだけの最小構成)
| HC-SR501 | Pico 2 W | 線の色(筆者の実機) |
|---|---|---|
| VCC | VBUS(40番) | 赤 |
| OUT | GP16(21番) | 緑 |
| GND | GND(38番) | 黒 |
VCC は 3V3 ではなく VBUS(5V)へ
HC-SR501 の動作電圧は 4.5V 以上です。Pico の 3V3(36番)から取ると電圧が足りません。Pico を USB から給電しているなら、VBUS(40番)に USB の 5V がそのまま出ているので、ここから取ります。
37番 3V3_EN と 38番 GND を間違えない
GND は 38番 です。すぐ隣の 37番は 3V3_EN(Pico の電源を止めるためのピン)で、ここに GND の線を挿しても見た目では気づきにくいです。筆者はまさにこれをやって、「センサーの出力がずっと1のまま」という症状でしばらく原因が分かりませんでした(詳しくは後半のFAQで書きます)。
動作確認コード(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)
動かしてから約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の配線とスケッチ(参考)
HC-SR501 は Arduino でもよく使われます。つなぎ方は Pico とほぼ同じです。
| HC-SR501 | Arduino Uno |
|---|---|
| VCC | 5V |
| OUT | D2 |
| GND | GND |
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Ω の抵抗で割ります。
新品の電池(1本1.6V前後で合計4.8V程度)でも約60mAです。Pico の GPIO 1本で安全に流せる電流は数mA〜十数mAほどなので、直接は駆動できません。そこで、GPIO からは少しの電流(ベース電流)だけを流し、大きな電流(コレクタ電流)はトランジスタに流してもらう形にします。2SC1815 はコレクタ電流が最大150mAなので、60mA でも十分な余裕があります。
ベース電流は、GP15 の 3.3V からベース・エミッタ間の約0.7V を引いて、1kΩ で割った値です。
2SC1815 の増幅率(hFE)は小さく見積もっても70倍ほどあるので、2.6mA × 70 ≒ 180mA と、必要な60mAを十分に上回ります。トランジスタは完全にオン(飽和)の状態になり、LED が暗くなることはありません。
回路図と 2SC1815 の足の並び
- GP15 → 1kΩ → 2SC1815 のベース
- ベース → 20kΩ → GND(Pico の起動中や停止中に GP15 が浮いて、ライトが勝手に点くのを防ぐ)
- 2SC1815 のコレクタ ← ライトの赤線(LED の − 側)
- 2SC1815 のエミッタ → GND
- ライトの灰色線(電池の −)→ GND(18番)。電池の − と Pico の GND を必ず共通にする
2SC1815 は、平らな面(文字が書いてある面)を手前にして足を下に向けると、左から E(エミッタ)・C(コレクタ)・B(ベース)です。ここを逆に挿すと光りません。
実体配線
通電前チェックリスト(USB を挿す前に確認)
- センサーの GND は 38番(37番の 3V3_EN ではない)
- センサーの VCC は VBUS(40番)(3V3 ではない)
- ライトの赤線はコレクタ、灰色線は GND
- 2SC1815 の向きは、平らな面を手前にして左から E・C・B
- 電池の − と Pico の GND がつながっている(GND共通)
- ライト本体のスイッチは 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("テスト終了")
ライトが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つありました。
1つ目は配線ミスです。センサーの GND を 37番(3V3_EN)に挿していたため、センサーの出力がずっと1のままでした(FAQ の Q1 で詳しく書きます)。
2つ目はコードの作りです。最初のバージョンは「センサーが 0 → 1 に変化した瞬間」にだけライトを点ける作りでした。これだと、出力が最初から1のままのとき、0 → 1 の変化が一度も起きないので点灯しません。
ライトが点くようになったのは、配線を38番に直してからです。あわせてコードも、起動時から1のままでも点灯するように、「最後に検知した時刻」で判断する今の形に書き直しました。
タイミング図と動作デモ
センサーの出力とライトの点灯の関係を図にすると、次のようになります。
実際の動きです。右上の小窓は、同じ時刻の 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スケッチ)
関連する過去記事です。
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(明るさセンサー)で、電池だけで動く防犯ライトを作る予定です。暗いときだけ点く、本格的な人感ライトを目指します。
Follow me on X
本ブログの中の人「ニンジン🥕」はXやってます。新着記事はいち早くポストでお知らせしているので、見逃したくない方は @ninjin_py_vba をフォローしてみてください🥕
@ninjin_py_vba をフォロー






コメント