概要
照度・光センサーは、光(可視光・赤外線・紫外線など)の強度を電気信号に変換するセンサーです。検出する光の種類と用途によって様々な種類があります。
- 照度センサー(Ambient Light Sensor: ALS): 人間の視覚特性(比視感度)に近い波長特性を持ち、lux(ルクス)単位で照度を計測。スマートフォンの画面輝度自動調整やビル照明制御に使用。
- フォトレジスタ(CdS): 光が当たると電気抵抗が変化する素子。安価だが応答が遅く、有害物質(カドミウム)の問題もある旧世代デバイス。
- フォトダイオード: 逆バイアス状態でフォトンが電子・正孔対を生成、電流を発生。高速・高感度だがノイズが少なく、精密計測や近接センサーに使用。
- フォトトランジスタ: フォトダイオード+増幅効果。高感度だが応答速度は低い。
- カラーセンサー: RGBまたは複数波長の光強度を個別計測。色識別に使用。
組み込みシステムではI2C接続のデジタル照度センサーIC(BH1750、VEML7700、TSL2591等)が広く使われ、16bitデジタル値でlux値を直接出力します。
歴史・背景
光の電気変換(光電効果)の発見は1887年にハインリヒ・ヘルツが光電効果を実験で観察したことに始まり、1905年にアインシュタインが光量子仮説により説明し、ノーベル賞を受賞しました(1921年)。
最初の実用的な光センサーは1930〜40年代のセレン光電池で、露出計(写真)やオルゴールの光学読み取りに使われました。半導体フォトダイオードは1940〜50年代に開発され、1970年代以降の半導体プロセスの発展で小型・高精度化が進みました。
照度センサーICの普及は2000年代のスマートフォン向けに加速しました。液晶ディスプレイの自動輝度調整に照度センサーが搭載され、省電力化に貢献するとともに、デジタルI2C出力センサーの廉価化が進みました。
技術仕様
代表的な照度センサーの比較
| センサー | ダイナミックレンジ | 分解能 | インターフェース | 備考 |
|---|---|---|---|---|
| フォトレジスタ(CdS) | 1〜100,000lux | 低い | アナログ(抵抗変化) | 安価・応答遅い |
| TEMT6000 | 1〜1000lux | 中 | アナログ(電流) | 人間の比視感度近似 |
| BH1750 | 1〜65535lux | 1lux | I2C(16bit) | 定番・安価 |
| VEML7700 | 0〜120,000lux | 0.0036lux | I2C | 広ダイナミックレンジ |
| TSL2591 | 188μlux〜88,000lux | 非常に高い | I2C | 高感度(暗所〜明所) |
| OPT3001 | 0.01〜83,865lux | 0.01lux | I2C | TI製・低消費電力 |
照度の定義と単位
照度(illuminance)とは、単位面積に入射する光束(光のエネルギー流量を人間の視感度で重み付けしたもの)です。
| 環境 | 照度の目安 |
|---|---|
| 直射日光 | 100,000 lux |
| 曇天の屋外 | 10,000 lux |
| 屋内(明るいオフィス) | 500〜1000 lux |
| 屋内(リビング) | 100〜500 lux |
| 廊下・通路 | 50〜200 lux |
| 夜間(満月) | 0.1〜1 lux |
| 夜間(街灯のみ) | 1〜10 lux |
比視感度(人間の目の特性)
人間の目は緑色(550nm付近)に最も感度が高く、赤や青では感度が落ちます。照度センサーICは内部フィルターで人間の比視感度に近似した特性を持たせています。
標準比視感度 V(λ):
400nm(紫): 0.0004
450nm(青): 0.038
550nm(緑): 1.000(最大)
600nm(橙): 0.631
700nm(赤): 0.004
動作原理
フォトダイオードの動作原理
フォトダイオードはpn接合に逆バイアスをかけた状態で、光フォトンが電子・正孔対を生成し、電流(光電流)として流れ出る原理を利用します。
光電流 I_ph ∝ 照度 E [lux]
暗電流 I_dark: 完全遮光時にも流れるリーク電流(ノイズ下限)
S/N比:
SNR = I_ph / √(2q × I_dark × BW)
(q: 電子電荷, BW: 帯域幅)
BH1750(デジタル照度センサーIC)の仕組み
BH1750内部にはフォトダイオード・電流増幅回路・ADC・16bitレジスタが集積されています。測定モードにより測定時間(120ms/60ms/16ms)と分解能(1lux/0.5lux/4lux)が変わります。
BH1750 出力値 → lux変換:
lux = Raw_data / 1.2 × (1 / MTreg_factor)
MTreg: 測定時間レジスタ(デフォルト 69)
MTreg_factor = MTreg / 69
用途・ユースケース
スマートフォン・PC 画面輝度自動調整
環境光に応じてディスプレイの輝度を自動調整します。暗い場所では輝度を下げて目の疲れを軽減し、電池消費を抑えます。明るい屋外では輝度を上げて視認性を確保します。
街灯・照明自動制御
照度センサーで周囲の明るさを検知し、夕方に自動点灯・夜明けに自動消灯します。PWM制御と組み合わせて、外部の明るさに反比例した輝度で照明を調整する「照度一定制御」にも使われます。
スマートホーム・カーテン自動制御
窓際の照度センサーで日差しを検知し、電動カーテン・ブラインドを自動制御します。急な曇りや日没にも対応した快適な室内環境を自動維持します。
工場・農業の日照量モニタリング
植物工場・温室での照度計測で、植物の光合成に必要な光量(PPFD:光合成有効放射束密度)を管理します。屋外農業では日積算日射量を計測して気象ロガーに記録します。
近接センサー(スマートフォン耳元検知)
スマートフォンで通話中に耳に近づけると画面をOFFにする機能は、近接センサー(赤外線LED+フォトダイオード)で実現されています。IR LEDが発した赤外線が皮膚や物体で反射し、フォトダイオードで受信量を検出します。
紙の有無・色の検知(センサーとしての組み込み応用)
プリンターの紙詰まり検出、工場の製品有無確認、仕分けラインでの色識別など。フォトインタラプタ(発光部と受光部が対向した構造)は物体の通過検知に使われます。
実装・開発のポイント
BH1750 の I2C 読み取り
#include "i2c_hal.h"
#include <stdint.h>
#define BH1750_ADDR 0x23 // ADDR=L の場合(0x5C はADDR=H)
#define BH1750_POWER_ON 0x01
#define BH1750_RESET 0x07
// 動作モード
#define BH1750_CONT_H_RES 0x10 // 連続高分解能(1lux, 120ms)
#define BH1750_CONT_H_RES2 0x11 // 連続高分解能2(0.5lux, 120ms)
#define BH1750_CONT_L_RES 0x13 // 連続低分解能(4lux, 16ms)
void bh1750_init(void) {
uint8_t cmd;
cmd = BH1750_POWER_ON;
i2c_write(BH1750_ADDR, &cmd, 1);
cmd = BH1750_CONT_H_RES;
i2c_write(BH1750_ADDR, &cmd, 1);
HAL_Delay(180); // 最初の計測完了まで待機(120ms + マージン)
}
float bh1750_read_lux(void) {
uint8_t buf[2];
if (i2c_read(BH1750_ADDR, buf, 2) != 0) return -1.0f;
uint16_t raw = (uint16_t)(buf[0] << 8 | buf[1]);
return raw / 1.2f; // lux変換(H_RESモード時)
}
フォトレジスタ(CdS)の読み取りと変換
// フォトレジスタ(CdS)+ 分圧回路でのアナログ照度計測
// 回路: VCC ─[10kΩ固定抵抗]─[ADC入力]─[CdSフォトレジスタ]─ GND
// 明るいとCdS抵抗小→ADC電圧小, 暗いとCdS抵抗大→ADC電圧大
#define FIXED_R 10000.0f // 固定抵抗値 [Ω]
#define VCC 3.3f
float adc_to_cds_resistance(uint16_t adc_raw) {
// 12bit ADC, VCC=3.3V
float v_adc = adc_raw * VCC / 4095.0f;
if (v_adc < 0.01f) return 1e9f; // ほぼゼロ(完全に明るい)
return FIXED_R * (VCC - v_adc) / v_adc; // CdS抵抗値 [Ω]
}
// CdSの抵抗値は照度の対数に反比例する特性がある(製品により異なる)
// 正確な変換には実測キャリブレーションが必要
float cds_resistance_to_lux_approx(float resistance) {
// 近似式: lux ≈ A × R^B (A, Bはセンサー特性値)
// 例: A=10000, B=-0.7 (製品によって大きく異なる)
return 10000.0f * powf(resistance, -0.7f);
}
デジタルフィルタと自動露出(ALS制御)
照度センサーは環境変化が急激(フラッシュ等)でもロバストな読み取りが必要です。
class AutoLightSensor:
"""自動ゲイン切替付き照度センサードライバ"""
GAIN_LOW = 1 # 低ゲイン(明るい環境向け)
GAIN_HIGH = 16 # 高ゲイン(暗い環境向け)
def __init__(self, sensor):
self.sensor = sensor
self.gain = self.GAIN_LOW
def read_lux(self):
raw = self.sensor.read_raw()
# ゲイン自動切替(飽和・アンダー判定)
if raw > 60000 and self.gain == self.GAIN_HIGH:
self.sensor.set_gain(self.GAIN_LOW)
self.gain = self.GAIN_LOW
return None # 次回計測で正確な値
elif raw < 100 and self.gain == self.GAIN_LOW:
self.sensor.set_gain(self.GAIN_HIGH)
self.gain = self.GAIN_HIGH
return None
lux = raw / self.gain / 1.2
return lux
他技術との比較
照度センサー方式の比較
| 方式 | 原理 | 感度 | 応答速度 | コスト | 主な用途 |
|---|---|---|---|---|---|
| フォトレジスタ(CdS) | 光伝導効果 | 中 | 遅い(ms〜秒) | 非常に安価 | 簡易光検知 |
| フォトダイオード | pn接合光電流 | 高 | 高速(ns〜μs) | 安価〜中 | 精密計測・近接 |
| フォトトランジスタ | 光増幅トランジスタ | 非常に高い | 中(μs〜ms) | 安価 | 照度計・センサー |
| デジタルALSチップ | フォトダイオード+IC | 高・人眼近似 | 中(ms) | 中 | 自動輝度・IoT |
| カラーセンサー | RGB複数フォトダイオード | 中 | 中 | 中 | 色識別 |
フォトダイオード vs フォトトランジスタ
| 比較項目 | フォトダイオード | フォトトランジスタ |
|---|---|---|
| 感度 | 低い(電流微小) | 高い(内部増幅あり) |
| 応答速度 | 高速(ns〜ns) | 低速(μs〜ms) |
| 線形性 | 優秀 | やや非線形 |
| 回路複雑さ | 増幅回路が別途必要 | 簡単(コレクタ抵抗のみ) |
| ノイズ | 少ない | 多い(増幅でノイズも増大) |
| 用途 | 精密計測・高速通信(光ファイバー) | 照度計・リモコン受信 |