センサー・アクチュエータ

照度・光センサー

明るさを検出するセンサー。

概要

照度・光センサーは、光(可視光・赤外線・紫外線など)の強度を電気信号に変換するセンサーです。検出する光の種類と用途によって様々な種類があります。

  • 照度センサー(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低いアナログ(抵抗変化)安価・応答遅い
TEMT60001〜1000luxアナログ(電流)人間の比視感度近似
BH17501〜65535lux1luxI2C(16bit)定番・安価
VEML77000〜120,000lux0.0036luxI2C広ダイナミックレンジ
TSL2591188μlux〜88,000lux非常に高いI2C高感度(暗所〜明所)
OPT30010.01〜83,865lux0.01luxI2CTI製・低消費電力

照度の定義と単位

照度(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)
線形性優秀やや非線形
回路複雑さ増幅回路が別途必要簡単(コレクタ抵抗のみ)
ノイズ少ない多い(増幅でノイズも増大)
用途精密計測・高速通信(光ファイバー)照度計・リモコン受信

関連用語

参考リンク