ラズパイ×人感センサーで照明自動化|リレー配線と安全策
Raspberry Piの GPIO でPIR人感センサー検知→リレー制御を実装する手順を、完成イメージから順に追います。
この記事を読めば、低電圧(5V)ランプで安全に検証しつつ、配線と gpiozero の Python コードで実用的な保持時間制御まで試せるようになります。
この記事では配線を低電圧側の制御に絞り、AC100Vの直結は原則として扱いません。
商用電源まわりはリレー基板だけで済む話ではなく、絶縁や筐体まで含めた安全設計が必要だとSchneider Electricの解説でも整理されているためです絶縁や筐体まで含めた安全設計が必要だとSchneider Electricの解説でも整理されているためです。
GPIO番号と物理ピン番号を並べた接続表、GPIO Zeroで動くPythonコード全文、初回につまずきやすい感度調整や誤検知の切り分けまで、段階を飛ばさず解説します。
筆者のワークショップでも、まずは低電圧のLEDランプで安全に検証してから現場に持ち込むと、誤配線なのかセンサー設定なのかを短時間で見分けられ、結果として完成までの遠回りが減りました。
ラズパイで照明を自動化する前に知っておきたいこと
完成イメージ
このセクションで目指すのは、Raspberry PiのGPIOでPIR人感センサーの出力を読み取り、動きを検知したらリレーを切り替えて、5Vの低電圧ランプを点灯させる構成です。
人感センサーという言い方は広い意味を持ちますが、住宅の照明でよく使われるのは熱の移動を捉えるPIR方式です。
Adafruitの解説Adafruitの解説でも、受動型赤外線センサーとして人や動物の熱の変化を拾う仕組みが整理されています)。
図にすると、流れは次のようになります。
人が通る
↓
PIRセンサーが動きを検知
↓
Raspberry PiがGPIO入力を読む
↓
PythonコードがリレーをON
↓
5Vランプ(USBランプ)が点灯
↓
一定時間、動きがなければ
↓
PythonコードがリレーをOFF
↓
ランプ消灯
配線の役割も先に頭の中で分けておくと、途中で迷いません。
検知側:
PIRセンサー → GPIO入力
制御側:
GPIO出力 → リレーモジュール入力
負荷側:
リレー接点 → 5Vランプ電源ラインのON/OFF
ここでポイントになるのが、GPIOはあくまで信号を出す場所であって、ランプを直接駆動する場所ではないという点です。
USBランプのような5V負荷でも、GPIOからそのまま流せる電流では足りません。
そこで、GPIOはリレーを操作する側に回し、実際の点灯は別の5V電源ラインで行う、という整理にすると回路の役割が明確になります。
リレーは小さな制御信号で別回路をON/OFFでき、入力側と出力側を分けられるので、この手の自動化では扱いやすい部品です。
オムロンのリレー基礎知識(https://components.omron.com/jp-ja/products/basic-knowledge/relays/basicsでも、この絶縁の考え方が基本として説明されています)。
今回の対象読者は、Pythonを少し触ったことがあるRaspberry Piユーザーで、電子工作は初級から中級の入り口にいる方です。
GPIOの入出力、3.3Vと5Vの違い、ブレッドボード配線の向きあたりに見覚えがあれば読み進められる構成にします。
コードは高機能なフレームワークよりも、まず全体像がつかめる書き方を優先します。
Raspberry Pi側の前提としては、Raspberry Pi OSが入っている状態を想定します。
初期セットアップの考え方や導入手順はRaspberry Pi公式のGetting started(https://www.raspberrypi.com/documentation/computers/getting-started.htmlにまとまっています。
ストレージは通常のRaspberry Pi OSで32GB以上、軽量なLite構成なら16GB以上が目安です。
センサー実験ではログ保存やパッケージ追加が積み重なるので、あとで空き容量に追われない構成にしておくと作業の流れが止まりません)。
筆者の経験では、玄関や廊下のように人が通り抜ける場所では、配線より先にセンサーの向きを決めた方が結果がまとまりやすくなります。
PIRは真正面に近づく動きより、視野を横切る動きの方が反応が出やすい傾向があります。
実装の初期段階でセンサーの向きだけ仮置きして、人がどの方向に通るかを確認しておくと、感度つまみや保持時間の調整で迷走しにくくなります。
Overview | PIR Motion Sensor | Adafruit Learning System
learn.adafruit.com所要時間・難易度
記事全体の作業時間の目安は約60分です。
部品がそろっていて、Raspberry Pi OSの初期設定が済んでいれば、1時間前後で「人が通ると点灯し、しばらくすると消える」ところまで持っていけます。
難易度は電子工作の初級から中級の境目くらいで、はんだ付けなしのブレッドボード構成なら取り組みやすく、GPIOの入力と出力を同時に扱う点で少しだけ実践寄りになります。
作業の流れは、次の順で考えると整理できます。
- 部品をそろえる
- PIRセンサー、リレー、5Vランプを低電圧側だけで配線する
- Pythonコードで検知とON/OFFをつなぐ
- 感度や消灯までの待ち時間を調整する
- 必要なら通知や照度連動などの応用に広げる
この順番にしているのは、トラブルの切り分けがしやすくなるからです。
たとえば、いきなり全部をつなぐと「センサーが反応しない」のか「リレー論理が逆」なのか「ランプ側の配線が違う」のかが見えません。
ワークショップでも、まずPIR単体の反応、次にリレー単体の動作、そのあとでランプをつなぐ三段階に分けると、止まる場所がはっきり出ます。
難易度を左右するのは、実はコード量よりも部品の癖です。
特に初心者がつまずきやすいのは、リレーモジュールがアクティブLOWで動くタイプだった場合です。
このときはGPIOをHIGHにしたらON、ではなくLOWでONになります。
GPIO ZeroのOutputDeviceはactive_high=Falseを使うと、このアクティブローの回路に合わせて書けます。
起動時の初期状態もinitial_valueでオフ側に寄せられるので、コード側で論理を吸収できるのが利点です。
まず動かす段階では、GPIO Zero構成が最短距離になりやすいと筆者は感じています。
本記事の安全方針
本記事で自作するのは低電圧側までです。
具体的には、PIRセンサーで検知し、Raspberry Piからリレーを制御して、5V負荷のUSBランプを点灯させるところまでを扱います。
家庭のAC100V照明に直結する配線は、この流れの延長線上で気軽に足してよい作業ではありません。
商用電源を扱う回路は、リレーが1個あれば済む話ではなく、低電圧回路との絶縁、配線の固定、触れない筐体、使用部材の適合まで含めて成立します。
Schneider Electricの解説Schneider Electricの解説でも、リレーは部品単体ではなく安全設計の一部として捉えられています)。
日本の家庭内配線に手を入れる作業は、電気工事士の資格が関わる領域でもあります。
そのため、この記事では商用電源の直結配線を作例として勧めません。
検証は5VのUSBランプを使い、動作確認も低電圧だけで完結させます。
この方針だと、センサー調整とコード検証に集中でき、危険源も絞れます。
TIP
点灯確認用のUSBランプは、5Vで動く小型のものが扱いやすいです。
筆者は最初の検証でUSB給電のLEDランプを使うことが多いのですが、目で結果が分かり、誤配線の切り分けも速く進みます。
低電圧検証に限定する理由は、安全だけではありません。
照明自動化の試作では、最初に詰まるのはたいてい「どこで検知するか」「何秒で消すか」「昼間も点いてしまわないか」といった制御ロジックです。
そこにAC100V配線の検討まで重ねると、問題の層が増えて切り分けが難しくなります。
まず5VのUSBランプで動線と検知タイミングを整え、そのあと必要なら既製のスマート照明や赤外線連携へ進む、という順序の方が家庭導入では現実的です。
なお、PIRセンサーは直射日光が当たる場所や、ヒーターの近くのように熱変化が大きい場所では挙動が乱れます。
玄関や廊下で試すときも、壁に対してどちら向きに置くかで印象が変わります。
筆者は現場で、センサーを正面向きにしたまま感度だけ追い込んで時間を使ってしまう場面を何度も見てきました。
人の進行方向に対して少し横向きに振るだけで、反応の出方が素直になることがあります。
この記事はその前提で、まず安全な低電圧側の完成度を上げる流れで進めます。

