今回は、物理的な接触がいっさい不要な「非接触スイッチ」の実験を行いました。 安価な赤外線LEDとフォトダイオード(ホトダイオード)のペアを使い、RP2040-Zeroで制御する仕組みです。
目に見えない光をどうやって扱い、データとして可視化するのか。実験の様子をレポートします。

手をかざしてLEDをON-OFFする実験動画
始めに、赤外LEDとは?
赤外LEDはその名前の通り、赤外線で発行するLEDです。赤外線は目には見えないので、目では光っているかどうかを確認できません。フォトダイオードは、素子自体は赤外線以外にも反応するので、可視光を通さないようなフィルタの塗料が塗られています。

赤外用フォトダイオードと赤外LED
見た目は、普通のLEDとほぼ変わりません。
赤外LEDとセンサ
940nm
広告
スマホのカメラを通すと「正体」が見える
カメラのセンサは赤外線もとらえることができるので、カメラで撮ってみると発光を確認することができます。この時、内カメラで撮る必要があります。外カメラだと、屋外撮影などでもきれいに撮るため、赤外線をカットするフィルタが入っており、人間の目で見た通りに撮れてしまします。(これは、写真としては高性能ではありますが、赤外線が見えなくなってしまいます)
内カメラで撮影

比較用:電源OFF(消灯時)

発光している赤外LED
人間の目には見えない赤外線を捉えて「薄紫色」に映し出します。これで、ちゃんと光が出ていることが確認できました。
反射センサの仕組み
今回の非接触センサの原理は非常にシンプルです。

- 発光: 赤外線LEDを常時点灯させ、光を前方に放つ。
- 反射: 前方に「手」などの物体が来ると、赤外線が跳ね返る。
- 受光: 跳ね返った光をフォトダイオードがキャッチし、電流が流れる。
- 検知: 電流の変化を電圧として読み取り、閾値を超えたら「スイッチON」と判定する。
まさに「光のレーダー」のような仕組みですね。フォトダイオード(センサ側)で特定の周波数の赤外線だけを通すようにしているため、蛍光灯とかの光で誤動作しないようになっています。
実験用回路とプログラム
実験用回路とプログラム
今回の回路は、他のマイコン(ArduinoやRaspberry Pi Picoなど)でも応用が効く汎用的な構成です。

- 投光部: 赤外線LEDと制限抵抗を繋ぎ、常時点灯させます。
- 受光部: フォトダイオードを逆方向バイアスで接続し、プルダウン抵抗を介して電圧を取り出します。
- RP2040-Zeroでの接続: * 受光部のアナログ出力 → GP26 (ADC0)
- 動作確認用LED → GP0(お好みのピンでOK)
なぜ逆バイアス?
LEDや整流用ダイオードは、通常「順方向」に電圧をかけて使用します。これは、電子と正孔を結合させて発光させたり、電流を一方通行に流したりするためです。
一方、フォトダイオードの使い方はこれとは考え方が少し異なります。フォトダイオードには「光が当たると、内部で電子と正孔(キャリア)が発生し、電流が流れる」という特性があります。(普通のダイオードでも起きますが、フォトダイオードは特に起きやすく設計されています)
ここで逆バイアスにするのには、2つの大きな理由があります。
- レスポンス(応答性)を速めるため 逆向きに電圧をかけると、素子の内部に「空乏層」という電界の強い領域が広がります。光によって生まれた電子や正孔がこの強い電界に弾き飛ばされるように高速で移動するため、光の変化に対して瞬時に反応できるようになります。
- 「光の電流」だけを取り出すため 順方向に電圧をかけると、光が当たっていなくても通常のダイオードとして大きな電流が流れてしまいます。これでは、微細な光による電流の変化が埋もれてしまい、センサーとして機能しません。逆バイアス(電流が流れない向き)にしておくことで、「光が当たったときだけ流れる電流」を正確にキャッチできるのです。
(実はフォトダイオードを「逆バイアスなし(ゼロバイアス)」で使う光起電力モードという使い道もあります。これは電卓のソーラーパネルなどと同じ原理で、精度は高いですが応答速度が遅くなります。)
[失敗談メモ]フォトダイオードの向き
フォトダイオードの向きを間違えると、いくら手をかざしても電圧が変化しません。もし動かない場合は、まずフォトダイオードを逆挿ししてみてください(私も一度間違いました)。ホトダイオードの型によっては、足の長さが逆のものがあるようです。
制御コードのロジック
MicroPythonやCircuitPythonなら、以下のような短いループで制御できます。
RP2040でアナログ入力をGP26ピン。出力をGP0につなぐと動きます。
ADC.read_u16()で電圧を取得。- 「何も無い時の値」より少し高い値を閾値に設定。
- 閾値を跨いだ瞬間にフラグを反転(トグル動作)。
制御用コードcircuitpython コピペ可(個人利用のみ)
"""
RP2040-Zero + CircuitPython で作る非接触赤外線スイッチ
赤外線LEDの反射をフォトダイオードで受光し、GP0のLEDをトグル動作させるデモ
Writer: Lumenhero (tukumolog管理人)
Env: RP2040-Zero, CircuitPython 10.x
"""
import board
import analogio
import digitalio
import time
# --- Hardware Setup ---
# GP26(ADC0)をセンサー入力に、GP0をLED出力に設定
ir_sensor = analogio.AnalogIn(board.GP26)
led = digitalio.DigitalInOut(board.GP0)
led.direction = digitalio.Direction.OUTPUT
# --- Configuration ---
# 閾値は環境光に合わせて調整が必要です(シリアルプロッタで確認)
THRESHOLD = 35000
last_detected = False
led_on = False
print("System Start: Monitoring IR Sensor...")
while True:
raw_val = ir_sensor.value
# 3.3V換算の電圧値(デバッグ用)
voltage = (raw_val * 3.3) / 65535
# シリアルプロッタ表示用
print((raw_val, voltage))
# 指が近づいた(閾値越え)判定
is_detected = raw_val > THRESHOLD
# 立ち上がりエッジ検出(チャタリング防止込み)
if is_detected and not last_detected:
led_on = not led_on
led.value = led_on
# ログ出力と簡易的なデバウンス処理
status = "ON" if led_on else "OFF"
print(f"Signal Detected -> LED {status} (Raw: {raw_val})")
time.sleep(0.3)
last_detected = is_detected
# 処理負荷軽減とサンプリング周期の調整
time.sleep(0.05)
実験結果

