フルカラーLEDの発色実験

  1. フルカラー発光

    1. 目的
       赤、緑、青の三色が組み込まれた発光ダイオードを利用し、各色の強さをPICで制御し、フルカラー発光の実験を行います。

  2. 回路制作

    1. 必要な部品

      回路配線用パッチボード
      PIC:16F628
      発光ダイオード(FL350RGB)
      抵抗 3本
      電源:5V
      光の強度を抑える紙(A6サイズ)

    2. フルカラー発光素子
       フルカラー発光素子は、赤、緑、青、の3色を発光できるLEDを組み合わせたLEDで、各色の強さを制御することで、多くの色を発光できます。

    3. 回路の組み立て
         PICのICの文字 16F628 を読める向きにし、パッチボードに写真のように差し込みます。すべてのピンがパッチボードの穴に入るよう、注意して差し込みます。
       picの下側で左から5ピンをボードの下のー電源部に差し込みます(写真青色)。次に、上側の左から5ピンを上の+電源バーに差し込みます。これは、PICに対する電源を供給します。



       次に発光ダイオードを差し込みます。一番長い線が左から3番目になるように向きを定め、パッチボードの中央の溝より上の部分に差し込みます。左から3番の長い線は、各LED共通のー側の電源線ですから、このピンをパッチボードの下側のー電源バーに接続します。

       各色の電源はPICの下側の6(赤),7(緑),8(青)、から供給されます。この6,7,8ピンと、LEDの左から1(赤),2(緑),4(青),の溝の下側のピンを接続します。溝の上部のLEDの1,2,4ピンと溝の下部のピンを抵抗で接続します。抵抗値は数百Ωで、この値により発光の強度が変化します。カラーバランスの良い値を選択して下さい。

        最後に、電源部(アダプタ)の赤い線を、ボードの+電源バーに、黒い線をボード下のー電源バーに接続します。
      これで、配線が終了です。
       発光を開始しましたか?

    4. 抵抗のカラーコード
      抵抗の値はカラーコードで示します。左から、第1,2,コードで値、第3コードで桁を示します。最後の4桁目は精度の値で、通常金色をしています。金色のリングを右側にしてカラーコードを読みます。各カラーは次の値となります。赤からは、いわゆる虹の色です。
       黒:0、茶:1、赤:2、橙:3、黄:4、緑:5、青:6、紫:7、灰:8、白:9


       (茶=1),(黒=0),(橙=3),の場合、10kΩ
       (橙=3),(灰=8),(茶=1),の場合、380Ω
       (赤=2),(紫=7),(茶=1),の場合、270Ω

    5. 回路の動作
      PICに電源が入ると、自動的にプログラムを実行開始します。RGBに対応する信号はRB0,RB1,RB2から出力されます。この信号は、色別に時間とともにPWM方式で、電力制御されます。発光ダイオードは、消費電力が少ないので、PICで直接点灯できます。ただし、直結すると、電力超過になりますから、抵抗素子を利用して、流れる電流を制限します。
       この抵抗値を変えると、色のカラーバランスが変化します。適当な値を選択して下さい。
      発光はかなり強いので、直視すると目が疲れます。紙で遮蔽をすると見やすくなります。

  3. プログラム

    1. ソフトPWM
       ハードウエアのPWM機能は1チャンネルなので、ここではプログラムで、RGB3色のPWM制御を行います。最初にポートの設定や周期などの初期設定を行い、83行のMAINLPの繰返しで3色のパルス幅制御を行います。
       PMR、PMG、PMG で実際のパルス幅を変更しています。各色の発光する時間幅を1周期毎に増減します。減らして0になったら増加に切替え、幅が設定最大値になったら減少に切替えます。
      (このプログラムは先のC言語のプログラムより)
    1. 周期と幅の変更
       周期の「初期設定」の続く60行の 
       MOVLW 0xf0 ;全体の周期
      で全体の周期(PRD)の設定を行います。この値(0xf0)を短くすると、1周期の時間が短くなります。これ以上長くすることはできません。
       また、続く70行以下の

       MOVLW 0x14 ;赤の幅
       MOVLW 0x1e ;緑の幅
       MOVLW 0x28 ;青の幅

      で各色の周期を調節しています。各色の幅は、「全体の周期」を超えて設定してはいけません。
       これらの値を調節すると、色の変化の具合が変化します。
       各色の強さは0からPRDまで変化しますが、これらの値は強さを変化させる時間間隔を指定しています。すべての値を等しくすると、同じ周期で変化しますから、明るさのピークから、真っ暗まで、一様に変化します。各色の幅を変化させると、各色が異なる周期で変化しますから、変化に富んだ発色をします。
       
    2. ソース
      ;*********************************************
      ;   PIC16F628
      ;   フルカラーLED制御プログラム v0.1
      ;   yokoie        2003.11.26作製
      ;               2003.11.26更新
      ;       クロックは4MHzで
      ;RB0,RB1,RB2 を使用
      
      ;*********************************************
      LIST P=16F628, ST=OFF, R=DEC, F=INHX8M
      INCLUDE P16F628.INC
      
      __CONFIG        _HS_OSC & _MCLRE_ON & _LVP_OFF & _WDT_OFF & _PWRTE_OFF & _BODEN_OFF & _CP_OFF
      
      
      ;  変数レジスタの定義
      CNT1    EQU     0x70            ;タイマ用変数
      CNT2    EQU     0x71            ;タイマ用変数
      CNT3    EQU     0x72            ;タイマ用変数
      CNT4    EQU     0x73            ;タイマ用変数
      
      PRDTIM  EQU     0x74            ;PWMカウント用タイマ変数
      
      DUTYR   EQU     0x75            ;赤のパルス幅(0..PRD)
      DUTYG   EQU     0x76            ;緑のパルス幅
      DUTYB   EQU     0x77            ;青のパルス幅
      
      DUTYPM  EQU     0x78            ;0,1,2ビットでRGBの増加、減少を記録(1:+、0:-)
      PRD     EQU     0x79            ;PWMの周期(固定)
      
      PMPRDR  EQU     0x7a            ;赤周期固定
      PMPRDG  EQU     0x7b            ;緑周期固定
      PMPRDB  EQU     0x7c            ;青周期固定
      
      PMTIMR  EQU     0x7d            ;赤周期計数
      PMTIMG  EQU     0x7e            ;緑周期計数
      PMTIMB  EQU     0x7f            ;青周期計数
      
      ;  メインルーチン
              ORG         0            ;Reset Start
      MAIN        
       ;ポート設定
              CALL    BANK0           ;バンク0に切替え
              CLRF    PORTA           ;PORTAをクリア
              MOVLW   B'00000010'
              MOVWF   CMCON           ;PORTAをIOとして使用する
      
              CALL    BANK1           ;バンク1に切替え
              MOVLW   B'11100000'
              MOVWF   VRCON           ;PORTAをIOとして使用する
      
              MOVLW   B'00000000'
              MOVWF   TRISA           ;PORTAを全て出力に
              MOVLW   B'00000000'
              MOVWF   TRISB           ;PORTBを全て出力に
      
              CALL    BANK0
      
      ;周期初期設定   
              MOVLW   0xf0
              MOVLW   PRD             ;周期を128に
              MOVLW   0x80
              MOVWF   DUTYR           ;DUTYR:Redの時間を64に
              MOVWF   DUTYR           ;DUTYGを64に
              MOVWF   DUTYB           ;DUTYBを64に
      
              MOVLW   B'11111111'     ;
              MOVWF   DUTYPM          ;デューティーをすべてプラスに
      
              MOVLW   0x14
              MOVWF   PMPRDR          ;PMPRDR:赤周期を14に
              MOVWF   PMTIMR          ;カウントリセット
      
              MOVLW   0x1e
              MOVWF   PMPRDG          ;PMPRDB:緑周期を1eに
              MOVWF   PMTIMG          ;カウントリセット
      
              MOVLW   0x28
              MOVWF   PMPRDB          ;PMPRDBを28に
              MOVWF   PMTIMB          ;カウントリセット
      
      ;メインループ
      MAINLP
              CALL    TIM2            ;TIM2の時間待つ
              
              DECFSZ  PMTIMR          ;PMTIMRを-1
              GOTO    DECPMG          ;0でなければGへ飛ぶ
              CALL    PMR             ;0ならR:赤の時間幅変更
              
      DECPMG  DECFSZ  PMTIMG          ;PMTIMGを-1
              GOTO    DECPMB          ;0でなければBへ飛ぶ
              CALL    PMG             ;0ならG:緑の時間幅変更
              
      DECPMB  DECFSZ  PMTIMB          ;PMTIMBを-1
              GOTO    MAINLP          ;0でなければMAINLPに戻る
              CALL    PMB             ;0ならB:青の時間幅変更
              GOTO    MAINLP          ;繰り返す       
      
      ;PWM初期化:3色を点灯する
      PWMINIT MOVF    PRD, W          ;PRDをWに読み込む
              MOVWF   PRDTIM          ;PRDCNTをPRDにリセット
              MOVLW   B'11111111'
              MOVWF   PORTA           ;PORTAをすべてHに
              MOVLW   B'11111111'
              MOVWF   PORTB           ;PORTBをすべてHに
              RETURN
      
      ;PWMループ:1周期分繰返し、各色の時間幅で消灯する
      PWMLP   MOVF    PRDTIM, W       ;PRDTIMをWに読み込む
              XORWF   DUTYR, 0        ;PRDTIM == DUTYR?
              BTFSC   STATUS, Z       ;ゼロフラグをチェック
              BCF     PORTB, 0        ;赤:PORTB-0をクリア
              
              MOVF    PRDTIM, W       ;PRDTIMをWに読み込む
              XORWF   DUTYG, 0        ;PRDTIM == DUTYB?
              BTFSC   STATUS, Z       ;ゼロフラグをチェック
              BCF     PORTB, 1        ;緑:PORTB-1をクリア
      
              MOVF    PRDTIM, W       ;PRDTIMをWに読み込む
              XORWF   DUTYB, 0        ;PRDTIM == DUTYB?
              BTFSC   STATUS, Z       ;ゼロフラグをチェック
      ;       CLRF    PORTB           ;PORTBをクリア
              BCF     PORTB, 2        ;青:PORTB-2をクリア
      
              DECFSZ  PRDTIM, 1       ;PRDIMTを1マイナス
              GOTO    PWMLP           ;0でなければPWMLPに戻る
              RETURN
      
      ;赤色の時間設定
      PMR     BTFSC   DUTYPM , 0      
              CALL    DUTYPR          ;幅を増す
              BTFSS   DUTYPM , 0              
              CALL    DUTYMR          ;幅を減らす
              MOVF    PMPRDR, W       ;PMPRDRをWに
              MOVWF   PMTIMR          ;カウントリセット
              RETURN                  ;戻る
      
      ;+−G
      PMG     BTFSC   DUTYPM , 1      ;
              CALL    DUTYPG
              BTFSS   DUTYPM , 1
              CALL    DUTYMG
              MOVF    PMPRDG, W       ;PMPRDGをWに
              MOVWF   PMTIMG          ;カウントリセット
              RETURN
      
      ;+−B
      PMB     BTFSC   DUTYPM , 2
              CALL    DUTYPB
              BTFSS   DUTYPM , 2
              CALL    DUTYMB
              MOVF    PMPRDB, W       ;PMPRDBをWに
              MOVWF   PMTIMB          ;カウントリセット
              RETURN
      
      ;デューティープラスR
      DUTYPR  INCF    DUTYR, 1
              MOVF    DUTYR, W        ;DUTYRをWに読み込む
              XORWF   PRD, 0          ;DUTYR == PRD?
              BTFSC   STATUS, Z       ;ゼロフラグをチェック
              BCF     DUTYPM, 0       ;+-フラグを0に(第0bit)
              RETURN
      
      ;デューティーマイナスR
      DUTYMR  DECF    DUTYR, 1
              MOVLW   0x01            ;Wを1に
              XORWF   DUTYR, 0        ;DUTYR == 1?
              BTFSC   STATUS, Z       ;ゼロフラグをチェック
              BSF     DUTYPM, 0       ;+-フラグを1に(第0bit)
              RETURN
      
      ;デューティープラスG
      DUTYPG  INCF    DUTYG, 1
              MOVF    DUTYG, W        ;DUTYRをWに読み込む
              XORWF   PRD, 0          ;DUTYR == PRD?
              BTFSC   STATUS, Z       ;ゼロフラグをチェック
              BCF     DUTYPM, 1       ;+-フラグを0に(第0bit)
              RETURN
      
      ;デューティーマイナスG
      DUTYMG  DECF    DUTYG, 1
              MOVLW   0x01            ;Wを1に
              XORWF   DUTYG, 0        ;DUTYR == 1?
              BTFSC   STATUS, Z       ;ゼロフラグをチェック
              BSF     DUTYPM, 1       ;+-フラグを1に(第0bit)
              RETURN
      
      ;デューティープラスB
      DUTYPB  INCF    DUTYB, 1
              MOVF    DUTYB, W        ;DUTYBをWに読み込む
              XORWF   PRD, 0          ;DUTYA == PRD?
              BTFSC   STATUS, Z       ;ゼロフラグをチェック
              BCF     DUTYPM, 2       ;+-フラグを0に(第2bit)
              RETURN
      
      ;デューティーマイナスB
      DUTYMB  DECF    DUTYB, 1
              MOVLW   0x01            ;Wを1に
              XORWF   DUTYB, 0        ;DUTYB == 1?
              BTFSC   STATUS, Z       ;ゼロフラグをチェック
              BSF     DUTYPM, 2       ;+-フラグを1に(第2bit)
              RETURN
              
      ;タイマサブルーチン
      TIM1    MOVLW   0xff            ;255
              MOVWF   CNT1                     ;
      TIMLP1  CALL    TIM2            ;
              DECFSZ  CNT1,F          ;繰返し処理
              GOTO    TIMLP1          ;
              RETURN                          ;
      
      TIM2    MOVLW       0x01         ;
              MOVWF       CNT2         ;
      TIMLP2  CALL    PWMINIT         ;PWM初期化
              CALL    PWMLP           ;PWM実行
              DECFSZ  CNT2,F           ;繰返し処理
              GOTO    TIMLP2           ;
              RETURN                   ;
      
      TIM4    MOVLW   0x02             ;使用せず
              MOVWF   CNT4            ;
      TIMLP4  DECFSZ  CNT4,F          ;
              GOTO    TIMLP4           ;
              RETURN 
      
      ;メモリバンク0に切り替える
      BANK0   BCF     STATUS, RP0             
              BCF     STATUS, RP1
              RETURN
              
      ;メモリバンク1に切り替える
      BANK1   BSF     STATUS, RP0
              BCF     STATUS, RP1
              RETURN
              END