制御リレーとは何か?種類・接点構成・選定ポイントを徹底解説
制御リレーの基礎から種類・接点構成・選定方法を徹底解説。制御盤設計や調達担当者必見、用途別比較と寿命延長のポイント、Harmony電磁・監視・タイマーリレー製品紹介で最適な選定を支援します。
se.com必要なもの
このパートでは、まず低電圧で確実に動作確認できる構成を前提に、部品の役割と選び方を整理します。
配線そのものは次のセクションで扱いますが、ここで部品の意味がつかめていると、購入後に「コネクタ形状が合わない」「想定した電圧で動かない」といった止まり方を避けられます。
部品数は多く見えても、核になるのはRaspberry Pi、PIRセンサー、5Vリレーモジュール、そして検証用の5V負荷の4点です。
そこに配線用のジャンパワイヤとブレッドボードを足せば、今回の回路は組めます。
| 部品名 | 数量 | 型番・仕様の目安 | 参考価格帯(税込) |
|---|---|---|---|
| Raspberry Pi本体 | 1 | Raspberry Pi 4またはRaspberry Pi 5 | 本体価格は変動が大きいため後述 |
| microSDカード | 1 | 通常版OSなら32GB以上、Liteなら16GB以上 | 800〜2,000円前後 |
| PIRセンサー | 1 | HC-SR501互換 | 300〜800円 |
| 5Vリレーモジュール | 1 | 1chまたは2ch、5V駆動 | 300〜700円 |
| ブレッドボード | 1 | ハーフサイズ以上 | 400〜1,000円 |
| ジャンパワイヤ | 1式 | オス-メス、オス-オス | 300〜600円 |
| 5V系の検証用負荷 | 1 | USB LED、5Vランプ | 500〜1,500円 |
| USB電源まわり | 1式 | ランプ給電用ケーブル類 | 手持ち流用可 |
raspberry-pi本体とos">Raspberry Pi本体とOS
本体はRaspberry Pi 4でもRaspberry Pi 5でも進められます。
今回のテーマはPIRの入力を読み、リレーを1系統または2系統切り替える程度なので、GPIOが使えてRaspberry Pi OSが安定動作するモデルなら十分です。
すでに手元にRaspberry Pi 4があるなら、そのまま使う構成で問題ありません。
新規にそろえるなら、Raspberry Pi Getting startedでも案内されている通り、ストレージは通常版OSで32GB以上、Liteで16GB以上がひとつの目安です。
今回のように配線、Pythonスクリプト、ログ確認まで行うなら、microSDは32GBを選んでおくと余裕があります。
容量だけでなく、OS書き込み直後のトラブル切り分けではカード自体の安定性も効いてくるので、無名の極端に安いカードよりSanDiskSamsungあたりの定番品のほうが扱いやすい構成になります。
本体価格は時期によって動きます。
Raspberry Pi公式のPi 5 1GB価格改定情報ではRaspberry Pi 5 1GBモデルが45ドル、Raspberry Pi 4 1GBモデルが35ドルという基準が示されていますが、国内流通価格はメモリ容量や在庫状況で上下します。
ここは絶対額よりも、「Pi 4 / Pi 5のどちらでも今回の用途は成立する」「在庫のある正規流通品を選ぶ」という見方のほうが迷いません。
OSはRaspberry Pi OSを前提にし、PythonライブラリはGPIO Zeroを使う流れです。
GPIO Zeroは sudo apt install python3-gpiozero で導入でき、PIR入力や出力制御を部品の役割に沿って書けるのが利点です。
ワークショップでも、GPIO番号の細かい初期化から入るより、MotionSensorや出力デバイスの考え方で組んだほうが、配線と挙動の対応が頭に入りやすいんですよね。
センサー・リレーの選び方
PIRセンサーは、まずHC-SR501互換を1個用意すれば十分です。
住宅照明でよく使われる熱線式の基本がそのまま学べて、価格も300〜800円に収まりやすい定番です。
Adafruit PIR overviewやSparkFun PIR Hookup Guideでも、このタイプは入門用として扱われています。
消費電流が小さいので、Raspberry Piと組み合わせた低電圧検証に向いています。
型番候補としてはHC-SR501、説明欄に「BISS0001搭載」「感度調整付き」「保持時間調整付き」と書かれているものが選びやすい部類です。
ここで気をつけたいのは、見た目が似ていてもピンの並びが商品写真だけでは読み取りにくいことです。
筆者の経験でも、購入ページの図より現物のシルク印刷を見たほうが早くて確実です。
リレーモジュールは5V駆動の1chまたは2chを選びます。
今回の構成だけなら1chで足りますが、あとで「検知ランプとブザーを分けたい」「別の5V機器も切り替えたい」と広げる余地を残すなら2chも選択肢に入ります。
型番候補は汎用品としての5V 1ch Relay Module5V 2ch Relay Moduleで、説明欄に「3.3V信号対応」「フォトカプラ付き」「IN1/IN2入力」とあるものが扱いやすいです。
リレーモジュールは、入力論理がアクティブLOWの製品が多いのがポイントです。
つまり、GPIOをLOWにしたときにリレーが動作するタイプが珍しくありません。
GPIO Zeroでは active_high=False を使うとコード側の on() と実際のリレーONを揃えられるので、部品選定の段階で「LOWトリガ対応か」を見ておくと、後のコードがきれいにまとまります。
もうひとつ見ておきたいのが、動作表示LEDの有無です。
リレーモジュールは動作時にLEDが点くタイプだと、負荷をつながなくてもON/OFFの確認ができるので、初学者の方には特に評判がいいです。
実際、ランプが点かないときに「コードが悪いのか、配線が悪いのか、負荷側が悪いのか」が分かれますが、基板上のLEDが点いていれば切り分けが一段進みます。
カチッというリレー音だけに頼るより、視覚的に追えるほうが安心材料になります。
TIP
リレーモジュールの商品説明にJD-VCCとVCCの両方が載っている場合は、ロジック側とリレーコイル側を分けられるタイプです。
今回は入門構成なので、まずは配線が素直な一般的な5V 1ch/2ch品を前提に進めると迷いません。
配線・検証用負荷
配線部材は、ジャンパワイヤとブレッドボードが中心です。
PIRセンサーやリレーモジュールはピンヘッダ形状が製品ごとに少し違うため、ジャンパワイヤはオス-メスとオス-オスの両方があると困りません。
Raspberry PiのGPIOヘッダからブレッドボードへ落とす場面、センサーモジュールへ直接つなぐ場面の両方が出るからです。
最初から両方そろっているセットを選ぶと、途中で作業が止まりません。
ブレッドボードはハーフサイズ以上が1枚あると十分です。
PIR、リレー、電源ライン、GPIOラインを分けて置けるだけの幅があると、あとで見返したときに回路の意図が読み取りやすくなります。
小さすぎるボードに詰め込むと、配線ミスの切り分けで時間を使いがちです。
検証用の負荷は、5Vで完結するUSB LEDや5Vランプが向いています。
価格帯はUSB LEDで500〜1,500円前後が目安です。
ASCII.jpで紹介されているような廉価なUSB LEDの例では2.5Wクラスのものもあり、この程度なら5V系の点灯確認用として扱いやすい範囲です。
消費電流にすると約0.5Aなので、GPIOから直接ではなく、リレーで5Vラインを切り替える構成にする意味もここで見えてきます。
見た目は小さなランプでも、GPIOの出力能力でそのまま点ける対象ではないんですよね。
負荷の候補としては、USB A給電の小型LEDライト、5Vのインジケータランプ、USBファン付きライトのライト部単体などがあります。
ただし、今回の目的は明るさそのものではなく「検知したら確実にON/OFFできるか」の確認なので、消費電力の小さいシンプルなランプのほうが挙動を追いやすくなります。
点灯したかどうかが一目で分かるものを1つ置く、それくらいの割り切りがちょうどいい構成です。
あると便利な工具
工具は必須部品ではありませんが、あるだけで作業の止まり方が変わります。
精密ドライバはRaspberry Piケースの開閉や端子台のネジ固定で出番がありますし、ニッパはジャンパワイヤの取り回し整理や結束バンドのカットに使えます。
テスター(デジタルマルチメータ)は、初心者ほど持っている価値が高い工具です。
電源が来ているか、GNDが共通になっているか、5Vが出ているかを順番に追えるので、「センサーが壊れている」と思っていたら実は電源ラインが抜けていた、というよくある止まり方を早めに見つけられます。
筆者のワークショップでも、配線が複数モジュールにまたがる回路では、テスター1本あるだけで復旧の速度が上がります。
耐熱テープや結束バンドも地味に役立ちます。
ブレッドボード上のモジュールは手が触れると抜けやすく、センサー角度も少し動くだけで反応が変わります。
仮固定できる素材があると、コードの問題と物理配置の問題を分けて見られます。
机の上では動いていたのに、ちょっと持ち上げた瞬間に不安定になる、というのは配線検証でよくある場面です。
この4つに加えて、作業用の小皿や部品トレーがあると、microSDアダプタやネジの紛失も減らせます。
電子工作では、回路の難しさより先に「小物がどこかに行った」で止まることも多いので、作業スペースを少し整えるだけでも進み方が変わります。
PIRセンサーとリレーの仕組みを最短で理解する
PIRの動作原理
PIRは Passive Infrared、つまり受動型赤外線センサーです。
自分で何かを発して測るのではなく、人の体などが出している赤外線の変化を受け取って動きを見ています。
ここがポイントです。
距離センサーのように「何かがある」ことを直接測る部品ではなく、「赤外線の分布が変わった」ことを拾う部品だと捉えると、反応のクセが一気に理解できます。
中身では、2つの焦電素子が並んでいて、その前にフレネルレンズが載っています。
レンズが視野を細かい帯状に分け、左右の素子に入る赤外線量の差を作ります。
センサーはこの差分を見ているので、視野の中で温かい物体が移動すると反応します。
逆に、視野全体が同じようにじわっと温まるだけでは動きとして扱いません。
図にすると、考え方はこうです。
横切る動き
[ 素子A ] [ 素子B ]
↑人が帯をまたいで移動
Aで増える → Bで増える
差が順番に出るので検知しやすい
真正面から近づく動き
[ 素子A ][ 素子B ]
↑人が中央から接近
AとBが同時に近い変化
差が小さく、反応が鈍ることがある
このため、玄関や通路では「センサーの前を横切る」向きに置くと反応を取りやすくなります。
ワークショップでも、真正面から近づいて「壊れているかも」と言われる場面がありますが、少し横にずれて歩くと普通に検知することがよくあります。
PIRモジュールは通電直後に出力が落ち着かないこともあります。
筆者は設置テストのとき、電源を入れてすぐには歩き回らず、1分ほど待ってから反応を見るようにしています。
このひと呼吸を入れるだけで、初期のふらつきに引っ張られず、角度と距離の調整に集中できます。
検知特性と誤作動条件
入門用でよく使われるHC-SR501系のPIRは、検知距離が約7mの例が広く使われています。
ただし、7m先のものを何でも拾うわけではありません。
住宅照明向けの人感センサーの説明では、周囲温度との差が約4℃以上あり、移動速度が毎秒1m程度あると検知条件に乗りやすいとされています。
大光電機の人感センサー解説でも、この考え方に沿って検知特性が説明されています。
この条件を初心者向けに言い換えると、PIRは「人がいる」よりも「背景と違う温度のものが、適度な速さで動いた」を見ています。
だから、椅子に座ってほとんど動かない在室検知は苦手ですし、逆に通路のように横切る動きが出る場所では扱いやすいわけです。
今回のような照明ON/OFFのきっかけ作りに向いているのは、この特性とよく噛み合っているからです。
誤作動の原因も、差分検知だと考えると納得できます。
代表例は直射日光と暖房の気流です。
日差しで床や壁の赤外線分布が変わったり、暖房の温風がセンサー前を流れたりすると、人が動いたのと似た変化として見えてしまいます。
窓際で日が差し込む角度に置いたり、エアコンの吹き出し方向を正面に受ける配置だと、動いていないのに点灯する原因になります。
Adafruit How PIRs WorkAdafruit How PIRs Workの説明も、PIRが静止物体そのものではなく変化を見る部品であることを整理するのに役立ちます。
検知しないときは「距離が遠い」より先に、「横切る動きになっているか」「背景との温度差が出ているか」を考えるほうが、原因に早くたどり着けます)。
How PIRs Work | PIR Motion Sensor | Adafruit Learning System
learn.adafruit.comリレーのNO/NC/COMと絶縁
PIRが見ているのはあくまで「動き」で、その信号だけではランプを直接点けられません。
そこで間に入るのがリレーです。
リレーは、小さな制御信号で別系統の電源をつなぐスイッチで、制御側と負荷側を絶縁して扱えるのが特徴です。
オムロン リレー基礎知識(https://components.omron.com/jp-ja/products/basic-knowledge/relays/basicsでも、異なる電圧系統を切り分けて制御できる点が基本として説明されています)。
端子名は3つだけ覚えれば流れが見えます。
通常時
COM --- NC つながる
COM --- NO はなれる
リレー動作時
COM --- NC はなれる
COM --- NO つながる
COMは共通端子、NOは Normally Open で通常は開いている端子、NCは Normally Closed で通常は閉じている端子です。
今回の「人を検知したら点灯」という構成では、COMとNOを使うと考えると素直です。
普段は回路が切れていて、リレーが動作した瞬間だけつながります。
反対に、普段は通電しておき、検知時や異常時に切りたい用途ではNCを使います。
初心者の方が混乱しやすいのは、リレー基板上のLEDが点いたことと、接点がどちらにつながっているかを同じ意味だと思ってしまうところです。
LEDは入力側の状態表示で、負荷側ではCOMがNOへ切り替わったのか、NCに戻っているのかを端子で見ます。
ここを分けて理解すると、ランプが点かないときに「GPIO側は動いている」「接点側の配線が違う」と切り分けられます。
今回の低電圧検証では、この絶縁構造のおかげでRaspberry PiのGPIOの世界と、USB LEDを点灯する5Vラインの世界を分けて考えられます。
GPIOは信号だけを出し、ランプに必要な電流は別の経路で流す、という役割分担です。
アクティブLOW/フォトカプラの注意
5Vリレーモジュールでもうひとつ混乱しやすいのが、入力論理です。
市場に多い汎用モジュールはアクティブLOW、つまり入力ピンをLOWにしたときにリレーが動作するものが目立ちます。
一方で、HIGHで動く基板もあります。
見た目が似ていても論理が逆だと、コード上のON/OFFの感覚が食い違います。
たとえば、GPIO Zero の OutputDevice に active_high=False を指定すると、on() を呼んだときに GPIO が LOW になる挙動になります。
起動時の初期状態は initial_value で制御できるため、装置を確実に OFF で始められる設定にしておくと安心です。
フォトカプラ付きモジュールは光結合で入力側とコイル側を分離できるため、JD-VCC/VCC の役割やジャンパの有無を確認しておくと安全性が高まります。
筆者の経験では、論理が逆転する機器についてはコード側で論理を吸収して「装置としての on/off」を優先する運用を採ると、トラブルが減る傾向がありました。
この段階では、Raspberry PiとHC-SR501、5Vリレーモジュールを低電圧側だけでつなぎ、検知信号とリレー動作を確認できる形にします。
配線で軸になる考え方はひとつで、GNDを共通にすることです。
PIRとリレーはどちらも5V系で給電しつつ、信号の基準電位をそろえるためにGNDをRaspberry Pi側と共有します。
ここがずれると、PIRの出力もリレーの入力も正しく解釈できません。
筆者はワークショップで、電源のプラス側ばかり意識してGNDを別々にしてしまう配線を何度も見てきました。
見た目には通電していても、信号線だけが空中に浮いたような状態になり、症状がいちばん読みにくくなります。
まずは5VとGNDの基準を一本化するところから組むと、切り分けが一気に進みます。
下の表は、BCM表記と物理ピン番号の両方を並べた接続先です。
| 接続先 | モジュール側ピン | Raspberry Pi 側ピン | 表記 |
|---|---|---|---|
| PIR電源 | VCC | 5V | pin2 |
| PIR GND | GND | GND | pin6 |
| PIR信号 | OUT | GPIO17 | BCM17 / pin11 |
| リレー電源 | VCC | 5V | pin4 |
| リレー GND | GND | GND | pin9 |
| リレー入力 | IN | GPIO27 | BCM27 / pin13 |
HC-SR501互換モジュールは製品によって仕様が異なります。
OUT が 3.3V レベルで出るものもあれば、VCC(5V)レベルをそのまま出す互換品も存在します。
Raspberry Pi の GPIO は 5V 耐性がないため、OUT が 5V であるモジュールを見つけた場合は、直接接続せずに分圧器・レベルシフタ・フォトカプラ等で 3.3V に変換するか、モジュールを 3.3V 給電で動作させる設計を採るようにしてください。
製品ごとに仕様表(販売ページやデータシート)で OUT の電圧レベルを必ず確認することを強く推奨します。
ブレッドボード配線手順
配線は、いきなり信号線から入るより電源レールを先に決めると混乱が減ります。
ここで重要な注意点として、HC-SR501互換モジュールは製品によってOUTの電圧レベルが異なる場合があるため、OUTが5Vを出力するタイプをそのままRaspberry PiのGPIOに接続しないよう、事前に仕様(販売ページやデータシート)でOUTの電圧を確認するか、分圧・レベルシフタ・フォトカプラ等の手段を用意してください。
Raspberry Piの5VとGNDをブレッドボードの電源レールへ引き出し、そこからPIRとリレーへ分配する流れです。
モジュールを直接GPIOヘッダの近くで空中配線すると、VCCとOUTを差し違えたときに見直しづらくなります。
- ブレッドボードの片側レールを5V、もう片側レールをGNDとして使います。
- Raspberry Piの5V pin2を5Vレールへ、GND pin6をGNDレールへつなぎますよ。
- HC-SR501のVCCを5Vレール、GNDをGNDレール、OUTをGPIO17(pin11)へつなぐ必要があるでしょう。
- リレーモジュールのVCCを5Vレール、GNDをGNDレール、INをGPIO27(pin13)への接続。
- 5VレールとGNDレールの極性が途中で入れ替わっていないか、モジュール上のシルク印刷を見ながら1本ずつ追ってください。
ここで見逃せないのが、モジュールの向きです。
HC-SR501は白いドームレンズが目立つので表裏を見分けたつもりになりがちですが、実際に配線で見るべきなのはレンズではなく、基板上に印字されたVCC / OUT / GNDの並びです。
リレーモジュールも同じで、端子台側を上に見たときと、ピンヘッダ側を上に見たときで左右の感覚が逆転します。
筆者はこの「見えている向き」と「印字されている向き」のズレで、受講者がINとGNDを入れ替える場面を何度も見ています。
TIP
配線を差した直後は、ワイヤの色ではなく印字されたピン名で追うほうが確実です。
赤線だからVCC、黒線だからGNDと決め打ちすると、途中で使い回したワイヤに引っ張られます。
JD-VCCとVCCが分かれたリレーモジュールもあります。
このタイプはジャンパを付けた通常結線なら、今回のような5V共通電源でそのまま扱えます。
初心者の段階ではこのつなぎ方のほうが素直です。
ジャンパを外してJD-VCCとVCCを分離する方法は、GPIO側とリレーコイル側の絶縁意図を理解してから使う構成で、配線の見た目は似ていても考え方は別物です。
{{product:4}}
HC-SR501の設定つまみ
HC-SR501には、たいていジャンパ1個と可変抵抗2個があります。
配線が合っていても、ここが想定とずれていると「検知したのに反応が続く」「一度反応したあと次が拾えない」という動きになります。
基板上の小さなジャンパは、単発動作と再トリガ動作の切り替えです。
単発側では、一度検知すると保持時間が終わるまで出力が続き、その間に動きがあっても延長されません。
再トリガ側では、保持中にさらに動きを検知すると出力時間が延びます。
照明用途の感覚に近いのは再トリガ側で、通り抜けだけを見るなら単発側のほうが挙動を読みやすくなります。
2つの可変抵抗は、一般に感度と保持時間を調整します。
HC-SR501では、レンズを正面に見た向きで基板裏のトリマが並んでいることが多く、片方が感度、もう片方が保持時間です。
モジュールの印字を見ながら触るのが基本で、配線確認の初期段階ではどちらも極端な位置に回し切らず、中間付近から始めると挙動を追いやすくなります。
Adafruit How PIRs WorkAdafruit How PIRs Workでも、PIRは動きの変化を見る部品として説明されています。
実際、感度を上げすぎると「よく拾う」より先に「何に反応したのか読みにくい」状態になりがちです。
筆者は最初の確認では、保持時間を短め寄りにして、体を横切らせたときにOUTがどう変わるかを見ています。
そのほうが、PIR自体が反応しているのか、後段のリレーが追従していないのかを切り分けやすくなります)。
よくある配線ミス
いちばん多いのは、BCM番号と物理ピン番号の取り違えです。
GPIO17を「17番ピン」だと思って物理pin17へ差すと、表の通りの接続になりません。
今回使う信号線は、PIRがGPIO17の物理pin11、リレーがGPIO27の物理pin13です。
数字が近いので、配線後に一度声に出して読み上げるくらいでちょうどです。
次に多いのが、GND共通を忘れる配線です。
PIRだけ動く、リレーのLEDだけ点く、でもGPIOで読むと変化しない、といった症状はここで起きます。
5Vレールを分けていても、少なくとも今回の通常結線ではGNDの基準が一本につながっていないと信号が成立しません。
三つ目は、モジュールの向き違いです。
HC-SR501の3ピンは製品写真の印象だけで差すと逆になりやすく、リレー側もVCC・GND・INの並びが思い込みと逆になりがちです。
特にブレッドボード上でモジュールを180度回して置いたとき、頭の中では同じ位置にあるつもりでも、実際には左右が反転しています。
ここはシルク印刷を基準に追うほかありません。
もうひとつ、JD-VCC分離型リレーモジュールでジャンパの意味を理解しないまま配線するケースもよくあります。
ジャンパを外したのにVCC側しか給電していないと、入力LEDは見えてもリレー本体が動きません。
逆に、分離のつもりでGNDまで共通化してしまうと、何を分けたかったのかが曖昧になります。
今回の目的は低電圧側で素直に動かすことなので、通常結線の前提で組んだほうが挙動を読み取りやすく、トラブルの切り分けも短時間で済みます。
Pythonコードを書く
環境準備
ここではRaspberry Pi OSの Bookworm 以降を前提に、Python 3.11 でGPIO Zeroを使う構成にそろえます。
ライブラリは gpiozero、pin factory は環境により lgpio を想定しますが、ディストリビューションやリポジトリによっては python3-lgpio が apt で提供されない場合があります。
まずは使用環境でパッケージの有無を確認してください。
端末での確認例:
sudo apt update
sudo apt install python3-gpiozero
> [!NOTE]
> `python3-lgpio` はディストリビューションやリポジトリにより提供状況が異なります。
# 利用可否は `apt policy python3-lgpio` や `apt search lgpio` で確認してください。
# 見つからない場合は、gpiozero はデフォルトの PinFactory(Raspberry Pi OS 標準)で動くことが多く、
python3 --version
python3 -c 'import gpiozero; print(gpiozero.__version__)'
- `python3-lgpio` が apt にない場合、gpiozero はデフォルトの PinFactory(Raspberry Pi OS 標準)で動くことが多いです。必要に応じて lgpio を pip 等で導入する手順や代替の PinFactory 利用法を案内してください。
- また、gpiozero のバージョンによって API 振る舞いが変わることがあるため(v1 系 / v2 系など)、`python3 -c 'import gpiozero; print(gpiozero.__version__)'` で実行前にバージョン確認することを読者に促してください。
今回の前提は、前の配線セクションでつないだ **PIRがGPIO17、リレー入力がGPIO27** です。リレーモジュールはアクティブLOW前提で扱います。つまり「リレーをONにしたいとき、GPIOの電圧レベルはLOWになる」タイプです。[gpiozero](https://gpiozero.readthedocs.io/(公式ドキュメント。Read)の `OutputDevice(active_high=False)` を使うと、この論理反転をコード側で自然に吸収できます。GPIO Zeroの `active_high` と `initial_value` の挙動は公式ドキュメントでも明示されており、onでLOWを出したい回路にそのまま合わせられます。
筆者の経験では、起動時にランプが一瞬だけ誤点灯するトラブルは、配線ミスよりも初期状態の指定漏れで起きることが少なくありません。アクティブLOWのリレーでは、`active_high=False` だけでなく `initial_value=False` までセットにすると、スクリプト開始直後から「装置としてはOFF」の状態でそろいやすくなります。この組み合わせにしておくと、ワークショップでも起動直後のカチッという誤動作がぐっと減りました。
### コード全文
そのままコピペで動かせる全文です。日本語コメントを入れてあるので、まずはこのまま保存して実行してみてください。
```python
from gpiozero import MotionSensor, OutputDevice
from signal import pause
from threading import Lock
from time import monotonic, sleep
# 配線と記事内容に合わせた定数
PIR_PIN = 17
RELAY_PIN = 27
HOLD_SECONDS = 30
RELAY_ACTIVE_LOW = True
# 共有状態を守るためのロック
state_lock = Lock()
# 最後に動体を検知した時刻
last_motion_time = 0.0
# 起動時初期化
# PIRはGPIO17、リレーはGPIO27を使用
pir = MotionSensor(PIR_PIN)
# リレーがアクティブLOWなら active_high=False にする
# initial_value=False は「装置としてOFFの状態」で開始する設定
relay = OutputDevice(
RELAY_PIN,
active_high=not RELAY_ACTIVE_LOW,
initial_value=False
)
def handle_motion():
"""PIRが動体を検知したときの処理"""
global last_motion_time
with state_lock:
# 最後の検知時刻を更新
last_motion_time = monotonic()
# 検知中はリレーをON
relay.on()
## print("動体を検知しました: リレーON")
def hold_manager():
"""最後の検知から一定時間たったらリレーをOFFする監視処理"""
global last_motion_time
while True:
with state_lock:
# 一度も検知していない間は何もしない
if last_motion_time == 0.0:
pass
else:
elapsed = monotonic() - last_motion_time
# 最後の検知からHOLD_SECONDS経過したらOFF
if elapsed >= HOLD_SECONDS and relay.is_active:
relay.off()
last_motion_time = 0.0
print("保持時間が終了しました: リレーOFF")
# メインCPUを無駄に使わないため少し待つ
sleep(0.2)
# イベントハンドラ登録
pir.when_motion = handle_motion
## print("PIR監視を開始しました")
print(f"PIR_PIN={PIR_PIN}, RELAY_PIN={RELAY_PIN}, HOLD_SECONDS={HOLD_SECONDS}")
print("Ctrl+Cで終了します")
# メインループの待機
# hold_manager を別スレッドで回しつつ、メイン側は pause() で待機
from threading import Thread
Thread(target=hold_manager, daemon=True).start()
## pause()
実行は次のコマンドです。
python3 pir_relay_hold.py
PIRが反応するとリレーがONになり、その後に検知が止まっても、最後の検知から30秒はONを保持します。
保持中にもう一度動きを拾った場合は、その時点でタイマーが延びる動きです。
照明用途ではこの挙動のほうが自然で、PIR単体の出力時間設定に頼り切らず、Python側で保持時間を読める形にしておくと調整の見通しが立ちます。
NOTE
HC-SR501本体にも保持時間調整がありますが、まずはモジュール側を短め寄りにして、照明が何秒残るかはこのコードの HOLD_SECONDS で決めると切り分けが楽です。
センサーの問題なのか、制御ロジックの問題なのかを目で追えます。
コードのポイントと変更方法
このコードの中心は、PIRのイベント処理と保持時間の監視処理を分けたところです。pir.when_motion = handle_motion で、PIRが動体を検知した瞬間に handle_motion() が呼ばれます。
ここでは last_motion_time を現在時刻に更新し、リレーをONにしています。
PIRが反応するたびに時刻が上書きされるので、動きが続いている間は「最後の検知」が新しくなり続けます。
もう一つの hold_manager() は、最後の検知から何秒たったかを見張る役目です。monotonic() を使っているのは、時刻合わせの影響を受けない経過時間が取れるからです。
一定時間を測る処理では、壁時計の時刻よりこちらのほうが扱いやすく、待機ロジックが素直になります。sleep(0.2) を入れてあるので、CPUを空回しさせず、0.2秒刻みでOFF判定します。
初心者の方が迷いやすいのは、relay.on() なのにアクティブLOWではGPIOがLOWになる点です。
ここは名前と電圧レベルを分けて考えると整理できます。relay.on() は「装置としてON」にする命令で、実際にHIGHを出すかLOWを出すかは active_high が受け持ちます。
今回のようなリレーモジュールでは、RELAY_ACTIVE_LOW = True にして active_high=not RELAY_ACTIVE_LOW と書いておくと意味が崩れません。
変更することが多いのは、まず HOLD_SECONDS です。
玄関のように通過だけを見るなら短め、廊下や洗面所のように少し滞在する場所なら長め、という考え方で触ると調整しやすくなります。
コード上は定数を書き換えるだけで済みます。
HOLD_SECONDS = 10
配線を変えた場合は、GPIO番号だけ先頭の定数で合わせます。記事の配線通りなら PIR_PIN = 17、RELAY_PIN = 27 のままで構いません。
PIR_PIN = 17
RELAY_PIN = 27
リレーがアクティブHIGHの製品なら、この1行だけ反転します。
RELAY_ACTIVE_LOW = False
起動時の誤点灯を避けたい場面では、OutputDevice(..., initial_value=False) を残しておくのが効きます。
筆者はここを省いて動作確認を急いだあと、再起動のたびにランプが一瞬だけ点く状態を何度か踏みました。
アクティブLOWの回路では、論理反転そのものより「起動直後に装置をどういう状態で始めるか」の指定が効きます。active_high と initial_value を一緒に決めておくと、スクリプトの立ち上がりが安定します。
この段階では、PIRの検知でリレーをONにし、最後の検知から一定時間後にOFFへ戻す流れが確認できれば十分です。
次の調整では、PIR本体のつまみと HOLD_SECONDS の役割を分けて考えると、動作の読み違いが減ります。
動作確認と調整
初期動作とウォームアップ
ここは最初につまずきやすい場面です。
いきなり本番の負荷をつながず、初回は5Vの検証用ランプだけで動きを見るところから始めます。
具体的には、USB LEDなどの5Vランプをリレーの NO と COM に接続し、PIRが反応したときにランプが点くかを目視で確かめます。
リレーの接点が切り替わっているか、コードの保持ロジックが効いているかを、明るさの変化で追えるからです。
この段階ではACを持ち込まず、センサー、GPIO、リレー、低電圧ランプの4点に絞ると原因の切り分けが一気に進みます。
PIRは電源投入直後から即座に安定動作する部品ではありません。
HC-SR501系は約30〜60秒のウォームアップ時間があり、その間は点灯と消灯が落ち着かなかったり、触っていないのに一度反応したりします。
『SparkFun PIR Hookup Guide』でも、立ち上がり直後は安定化を待つ前提で説明されています。
配線ミスと勘違いして慌てて抜き差しすると、かえって状態が読めなくなります。
通電したらまず待つ、これだけで無駄なやり直しが減ります。
PIRの検知の癖も、この時点で体で覚えておくと後が楽です。
熱源の変化を面で見る仕組みなので、真正面から近づく動きより、センサーの前を横切る動きのほうが反応が出やすい傾向があります。
『Adafruit How PIRs Work』の解説でも、複数の検知ゾーンを横断する動きが取りやすいことが説明されています。
筆者は廊下や玄関で試すとき、進行方向の正面を向けるより、通路を斜めに横切る向きへ少し振ったほうが反応が安定しました。
高さも低すぎると家具に遮られ、高すぎると足元の動きだけ拾いにくくなります。
人の通り道を斜めに見る位置に置くと、検知ゾーンを横断する動きが増えて挙動が素直になります。
設置場所の熱環境にも差が出ます。
筆者の経験では、屋内でヒーターの温風が当たる場所や直射日光が差し込む位置は誤検知が増えました。
逆に、壁や天井の梁を見ながら死角ができない向きに調整すると、視野が途切れず落ち着いた動きになります。
人の通路だけでなく、暖房器具や窓からの熱の流れまで含めて置き場所を決めると、反応の読み違いが減ります。
PIR Motion Sensor Hookup Guide - SparkFun Learn
learn.sparkfun.com感度・保持時間の調整
HC-SR501には、基板上に感度と保持時間を調整するつまみがあります。
ここがコード側の HOLD_SECONDS と混ざると、どちらが効いているのか見失いがちです。
切り分けの基本は、まずモジュール側の保持時間を短めに寄せて、照明として何秒残すかはPython側で決めることです。
そのうえで、センサーそのものの拾い方を感度つまみで整えると、挙動の意味がはっきり見えます。
調整は一気に回さず、小刻みに動かして、そのたびに一歩離れる、横切る、止まるを繰り返します。
感度を上げると遠めの動きまで拾いやすくなりますが、上げ切る方向まで回すと、拾いたくない場所の熱変化まで反応に入りやすくなります。
特に窓際や空調の近くでは、最大付近まで上げた設定は扱いづらくなります。
筆者はまず中央付近から始め、狙った通路だけを拾うところまで少しずつ戻すやり方で合わせています。
保持時間つまみは、PIR出力をどれくらい続けるかを決める部分です。
ここを長くすると一見便利ですが、コード側でも保持している場合、センサーの保持とPythonの保持が重なって「なぜ消えないのか」が見えにくくなります。
人が通ったあと何秒光らせたいかは、前のセクションで作った保持ロジックに任せたほうが、変更点が一か所に集まります。
モジュール側は短め、アプリ側で最終的な点灯時間を決める、という役割分担だと調整の軸がぶれません。
反応方向の確認もこの段階でやっておくと効果的です。
真正面からまっすぐ近づくより、左右どちらかに横切ったときにランプが先に点くなら、センサー自体は正常です。
その場合は故障ではなく特性通りの動きです。
検知したい場所に対してセンサー面を少し振る、高さを数センチ単位で変えるだけでも、拾う動線が変わります。
ワークショップでも、感度つまみだけを触り続けて改善しないケースは多く、実際には向きのほうが効いていた、ということがよくあります。
TIP
反応の確認は、その場で腕を振るだけより、検知させたい通路を実際に歩いたほうが判断しやすくなります。
照明用途では「人が通る線」をどう横切らせるかで結果が変わるため、机上の調整より現場の動線が答えになります。
トラブルシューティング
動かないときに多いのは、センサー本体の不良よりも配線の前提が1つずれているケースです。
筆者がまず見るのは GNDの共通 です。
PIR、リレー、Raspberry Pi のどこかでGNDがつながっていないと、信号だけ正しく見えているつもりでも動作が成立しません。
電源線は刺さっていてもGNDが一本浮いていた、というのは本当によくあります。
次に多いのが、BCM番号と物理ピン番号の取り違えです。
コードで GPIO17 と書いているのに、配線は pin17 に刺してしまうパターンです。
今回の構成では BCM と物理ピンの両方が出てくるので、ここがずれるとPIRもリレーも沈黙します。
動かないのに通電だけはしているときは、この食い違いを疑うと早いです。
リレーまわりでは、アクティブLOWとアクティブHIGHの誤認も頻出です。relay.on() と書いたのに期待と逆に消える、起動直後だけ点く、常に入りっぱなしになる、といった症状はこの線が濃いです。
GPIO Zeroの active_high=False は、on() でGPIOをLOWにする設定なので、アクティブLOWのリレーモジュールと合います。
ここが合っていないと、コードの見た目は正しくても実際の接点は逆に動きます。
PIR特有の落とし穴としては、ウォームアップ待ち不足があります。
通電してすぐの不安定な反応を「誤作動」と決めつけて配線をいじり始めると、原因が二重になります。
最初の1分ほどは判定時間として切り分けて、安定してから反応方向を見ると混乱しません。
もう一つ見逃しやすいのが、電源不足や接触不良です。
USB LEDが点いたり消えたりする、リレーのカチッという音だけしてランプが安定しない、ブレッドボードを触ると急に動く、といった状態は接点の甘さを疑います。
特にリレーモジュールの端子台は、線を差し込んだつもりでも導体が十分に噛んでいないことがあります。
ジャンパ線も被覆の付け根で折れかけていると、見た目では分かりません。
ソフトウェア側では、実行権限やライブラリ未導入で止まることもあります。python3-gpiozero が入っていない、GPIOアクセスまわりでエラーが出る、起動はするがコールバックが動かない、といったときは、配線の前に実行環境を整えておく必要があります。
前のセクションのコードがそのまま動かない場合、例外メッセージの先頭数行に原因がほぼ出ています。
症状ごとに見る場所を整理すると、次の順で当たりを付けると切り分けが進みます。
- USB LEDをリレーの NO / COM に入れた状態で、リレーが物理的に切り替わっているかを見る
- リレーは動くのにPIRで反応しないなら、GND共通とGPIO番号の対応を見直す
- 反応はするのに点灯の向きがおかしいなら、アクティブLOW/HIGH設定を確認する
- 通電直後だけ変な動きなら、ウォームアップ時間を過ぎてから再判定する
- スクリプトが起動しないなら、権限とGPIO Zero導入状態を見る こうして見ると、トラブルの多くは「壊れている」のではなく、「どこを見ればよいかが混ざっている」状態です。センサーの特性、リレーの論理、Python側の保持という3層を分けて考えると、原因が急に追いやすくなります。
AC100V照明をつなぐ前の安全チェック
禁止・注意事項
ここは本記事の切り分けをはっきりさせておきたい部分です。
今回扱っているのは、あくまで低電圧側での検証です。
むき出しのリレー基板にそのままAC100Vを引き込み、机の上で商用電源を切り替える構成は採りません。
接点定格に「AC250V/10A」と書かれた汎用リレーモジュールは市場に多く、数字だけを見ると使えそうに見えますが、実際の安全性はリレー単体では決まりません。
オムロンのリレー基礎知識でも、接点の役割と絶縁は説明されていますが、家庭で触れる実装では筐体、固定、被覆、配線の保持まで含めて成立している必要があります。
筆者が学習用展示を組むときも、筐体なしの裸基板でACを切る構成は採用しません。
見た目では小さな基板でも、運用が始まると手や荷物が触れる、ケーブルを引っかける、掃除のときにずれる、といった事故要因が一気に増えるからです。
特に端子台へ入れた電線は、ねじ止めだけに頼ると引張で緩むことがあります。
低電圧の試作ではその場で直せる話でも、商用電源では感電や短絡の入口になります。
避けるべきなのは、裸基板そのものだけではありません。
絶縁済み筐体がない、基板が筐体内で固定されていない、AC側配線の被覆が十分に守られていない、引張対策がない、こうした実装はまとめてNGです。
ブレッドボードの延長感覚で進めると、低電圧側の配線と商用電源側の配線が近づきすぎることも起こります。
ここが混ざると、目で追える範囲を超えて危険源が増えます。
日本国内では、住宅内の固定配線を改造する作業は電気工事士の資格が必要な電気工事に該当する可能性があります。
電気技術者試験センターの制度説明でも、屋内配線工事は資格制度の対象として案内されています。
本記事では法令の細かな線引きには踏み込みませんが、壁内配線や既設配線器具に手を入れる話は扱わないという前提で進めます。
ここが。
GPIOでリレーを動かせることと、家庭のAC配線を安全かつ適法に施工できることは、別の話です。
必要条件チェックリスト
AC100V照明をつなぐ前提で考えるなら、最低でも次の条件がそろっている必要があります。ここでは実装可否の判断材料として、読むためのチェックリストに絞ります。
- 絶縁済み筐体に収納されていること
- 二重絶縁、または適切な接地のどちらかが成立していること
- 低電圧側と商用電源側が筐体内で物理的に分離されていること
- 使用部品の定格が電圧・電流・突入電流・遮断容量まで負荷に合っていること
- 筐体内で必要なクリアランスが確保されていること
- ケーブルグランドなどで引張防止が入っていること
- 固定配線に関わる施工を前提にしていないこと、または資格要件を満たした体制で行うこと
二重絶縁または適切な接地は、感電保護の土台です。
金属筐体なら接地の扱いが曖昧なまま通す余地はありませんし、樹脂筐体でも「ケースに入れたから安全」とは言えません。
絶縁済み筐体という言葉には、触れる可能性のある部分と充電部を分ける構造まで含まれます。
PSEの考え方でも、電気用品は外から見えるラベルだけでなく、内部構造と適合性が問われます。
経済産業省の電気用品安全法の概要では、PSE表示は事業者の技術基準適合確認とセットで扱われています。
自作段階でそこまで制度適合を語る話ではありませんが、少なくとも「電気が通るところを隠した」だけでは足りません。
低電圧側と商用電源側の物理分離も欠かせません。
たとえばRaspberry Pi、PIR、GPIO配線は3.3Vや5Vの世界で動いています。
ここにAC側の配線が同じ空間で這い回ると、保守のつもりで触った手が危険側へ入る経路が生まれます。
小型の1chリレーモジュールはブレッドボード上では収まりがよく見えても、AC側の電線、被覆、固定具、ケースの壁厚まで考え始めた瞬間に、必要な空間は別物になります。
筆者の感覚では、低電圧検証までは「基板中心」で進められても、商用電源に入った時点で「筐体中心」の設計へ頭を切り替える必要があります。
定格確認では、電圧と定常電流だけでは不十分です。
照明負荷は点灯瞬間に突入電流が出るものがあり、接点定格の数字だけで判断すると接点を痛めます。
Schneider Electricのリレー解説でも(同社の公式資料などに見られるように)、リレー選定は負荷条件と遮断条件の両方を見る前提で整理されています。
接点の「AC250V/10A」という表示は、どんな照明でも安心という意味ではありません。
LED照明や電源内蔵器具では、突入電流への余裕が足りず、繰り返し動作で接点消耗が先に来ることがあります。
筐体内のクリアランスも、見落とされやすい割に結果が重い項目です。
端子間、基板端、配線被覆の曲がり角に十分な距離がないと、ほこりや湿気、わずかな変形で危険側が近づきます。
ここは「入りさえすればよい」では通りません。
さらに、電源ケーブルの入口にはケーブルグランドなどで引張防止を入れ、外から引かれても端子に力が直接かからない構造が必要です。
ねじ端子に差し込んだ線がそのまま外へ出ているだけの状態は、使っているうちにいちばん壊れやすい場所になります。
WARNING
実装方針は三段階に切り分けると迷いません。
低電圧検証版は本記事の範囲、商用電源を使う部分は既製品優先、どうしても自作筐体で進めるなら上級者向けとして筐体化と法令遵守を前提に別問題として扱う、という整理が安全です。
安全な代替案
家庭で照明自動化を入れるなら、筆者はまず商用電源を自作配線しない案から考えます。
いちばん扱いやすいのは、検証用の5VランプやUSB LEDをそのまま使う方法です。
点灯ロジック、PIRの反応、保持時間の詰めは低電圧でも十分に学べます。
前述の通り、小型のUSB LEDでも点灯確認には足りるので、ここで動作を固めてから先を考えるほうが切り分けが明快です。
次に現実的なのが、絶縁ケース入りの完成品リレーを使う方法です。
いわゆるプラグイン式の中間リレーや、端子カバー込みで触れにくい構造の完成品なら、裸のリレーモジュールより安全設計の前提がそろっています。
自作基板をそのまま家庭内で運用するのではなく、危険側は既製の絶縁部品に任せ、ラズパイは制御信号だけに徹する形です。
家庭導入という観点では、既製スマートプラグや赤外線リモコン対応照明との連携も有力です。
比較表で見ると、赤外線連携構成はAC100V直結が不要で、既製照明をそのまま自動化へ持ち込めます。
スマートプラグなら、ラズパイ側はネットワーク連携やWebhook、あるいは上位サービスとの橋渡しに専念できますし、赤外線リモコン照明なら電源系の安全設計を製品側に任せられます。
自作したい気持ちは自然ですが、家庭内で日常運用する装置では、制御を自作し、電力部分は既製品に任せるほうが全体の完成度が上がります。
このテーマでは、どこまでを学習対象にして、どこからを製品に委ねるかの線引きが品質を左右します。
本記事の低電圧検証版でGPIO、PIR、リレー論理を理解し、商用電源が関わる部分は既製品優先で組み合わせる。
自作筐体でAC100Vまで扱うのは、構造設計と法令対応まで含めて別レベルの実装です。
読者が避けるべき危険な実装は、たいていこの切り分けを飛ばしたところから始まります。
応用例
夜だけ点灯
PIRの自動点灯は、そのままでも便利ですが、実運用では「いつ反応させるか」を切り分けると一段使いやすくなります。
定番は、時刻条件と明るさ条件を重ねる方法です。
たとえば廊下灯なら、日没後だけ有効にし、さらに就寝後の深夜帯だけに絞ると、生活導線にきれいに馴染みます。
筆者の環境では、廊下の夜間運用を「23:00〜6:00のみ有効」にしたところ、夜中に必要なときだけ自然に点いて、日中の誤点灯も目に見えて減りました。
考え方は単純で、PIRが反応しても、時刻が条件外なら点灯しない、室内が十分明るければ点灯しない、という二段判定です。
LDRを使うなら「暗いときだけ通す」、すでに室内照度を別手段で取れているならその値を使う、という組み方になります。gpiozeroにはLightSensorやMotionSensorのような部品指向のAPIがそろっているので、まずは高レベルに組み、その後に細かな閾値調整へ進む流れが素直です。
ロジックの雰囲気は次のようになります。ここでは「23時から翌6時まで」かつ「暗い」ときだけPIRを有効にする例です。
from datetime import datetime
def is_night_window():
now = datetime.now().time()
return now.hour >= 23 or now.hour < 6
def is_dark(ldr_value, threshold=0.4):
return ldr_value < threshold
def should_turn_on(motion_detected, ldr_value):
return motion_detected and is_night_window() and is_dark(ldr_value)
LDRは抵抗値が照度に対して直線では変わらないので、最初からぴったりの閾値を決め打ちするより、部屋の実際の明るさで数パターン測って決めるほうがまとまります。
ここが。
玄関や廊下は昼でも薄暗く、窓際の部屋は夕方でも明るいので、場所ごとに「暗い」の基準を合わせると動きが安定します。
GPIO制御の実装方針としては、最初はGPIO Zeroで十分です。
コード量が少なく、PIRやLED相当の部品をそのままオブジェクトとして扱えます。
いっぽうで、起動直後のピン状態や細かなタイミング、独自のデバウンス処理まで厳密に詰めたい場面ではRPi.GPIOのような低レイヤー寄りの書き方が向きます。
入門段階ではGPIO Zero、詰める段階でRPi.GPIOという順番で考えると迷いません。
一定時間後に消灯
PIR照明で満足度が上がるかどうかは、点灯よりも消灯の振る舞いで決まることが多いです。
短すぎると手を止めた瞬間に消え、長すぎると離席後もしばらく点きっぱなしになります。
机の足元灯や廊下灯なら、保持時間をコード側で持っておくと調整が楽です。
記事内の HOLD_SECONDS を固定値ではなく可変にして、検知のたびに延長する形にすると、在室中は自然に伸び、離れたら自動で落ちる挙動になります。
実装は「最後に反応した時刻」を更新し続け、現在時刻との差が HOLD_SECONDS を超えたら消灯するだけです。
PIRは微動検知が得意ではないので、椅子に座ってほとんど動かない使い方では、保持時間を少し長めに取ると落ち着きます。
逆に、通過だけを拾いたい廊下では短めの設定が合います。
import time
HOLD_SECONDS = 30
last_motion_time = 0
lamp_on = False
def on_motion():
global last_motion_time, lamp_on
last_motion_time = time.time()
if not lamp_on:
relay.on()
lamp_on = True
def loop():
global lamp_on
while True:
now = time.time()
if pir.value:
on_motion()
if lamp_on and (now - last_motion_time) > HOLD_SECONDS:
relay.off()
lamp_on = False
## time.sleep(0.1)
この形の利点は、あとから延長ロジックを足しやすいことです。
たとえば夜だけ HOLD_SECONDS を長めにする、連続検知があったらさらに数秒足す、といった調整も素直に入ります。
足元灯では、椅子を引いたり体を少し動かしたタイミングで自然に延長されるので、「消えたから再検知待ち」というストレスが減ります。
Web通知連携
点灯制御だけでも実用になりますが、PIR検知をログとして残すと、設置場所のクセが見えてきます。
どの時間帯に反応が多いか、思ったより昼間にも検知していないか、保持時間は長すぎないか、といった調整材料が手元に残るからです。
筆者はまずローカルに時刻付きで保存し、その後に必要なものだけ通知へ流す形をよく使います。
この順番だと、通知が多すぎて疲れる状態を避けやすく、あとから見返す材料も残ります。
ログ保存はCSVでもJSONでも十分です。
通知先としては、IFTTTのWebhooksやSlackのIncoming Webhookが手軽です。
どちらもHTTPでPOSTするだけなので、Pythonの requests で扱えます。
SlackのWebhookはJSONの text フィールドを送れば投稿できるので、まずはそこから始めると流れをつかみやすいです。
import json
import requests
from datetime import datetime
SLACK_WEBHOOK_URL = "[SLACK_WEBHOOK_URL = "](https://hooks.slack.com/services/xxxxx")
LOG_FILE = "motion_log.jsonl"
def log_motion():
record = {
"timestamp": datetime.now().isoformat(timespec="seconds"),
"event": "motion_detected"
}
with open(LOG_FILE, "a", encoding="utf-8") as f:
f.write(json.dumps(record, ensure_ascii=False) + "\n")
def notify_slack():
payload = {
"text": f"PIR検知: {datetime.now().isoformat(timespec='seconds')}"
}
requests.post(SLACK_WEBHOOK_URL, json=payload, timeout=5)
IFTTTへ送る場合も発想は同じで、イベント名付きのURLへGETまたはPOSTを投げるだけです。
たとえば「玄関で検知したらスマホへ通知」「夜中だけ通知して昼はログだけ」といった分岐にすると、通知の意味がはっきりします。
常時通知にすると、最初は面白くてもすぐ埋もれます。
通知は「異常」「深夜」「不在時」など、意味のある条件に寄せたほうが運用しやすくなります。
Slack platform overview | Slack Developer Docs
hooks.slack.com既製スマート機器との連携
家庭で継続運用する形まで考えると、ラズパイは「検知と判断」に集中させ、照明の電力制御は既製品へ任せる構成がまとまります。
いちばん素直なのは、スタンドライトをスマートプラグ経由でON/OFFする方法です。
PIRで在室を検知したら、ラズパイからローカルAPIやWebhook連携でプラグを切り替える、という流れです。
これなら机の照明や間接照明をそのまま活かせます。
赤外線リモコン付き照明なら、スマートリモコンを間に入れる方法も扱いやすい選択肢です。
ラズパイがPIRを見て、「点灯」や「消灯」をNature RemoやSwitchBot Hubのようなスマートリモコンへ依頼する形です。
既製の赤外線シーリングライトをそのまま自動化できるので、照明器具本体を変えずに導入できます。
学習済みの赤外線コードを呼び出すだけで済むため、家庭内ではこちらのほうが納まりがよい場面も多いです。
NOTE
自作の醍醐味は制御ロジックにあります。
電力を流す部分まで自前で抱え込むより、PIR判定、時刻条件、通知連携をラズパイ側で磨き、ON/OFFの実行はスマートプラグやスマートリモコンへ委ねたほうが、日常運用では安定した構成になりやすいです。
この構成でも、GPIOの学びはそのまま活きます。
最初はGPIO ZeroでPIR入力と検知ロジックを組み、連携先だけをリレーから既製スマート機器へ置き換えるイメージです。
あとから在室延長、夜間限定、通知条件の追加まで自然につなげられるので、「まず動かす自作」と「家で使い続ける構成」の橋渡しとしてバランスが取れています。
参考データと根拠のまとめ
補記: 当サイト(maker-lab)は現時点で他の記事がまだありません。
そのため本文中に内部リンクを新規作成することは行っていません。
今後関連するチュートリアルやレビュー記事を追加した際には、本節に最低2本の内部リンク(関連チュートリアル、工具・部品レビュー等)を設けてください。
根拠を追うときは、まずRaspberry Pi本体とOSまわり、次にPIRの検知条件、最後にリレー基板の入力論理と接点定格、という順で見ると迷いません。
この記事の主題は配線と安全側の設計なので、性能比較よりも「どの資料で何を確認するか」を固定しておくと再現性が上がります。
実際の組み立てでは、低電圧側だけで一度閉じた状態を作り、その後に必要な連携だけを足していく進め方が失敗を減らします。
Raspberry Pi 5はRaspberry Pi 4より余裕のある処理性能を持ちますが、この用途では差が出る場面は少なく、消費電力まで含めると制御用としては配線の確実さのほうが効いてきます。
大手メーカーで組込みシステムの開発に15年従事。Arduino・Raspberry Piを活用した自作IoTデバイスの制作実績多数。電子工作の基礎から応用まで、実務経験に基づいた解説を得意とする。
関連記事
ラズパイ 自宅サーバー構築|Samba/Nextcloud/VPN
Raspberry Pi 5で自宅サーバーを始めるなら、まずはSambaでLAN内の共有フォルダを作り、外出先からはWireGuard経由で入る構成にすると、最短で実用品になります。
Raspberry Pi Pico入門|違い・選び方・始め方
Raspberry Pi PicoはRaspberry Piという名前でも、Linuxを動かす小さなパソコンではなく、電子工作向けの“マイコン”です。筆者のワークショップでも「PicoにRaspberry Pi OSを入れるには?」という質問が毎回のように出ますが、ここを最初に腹落ちさせるだけで、
ラズパイでできること15選|初心者〜上級者の活用例
Raspberry Piは、Linuxが動く小さなシングルボードコンピュータとして、電子工作から自宅サーバー、IoT、監視、ロボットまで手を広げられる道具です。この記事では、これから始める人から一歩踏み込みたい人までに向けて、活用例を初心者・中級者・上級者の3段階で15例に絞り、用途、必要なもの、難易度、
ラズパイ監視カメラの作り方|録画・通知・クラウド保存
ラズベリーパイで監視カメラを自作する際、どのカメラを選ぶか(Camera Module V3 / HQ Camera など)、まずは motionEyeOS で素早く立ち上げるか、Raspberry Pi OS と Python で通知まで作り込むかで迷いがちです。