実験結果gif
実際に手5回→茶色の紙4回→黒板3回→茶色の紙2回かざしたときのログをグラフ化したものがこちらです。

青線(Voltage): 手を近づけると一気に電圧が上昇しているのがわかります。
赤線(Logic State): 電圧(センサの出力結果)に合わせて、ロジックが綺麗にON/OFFと切り替わっています。
黒い板はなぜ反応しないのか?

黒い板3回+茶色紙2回をかざしてみたときの実験動画
実験の中で面白い現象を確認しました。対象物の「材質」によって反応が劇的に変わるのです。
| 対象物 | 反応 | 理由 |
| 自分の手 | 良好 | 表面で赤外線がほどよく反射される。 |
| 茶色の紙 | 良好 | 明るい色は赤外線を反射しやすい。 |
| 黒色の板 | 反応なし | 黒体吸収により、赤外線が吸収されて戻ってこない。 |

黒い板を3回かざし、その後茶色の紙を2回かざしたときの電圧値グラフ
黒い板をいくら近づけても、グラフの青線(電圧)はトリガされる電圧まで動きません。これは「黒色が光の全波長を吸収する」という物理特性をダイレクトに示しています。非接触スイッチを作る際は、「黒い手袋をしていると反応しない」という設計上の注意点が見えてきました。
まとめ
見えない光を使い、材質による特性を理解することで、非常に面白いセンサシステムを組むことができました。
- 「見えない光」の可視化が成功の鍵 スマホの内カメラを使って「デバッグ」する手法は、赤外線を扱う工作では必須のテクニックです。まずは「正しく光が出ているか」を確認することが、トラブル解決の最短ルートになります。
- フォトダイオードの「逆バイアス」に注意 初心者(そして私自身も!)が最もハマりやすいのが、フォトダイオードの向きです。「動かない時はまず逆挿し」という経験則は、電子工作において非常に強力なデバッグ手法になります。
- 材質による「反射率」の違いを理解する 黒い板が反応しなかったのは、単なるエラーではなく「黒色は赤外線を吸収する」という物理特性によるものです。この特性を理解していれば、周囲に黒い壁を配置して誤動作を防ぐなど、設計の工夫につなげることができます。
今回の実験で非接触制御の基本ができたので、今後はこれを自作のガジェットやインテリアライトのスイッチとして組み込んでいきたいと思います。
次回の記事では、より精度よく検出させる方法などをまとめた”実装編“を予定しています。
周囲の光(外乱光)の影響をさらに減らすための物理的なシールド方法や、ケースの穴あけのコツなど、より踏み込んだ内容にする予定です。お楽しみに!
併せて読みたい関連記事
安価なデバイス開発に最適なラズパイzero互換基板のセットアップ
RP2040(Pico/Zero) + CircuitPython 始め方ガイド
RP2040-Zeroの環境構築をPythonで楽に進めたい方必見!CircuitPythonのインストール手順、Thonnyでのデモ実行、GP0/GP1ピンを使った入力チェックまでを詳しく紹介。上位互換のRP2350にも対応。コンパイル不要な爆速開発ベースの作り方をまとめました。
実装編
(予定地)
ここまで読んでいただきありがとうございます。
では、次の記事で。 lumenHero