【PICマイコン入門10】フルカラーLED制御プログラム | アナデジ太郎の回路設計

【PICマイコン入門10】フルカラーLED制御プログラム

フルカラーLED ソフト設計

この記事でわかること

・乱数プログラムの作り方
・フルカラーLEDを用いたイルミネーション
・1/fゆらぎによるLEDキャンドル

PICマイコンによるフルカラーLEDを使用した
イルミネーションやキャンドル点灯を行うプログラムを紹介します。
また、様々な色や輝度に変化させるため、乱数を作る方法についても解説します。

学習キットのPICマイコンとフルカラーLED

本記事で使用する新居浜高専PICマイコン学習キットについては下記記事で解説しています。

キットの回路図やプログラムはキットを販売している秋月電子のHPからダウンロードできます。
秋月電子 新居浜高専PICマイコン学習キットVer.3 ACアダプタ付

また、参考書も販売されています。

※本記事はPICマイコン学習方法の一例を紹介するものであり、
 ここで紹介するキットやソフトの動作を保証するものではありません。
 キット等の購入については自己責任でお願いします。
 (不明点等の質問にはお答えできません)

<本ソフトの利用環境と設定について>
本記事におけるMPLABの開発環境は以下の通りです。
・MPLAB X IDE v.15
・XC8 v2.46
・Device Family Pack PIC16F1xxxx_DFP(1.24.387)

※ダウンロードしたプロジェクトファイル(NNCTkit_v3.X)は、
 そのままビルドするとエラーになるため、以下の変更を実施しました。

