フルカラー発光(蛍型発光)

  1. フルカラー発光

    1. フルカラー発光素子

       近年、青色の発光ダイオードが開発され、赤、青、緑、の色の強さを調節することで、発光ダイオードを用いてフルカラーの発光が可能になりました。ここでは、この発光ダイオードを用いて、超小型プロセッサのプログラムでフルカラーを発光させる実験を行います。


      フルカラーLEDとしてOSTA5131A(OptoSupply社)を利用します。一番長い線が共通のカソード(GND)で、上からR(赤)、GND,B(青),G(緑) の順です。色により発光効率が異なる為、同じ電流を流しても白色にはなりません。許容最大電流は50mAです。

    2. PWM制御

       色を設定するには、RGB各LEDの発光強度を調整すればよいのですが、この強度の調整法にPWM: Power Width Modulation があります。この方法は、一定区間の中で通電する割合(時間幅)を変更して平均的な電力を調整する方法です。下図は、25%、50%、75% の電力制御の説明図です。横方向が時間で、立ち上がっている間スイッチをオンにして通電します。



      通電幅を0にすればオフ、繰り返し期間と通電期間を同じにすれば、完全オン状態になります。PWM制御は少々荒っぽい手法なので、制御可能な対象は限定されますが LED の発光強度を調整することは可能です。

    3. PWMのプログラム制御

      PICにはハードウエアによるPWM制御も可能ですが制御可能な信号は1本のみです。ここでは、3本の制御が必要ですから、ソフトウエアでPWMを実現します。1周期の制御は次のようになります。Periodは繰り返し期間で、今回 255 とします。OnPeriod が通電期間で、0から OnPeriod の時刻まで通電することにします。LEDはポートBのB0端子に接続します。

         output_high(PIN_B0);
         Period=0;
         while(Period<255){
            if(Period == OnPeriod) output_low(pin_B0);
            Period ++;
            delay_us(10);
         }

       最初、output_high(PIN_B0); でB0端子をオン、Periodを0にします。次に繰り返しの中で、Periodを増し、これが、OnPeriod になったら、B0端子を0にし通電を停止します。OnPeriodが255に近づくと強い発光になります。繰り返し周期は、delay_us(10);で定まり、ここでは10μ秒です。

  2. 複数のLEDを点灯する

    1. 同じパターンで点灯する(カソードコモン)

       カソードコモン型LEDを同じパターンで複数点灯する場合は次のように、PNP型トランジスタ(2SA1015)を利用します。トランジスタ1個で10個くらいのフルカラーLEDを同時に点灯できます。この場合、PICの端子がLのときLEDが点灯しますから、プログラムで設定しているPICの端子の値(output_high と output_low)を逆にする必要があります。

    2. 同じパターンで点灯する(アノードコモン)

      アノード(プラス側)コモン型LEDを同じパターンで複数点灯する場合は次のように、NPN型トランジスタ(2SC1815)を利用します。


    3. 異なる点灯パターンにする

      異なる点灯パターンにするには、LEDを異なるPICの端子に接続します。この場合、端子毎にプログラムを作成する必要があります。Aポートまで利用すれば、4パターンまで増設できます。


  3. 点灯パターンを変える(蛍)

    1. 蛍の光

       点灯パターンを変えて、蛍の光のような発光を考えます。配列を利用し、最初強く発光し、少し瞬き、スーと消えていく発光パターンなどを自由にデザインします。配列aryr[]に赤、aryg[]に緑、aryb[]に青の発光パターンを作成します。配列の順に発光強度を変化させていきます。特定の色を強く出す場合は、その色を強くし、同じ配列番号の他の色を弱くします。全体的に小さな値にすれば発光強度は弱くなります。配列のサイズを大きくすると、メモリが不足しますから注意してください。
       また、ランダム要素を取り入れるため、rand() 関数を利用します。これは、0..255 の乱数を生成します。rand() の値を、同じ発光を繰り返す時間と、発光の休止期間に利用します。delay_ms( ) 関数は 変数引数の場合、1バイトとなりますから、注意してください。定数の場合は2バイトまで指定できます。
    1. ソース


      //蛍発光
      #include <16F873A.h>
      //#include <16F88.h>
      //FullColor LED 最長:GND red,gnd,blue,green
      //サイン波に従う点燈
      //
      #fuses HS,NOWDT,NOLVP,NOPROTECT,NOBROWNOUT
      #use delay(clock = 20000000)
      
      #include <stdlib.h>
      
      #define nump 34
      
      int aryr[]={0,25,49,72,92,112,130,167,172,186,
            200,220,240,220,200,180,181,173,164,155,
            119,92,84,75,66,58,50,42,35,28,21,15,9,4};
      
      int aryg[]={0,25,39,42,52,63,73,87,92,96,
            100,120,140,160,180,190,201,213,184,165,
            140,132,104,85,76,68,40,42,35,28,21,15,9,4};
      
      int aryb[]={0,15,19,12,12,22,20,27,22,26,
              20,30,34,40,40,40,50,53,54,55,
            59,52,64,65,66,88,100,120,94,72,50,30,19,4};
      
      
      int i,j,k;
      int lmr,lmg,lmb;
      int rv;
      long dly;
      
      void main(){
        
        while(1){
       
          //PWM loop
          output_toggle(PIN_C1);
             
          for(i=0;i<nump;i++){
            //pwm start
            lmr=aryr[i];
            lmb=aryb[i];
            lmg=aryg[i];
            rv=50;
            //rv=rand()%10 + 15;            
            for(j=0;j<rv;j++){  
             output_high(PIN_B0);
             output_high(PIN_B1);
             output_high(PIN_B2);
            //pwm stop 
             for(k=0;k<255;k++){
      
                if(k==lmr) output_low(PIN_B0);
                if(k==lmb) output_low(PIN_B1);
                if(k==lmg) output_low(PIN_B2);
             } //k
             output_low(PIN_B0);
             output_low(PIN_B1);
             output_low(PIN_B2);
                
            }//j   
         }//i
         
         for(i=0;i<4;i++){//変数は1バイト
           //delay_ms(rand());
         }
         delay_ms(500);
          
        }//while
      }

  4. 発展


    1. 色の変化

       3色のパターンを作成すると、明るさだけでなく色のパターンを変化させることが出来ます。

    2. 音をつける

      PIC873にはハードウエアでPWM信号を生成できます。これを利用すると発光と同じに、音を出すことが出来ます。