【概要】
8ピンのPIC12F675とフルカラー発光ダイオードを使って、ランダムにゆっくり発光色
が変化するイルミネーションです。
起動の度に異なる色変化となるように、ランダム化の工夫をしています。
【構成と回路図】
構成は至って簡単で、下図のような全体構成となっています。
PIC12F675のGP0,1,2にドライバとなるトランジスタを接続し、そのトランジスタの
出力にフルカラー発光ダイオードの3色をそれぞれ接続しています。
電源は6V供給とし、発光ダイオードには直接供給し、PICには3端子レギュレータ
経由で5Vを供給しています。
ランダムに色が変化するように工夫するのと、ゆっくりと連続的に色が変化するように
するために、ソフトウェアによるPWM制御で発光ダイオードを制御しています。
このPWM制御の方法は下図のようになっています。
まずPeriodというカウンタがメインループを1回実行する度に+1し、0から1023までの
カウントを繰り返しています。
そのメインループの中で、Periodが0の時には、一斉に3色ともオンとします。
そしてPeriodの値が上昇する都度、赤(R_Duty)、青(B_Duty)、緑(G_Duty)の各色毎の
デューティ値と比較し、一致したときその色の出力をオフとします。
メインループの1周の時間が約5μsecなので、約5msec周期のPWMとなります。つまり
約200HzのPWM周期ということになりますから、十分早い速度でのPWM制御です。
これで1024段階で発光強度が制御できることになります。
次に一定時間間隔で強度を連続的に変化させるために、タイマ1の割り込みを使って
います。フリーカウントで使いましたので、約13msec周期の割り込みとなります。
この割り込みごとに3色のデューティを最初上昇させ、1023に達したら今度は下降に
切り替えます。
3色のデューティの初期値をランダムにすることで、3色の重なりがランダムに変化する
ことになります。これでランダムな色の変化をさせることができます。
さらに、この変化を10回繰り返したら3色のオンオフをランダムに設定します。
これで単色、2色、3色の色相変化も付けられることになります。
これを元に作成した回路図が下図となります。
クロックには水晶振動子を使いましたが、セラミック振動子でも全く問題ありません。
発光ダイオードのドライブには約50mAが流れますのでトランジスタを使います。
組トランジスタを使うと抵抗が省略できますから簡単になります。
電源は発光ダイオードにはレギュレータを通さず直接供給していますので、外部から
供給する電源は7V以下にする必要があります。そうしないと発光ダイオードの発熱
が大きくなり熱くなってしまいます。
電源投入あるいはリセット毎にランダムに色が変化するようにしますのでリセットスイッチ
を追加しておきます。
【ハードウェア製作】
製作には基板が必要ですが、プリント基板を作るほどでも無いので、EジスPenで
作成しました。簡単にお絵かきで作成できるのでこういうときには便利です。
できあがった基板は写真のようになります。
左端からクリスタル振動子、PIC、ドライバ用
組トランジスタ、電流制限用抵抗、フルカラー
発光ダイオードとなります。
上側が電源部です。
左下がリセットスイッチとなります。
パターンは下図となっています。
これをアクリルケースに実装して完成です。
【プログラム製作】
このプログラムはCCS社のC言語で作成しました。
まず下記が宣言部とタイマ1の割り込み処理部になります。
デューティも周期も1024段階としましたので、変数はlong型で扱います。
タイマ1の割り込みでは、3色のデューティ値の上昇または下降を行っています。
いずれも上限あるいは下限に達したら上昇、下降の向きを反転させています。
次がメインルーチン部で、タイマ1の初期設定を行ったあと、EEPROMに
保存してあるランダム基数を読み込み、+1してから書き戻しています。
この基数を元にして3色のデューティ値と色相値をランダム化しています。
これにより起動の度に異なる色変化を付けることが可能になります。
メインループでは、周期カウンタPeriodが0かどうかをチェックし、0であれば
色相を変えるかどうかをInterval変数で判定し、変えるタイミングであれば
ランダム値で変化させます。
その後は、各色のデューティ値と周期カウンタPeriodが一致するかどうか
を判定し、一致していれば出力をオフにします。
最後にPeriod値を+1して次のループに戻ります。
★★ プログラムダウンロード
☆☆ HEXファイルダウンロード