・helpstr.h 9行目
 変更前:const __section(“title”) unsigned char title[224]={
 変更後:const __section(“help_title“) unsigned char help_title[224]={

セクション名がtitleだとエラーになるので、別の名前にします。
ここではhelp_titleにしましたが、何でも良いです。

この時、配列名はtitleのままでも問題ありませんが、
他のデータ同様、配列名をセクション名と同じにする場合は、
この配列を使用しているソースファイルの方も直します。

・monitor.c 2093行目
 変更前:TX1REG = title[i];
 変更後:TX1REG = help_title[i];

MPLABの使い方については下記で解説しています。

フルカラーLED回路

学習キットには、7セグLED等の各種LEDが搭載されており、
フルカラーLED(D18)を点灯させる際は、PNPトランジスタ(TR11)をONすることで、
LEDに電源供給されることで行われます。
(ここではフルカラーLED以外の回路を省略)

フルカラーLED回路

フルカラーLED(D18)を点灯させる際は、出力(RA3,RA4,RA5)=(1,0,1)にして、
デコーダ(IC2)の出力Y5をLにすることで、TR11をONさせます。

フルカラーLEDの各色点灯写真

フルカラーLEDは、赤(R)、緑(G)、青(B)のLEDチップが内蔵されており、
各色の点灯時間の比率を変えることで、様々な色を表現できます。

※キット搭載のLED (OSTA71A1D-A)は生産終了品となっており、後継品(OSTBMAZ2C1D)があります。

フルカラーLED外形図

角型フルカラーLED アノードコモンタイプ
 順電圧(typ) :赤2.1V、緑3.1V、青3.1V
 順電流(max) :赤50mA、緑30mA、青30mA

RA1はアナログ入力(ANA1)として使用し、光導電セル(CdS)(※1)の電圧を入力しています。
これはAD変換機能を用いて、入力電圧をAD変換した値を基に乱数を生成する際に使用します。

※1:光を当てると抵抗が小さくなる素子
  キットの回路ではプルアップされているので、明るさに比例して入力電圧が低下する。

ベース抵抗などの回路定数の設定については下記記事で解説しています。



PICマイコンの初期設定

プログラムでは、PICマイコンの初期設定として、
コンフィグレーション設定(※2)によるクロックの動作モード設定を行い、
初期設定関数SetConfigでAD変換機能の設定を行います。
 ※2:クロックなどの動作環境設定

プログラムコードの詳細は、ソースファイル(nnct_kit_v3.c)を参照下さい。

コンフィグレーション設定

#pragma config FEXTOSC = HS
 外部発振器モード選択:HS(水晶振動子 4MHz以上)

#pragma config RSTOSC = EXT4X
 発振器の動作モード:PLL(※3)の4逓倍回路を使用
 ※3:Phase Locked Loop(位相同期ループ):クロック周波数を増加させる回路

PIC16F18857ではPLLにより、外部からのクロック信号の周波数を4倍に増やすことができ、
本キットでは、8MHzの水晶振動子から32MHzのシステムクロック周波数Foscを生成してます。

コンフィグレーション設定については、下記記事で解説しています。

AD変換機能の設定

初期設定関数SetConfigで、以下のレジスタの設定を行います。

初期設定関数プログラム

ANSELA(ポートAアナログ選択)レジスタ
 ポートA(RA0~RA7)をアナログ入力にするか指定します。
 レジスタ値0x03(0000 0011)により、RA0,RA1をアナログ入力に設定します。
 (但し、本プログラムではRA0は未使用)

ANSELAレジスタ

ADCON0(ADC制御0)レジスタ
 このレジスタの各ビットには、
 AD変換の各種設定が割付けられています。 

ADCON0レジスタ

  ADON(ADC有効化)ビット=1(ADC有効)
  ADCS(ADCクロック選択)ビット=0(ADCLKを使用)
  ADFRM0(ADC結果形式)ビット=1(右寄せモード※3)

※:AD変換値は10bitデータ(0~1023)ですが、
  これを上下各8bitのAD変換結果レジスタ(ADRESH、ADRESL)にセットするときのモードを指定します。

AD変換結果のセット方法

  ADFRM0 = 1の場合、右寄せモードとなり、
  ADRESHは、10bit変換結果の上位2bit、ADRESLは下位8ビットを格納します。

ADCLK(ADCクロック選択)レジスタ
  AD変換を行うクロックの設定を行います。

ADCLKレジスタ

  本プログラムでは最も低速となるシステム周波数Foscの1/128にしています。
   0x3F(63)=Fosc/128=32MHz/128 =250kHz
  
  この設定だと、AD変換1 ビットあたりの処理時間TADは、
   TAD=1/250kHz=4us
   10bitデータの変換に要する時間はデータシートより11.5×TADとあるので、
   4us×11.5=46usとなります。

ADREF(ADCリファレンス選択)レジスタ
 このレジスタの各ビット(ADPREF、ADNREF)で、
 AD変換の基準電圧を入力するピンを指定します。

ADREFレジスタ

  ADPREF(VREF+入力ピン選択)ビット= 0x00(VDDピン)
  ADNREF(VREF-入力ピン選択)ビット= 0(VSSピン)

 
 基準電圧を電源ピンの5Vと、GNDピンにすることで、
 アナログ電圧0~5Vを10bitのデジタル値(0~1023)に変換します。

AD変換特性

ADPCH(ADC チャンネル選択)レジスタ
 AD変換入力ピンを指定します。
  0x00にすることで、RA0(ANA0)ピンとなります。



イルミネーション点灯プログラム

関数 IllusionLightr( )はフルカラーLEDのRGBの割合を
ランダムに変化させることで、様々な色を発光させます。

各LED(R,G,B)の輝度や、輝度が増減する速さを指定する増減周期は、
関数random()によって乱数がセットされます。

乱数の生成方法については、後で説明します。

イリュージョンプログラム前半
イリュージョンプログラム後半

乱数生成プログラム

関数random( )は、光導電セル(CdS)の入力電圧をAD変換した8ビットデータに対し、
ビット順序を入れ替えた上で、タイマ2レジスタの値を加えたものを乱数として返します。

ビット順序の入れ替え(MSB⇔LSB)方法ですが、
まず、入れ替え前の値a(AD変換値)を変数bにセットします。

ビット順序の入れ替え方法

次に、aを1ビット右シフト、bを1ビット左シフトさせ、
aの最下位ビット(LSB)の値を、bのLSBにセットします。

このビットシフトとLSBのセット動作を7回行うことで、
aのビット順序を入れ替えた値がbにセットされます。

タイマ2レジスタ(T2TMR)は、設定されたカウント速度でカウントアップし、
タイマ2周期レジスタ (T2PR)の値に到達したらゼロに戻ります。

この学習キットのソフト(ソースファイル (nnct_kit_v3.c) )では、
カウント速度を1MHz (1us)、T2PRを199にしているので、
T2TMRは0~199まで200us周期で変化します。

※ソースファイルではタイマ0レジスタ(TMR0)の値を加えていますが、
 タイマ0は有効化されていないため、本記事ではタイマ2に変更しています。

タイマ2の設定については、下記記事で解説してます。

乱数関数プログラム

LEDキャンドルライト プログラム

関数 CandleLight( )はフルカラーLEDのRとG点灯で黄色に発光させ、
明るさをランダムに変化させることで、ロウソクの炎を表現します。

明るさは輝度dutyにより255段階に調整でき、dutyを1段階づつ直線的に変化させます。
そして、dutyの増加/減少を切り替えるまでの増減周期priodをランダムにすることで、
1/fゆらぎ(※4)を疑似的に作り出しています。

時々、dutyを急激に減少させる事で、風でゆらめく炎を表現しています。

※4:揺らぎの大きさが周波数に反比例し、大きな揺れはゆっくり、小さな揺れは素早くなる特徴を持つ。
  木の葉の揺れや、炎の揺らぎ等が1/fゆらぎであり、心地よく快適な気分にさせると言われています。

キャンドルライトプログラム



フルカラーLEDの動作波形

イルミネーション動作

RC0(赤)、RC1(緑)、RC2(青)の動作波形を見ると、
点灯(L)期間の比率が0~100%まで各色別々に変化し、そのスピードもランダムに変わります。

イルミネーション動作波形

これによって、LEDが様々な色に不規則に変化しています。

キャンドルライト動作

黄色に発光させるためRC2(青)は未点灯で、RC0(赤)、RC1(緑)の点灯(L)期間が同一になってます。

キャンドルライト動作波形

点灯(L)期間の変化を見ると、小さな変化が頻繁に発生し、時々、大きな変化が起きています。

これによって、黄色に点灯したLEDの輝度が細かく変化し、
時々、大きく変わることで、風に揺らぐロウソクの炎を表現しています。