最終回は、応用編として同じ回路で星型オブジェをちらちら点灯させてみます。
●星型のオブジェ
原理は雪の結晶と同じですが、頂点が奇数のためにLED 3個ずつ並列の回路がうまいこといきません。LEDを一つダミーとするか、2個と3個の明るさを抵抗で微調整するなど現実的ではありません。そこで、5個直列にして電源を15V以上(18V以上がベター)にしました。電流制限抵抗は47Ωです。また、この電圧で今までの雪の結晶を点灯させても多少明るくなる程度で、何の問題もありません。
なお、LEDはチップ型を使って頂点ではなく谷部に透明な接着剤で直接貼り付けました。LEDの取り付けは、この方法が1番簡単です。使った接着剤は多用途型の「スーパーX」です。

●ちらちら点灯は「1/fのゆらぎ」で作る
「1/fのゆらぎ」とは、周波数が高くなるにつれ反比例して信号レベルが小さくなる波形のことで、「信号レベル-周波数」を両対数グラフにすると下図になります。ゆっくり明滅しながら時折パパッとまたたくようなイメージです。
この数式でほぼOKですが、0と1付近で張り付きやすい(点いたまま・消えたままの状態が長く続く)ので実際のプログラムでは0/1に近づいたときにランダムな要素を加えています。このあたりは見る人の感覚なので、点灯させてみて調整するとよいでしょう。

●プログラムを改造する
出力0~7のうち0と1をまたたき出力にします。「if (nightcount<STOP_TIME) 」以下を下記のように変更しました。
上記のプログラムのコンパイル結果ではPIC16F88のROM領域は46%、RAMは32%の使用なので、まだまだ余裕があります。もっといろいろなことができそうですね。
「またたき」の演算には浮動小数点演算を使います。その演算時間は2個の点灯制御で約1.5ms/20MHzです。8MHzクロックの時は4ms弱かかることになります。多ピンのマイコンでより多くの星をコントロールするように修正するときには処理時間も確認しましょう。
雪の結晶ではなく全部星型にしてしまえば、冬季に限らず一年中飾っておいてもよいですね。
それでは、結晶5個と星2個をいっぺんに点灯させてみましょう。密集して点灯すると賑やかです。
原理は雪の結晶と同じですが、頂点が奇数のためにLED 3個ずつ並列の回路がうまいこといきません。LEDを一つダミーとするか、2個と3個の明るさを抵抗で微調整するなど現実的ではありません。そこで、5個直列にして電源を15V以上(18V以上がベター)にしました。電流制限抵抗は47Ωです。また、この電圧で今までの雪の結晶を点灯させても多少明るくなる程度で、何の問題もありません。
なお、LEDはチップ型を使って頂点ではなく谷部に透明な接着剤で直接貼り付けました。LEDの取り付けは、この方法が1番簡単です。使った接着剤は多用途型の「スーパーX」です。

●ちらちら点灯は「1/fのゆらぎ」で作る
「1/fのゆらぎ」とは、周波数が高くなるにつれ反比例して信号レベルが小さくなる波形のことで、「信号レベル-周波数」を両対数グラフにすると下図になります。ゆっくり明滅しながら時折パパッとまたたくようなイメージです。
「1/fのゆらぎ」作成方法は数々ありますが、シンプルな間欠カオス法という方法で作成します。0~1の範囲の変数xについて、でループさせます。
x<0.5の場合 x=x+2×x×x
x>=0.5の場合 x=x-2×(1-x)×(1-x)
この数式でほぼOKですが、0と1付近で張り付きやすい(点いたまま・消えたままの状態が長く続く)ので実際のプログラムでは0/1に近づいたときにランダムな要素を加えています。このあたりは見る人の感覚なので、点灯させてみて調整するとよいでしょう。
プログラムで作成した1/fゆらぎの波形
●プログラムを改造する
出力0~7のうち0と1をまたたき出力にします。「if (nightcount<STOP_TIME) 」以下を下記のように変更しました。
if (nightcounti<STOP_TIME) { // 5時~10時?
if((nightcount & 0x3)==0) { // 速すぎるので四回に一回にする(40ms)
for(i=0;i<2;i++) {
x = x1[i];
if(x<0.5) {
x = x + 2 * x * x ;
} else {
x = x - 2 * (1.0 - x) * (1.0 - x);
}
// 1.0と0.0に張付きやすいのでランダム要素を入れる
if (x<0.005) {
x = (float)(rand())/256;
}
if (x>0.999) {
x = (float)(rand())/256;
}
x1[i] = x;
x = x * 251.0 + 5.0; // 完全な消灯にはしない
led[i] = (unsigned int8)x >> 3; // 32段階に圧縮
}
}
for(i=2;i<8;i++) {
cond[i]++;
if (cond[i]<128) { // 点灯中
led[i]=(int8)(32-(cond[i]>>2)); // 32段階で暗くなる
} else { // 消灯中
led[i]=0;
if (cond[i]>term[i]) { // 消灯終了直前に次の消灯時間を計算しておく
cond[i]=0;
term[i]=calc_rand();
}
}
}
}
上記のプログラムのコンパイル結果ではPIC16F88のROM領域は46%、RAMは32%の使用なので、まだまだ余裕があります。もっといろいろなことができそうですね。
「またたき」の演算には浮動小数点演算を使います。その演算時間は2個の点灯制御で約1.5ms/20MHzです。8MHzクロックの時は4ms弱かかることになります。多ピンのマイコンでより多くの星をコントロールするように修正するときには処理時間も確認しましょう。
雪の結晶ではなく全部星型にしてしまえば、冬季に限らず一年中飾っておいてもよいですね。
それでは、結晶5個と星2個をいっぺんに点灯させてみましょう。密集して点灯すると賑やかです。
<高野慶一>
(2008/08/18 プログラムリストの一部が欠けていたので修正。)
