受光&発光(1個のLED)
概要
発光ダイオード(LED:Light Emitting Diode)は、順方向に電圧を加えた際に発光する半導体素子です。
その逆に、このLEDに光を当てると電圧が発生するという現象があるようです。
この現象を利用して、1本のLEDのみで、
- 明るさを検出し、
- 周りが暗くなると点灯、
- 明るくなると消灯する。
ユニットを作成してみました。
先ずは、この現象を確認してみました。(回路図A)
オペアンプは単純に高インピーダンスのバッファーとして動作するだけです。(ボルテージフォロア)LEDによって出力電圧に若干のばらつきがありますが、無負荷状態ではそこそこの電圧が出ています。
これなら利用できそうです。
動作原理
■LEDの出力電圧を取り込む方法
- LEDが接続されているPICのポートを入力モードに設定する。
- LEDの出力電圧を高インピーダンスのオペアンプでインピーダンス変換する。
- 電圧が安定するまで、少しスリープ(約50msec)する。
- A/D変換を1msec間隔で50回取り込み、その平均電圧を求める。
■LEDの点灯/消灯方法
- LEDが接続されているPICのポートを出力モードに設定する。
- 点灯(ポートを“1”にする)、消灯(ポートを“0”にする)
■処理の流れ
- スイッチが押されると、明るさを判断するための基準電圧(LEDの出力電圧)V1を取り込む。
- 現時点の明るさの電圧(LEDの出力電圧)V2を取り込む。
- V1とV2を比較し、V2が小さければLEDを点灯させる。
- 1.に戻る。
回路図
ソースコード
- ledEx.c
//********************************************************************** void main() { unsigned int ad, threshold; unsigned char cnt; OSCCON = 0b01110000; // クロックは8Mhz CMCON0 = 0b00000111; // コンパレータは使用しない。 ANSEL = 0b00000010; // AN1を使用する。 TRISIO = 0b00000011; GPIO = 0b00000000; // OPTION_REG = 0b10000000; // WPU.F1 = 1; // while (1) { if (GPIO.F0 == 0) { TRISIO.F2 = 1; Delay_ms(50); threshold = 0; for (cnt = 0; cnt < 50; cnt++) { Delay_ms(1); threshold += Adc_Read(1); } threshold = threshold / 50; TRISIO.F2 = 0; continue; } // TRISIO.F2 = 1; Delay_ms(50); ad = 0; for (cnt = 0; cnt < 50; cnt++) { Delay_ms(1); ad += Adc_Read(1); } ad = ad / 50; TRISIO.F2 = 0; // if (ad <= threshold) { GPIO.F2 = 1; } else { GPIO.F2 = 0; } Delay_ms(1000); } } //**********************************************************************
動作確認
周りが明るくなると、LEDは消灯状態になります。
左の黄色いスイッチが、基準電圧の取り込みスイッチです。
中央のICがPIC、その右横のICがオペアンプです。
右の透明なLEDが受光&発光を行わせるLEDです。
その時の、LEDの電圧の波形です。
消灯状態なので、通常は0Vです。
LEDの電圧を取り込む瞬間(約100msec)だけ、ポートを入力モードにするので、LEDが発電した電圧を
A/D変換で読み込むことが出来ます。
その時の、LEDの電圧の波形です。
点灯状態なので、通常は約2Vです。
LEDの電圧を取り込む瞬間(約100msec)だけ、ポートを入力モードにするので、LEDが発電した電圧を
A/D変換で読み込むことが出来ます。
如何ですか?
1本のLEDだけで、受光と発光が出来るので部品点数が少なくて済みますね。









