« ATtiny402サンプル:"Wire.h"を使わずI2Cで液晶表示 AQM1602だと | トップページ | リコーのデジカメGXR+S10 寿命か!? »

2025年9月11日 (木)

ラジオペンチさんの「ダイソーのゆらゆらLEDキャンドルライト」

ダイソーのゆらゆらLEDキャンドルライト(1/f ゆらぎに改造):ラジオペンチさん
「出窓」に面白そうと、ご近所のダイソーを3軒探したの
ですが、見つからず。
やむを得ず、ダイソーの通販に注文しました。
  送料がかかるけど・・・単3Looperもいっしょに
Cc11_20250911093901
  ※しかし・・・今朝見たら、商品ページが消えてました。
    ちゃんと届くのか不安がぁぁ

ラジオペンチさんのArduino UNOによる駆動系、
せっかくですんで使えるPWM出力6つを全部使って、
3つのキャンドルライトを駆動できるようにスケッチを
手直ししてみました。

・PWM出力チャンネル番号をテーブルに。
・明るさデータを3つの配列に。
・3chのループを回して独立して処理。
・「チラツキ防止のため、10回に分けて」
 「補間1ステップ時間(全体ではこの10倍)」
 は、loopの一番外側に「for(i = 1」を持ってきて
 コイル駆動は i = 1のときだけにして、LED処理
 は毎回で、というふうに。

// ラジオペンチさん:
// ダイソーのゆらゆらLEDキャンドルライト(1/f ゆらぎに改造)
// http://radiopench.blog96.fc2.com/blog-entry-1355.html
// 20250908_LedCandleCaosMethod.ino
// カオス方を使った 1/f ゆらぎを持つLEDキャンドル
// 2025/9/8 ラジオペンチ
// 9/11 3ch出力に改造:居酒屋ガレージ店主(JH3DBO)
byte COIL_PIN[] = { 6, 9, 11 }; // コイル駆動PWM出力 3ch
byte LED_PIN[] = { 5, 10, 3 }; // LED駆動
float xx[3] = { 0.7, 0.7, 0.7};
float last_xx[3];
float xxx[3];

void setup() {
Serial.begin(115200);
pinMode(13, OUTPUT); // LED
Serial.println("Start ");
}

void loop() {
PINB |= (1 << 5); // PB5 LED on/off
for (int i = 1; i <= 10; i++) { // チラツキ防止のため、10回に分けて、
for (byte j = 0; j < 3; j++){ // 3ch loop (0,1,2)
if (i == 1){ // 10loopの最初だけ実行
xx[j] = fluctuate(xx[j]); // カオス法で新しい明るさを決定
Serial.print(j);
Serial.print(", ");
Serial.print(xx[j]);
Serial.print(", ");
// コイルに通電して炎の板を揺らす
xxx[j] = last_xx[j] - xx[j]; // 明るさの差(減光量)が、
if (xxx[j] > 0.15) { // 一定値を超えていたら(値は要調整)
analogWrite(COIL_PIN[j], 255 * sqrt(xxx[j])); // コイルに通電
//(sqrtは値を1に近付けるため)
Serial.println(sqrt(xxx[j]));
} else { // 超えてなければ
analogWrite(COIL_PIN[j], 0); // コイル通電OFF
Serial.println(0);
}
}
// LEDの明るさを変える (i=1~10)
xxx[j] = last_xx[j] + (xx[j] - last_xx[j]) * i / 10.0; // 指定値まで直線補完で、
analogWrite(LED_PIN[j], 70 + xxx[j] * 180); // LEDの明るさを設定
last_xx[j] = xx[j];
}
delay(10); // 補間1ステップ時間(全体ではこの10倍)
}
}

float fluctuate(float x) { // 間欠カオス法で 1/f波形を生成
if (x < 0.5) { // 0.5以上なら
x = x + 2 * x * x; // 2x^2で徐々に増加
} else { // 0.5以下なら
x = x - 2 * (1.0 - x) * (1.0 - x); // 2(1-x)^2で徐々に減少
} //
if (x < 0.05 || x > 0.95) { // 結果が上下限を外れていたら、
x = random(100, 900) / 1000.0; // 乱数で0.1-0.9の範囲に戻す
}
return x;
}

こんな具合にスケッチはできたけど、キャンドルライトが
来ないことには試運転もできません。
  出力パルスをオシロで見てるだけ。

商品ページが消えてしまったキャンドルライト、
はたしてちゃんと届くのでしょうか。

※PWM出力の順番
 コイル駆動PWM出力 : 6, 9, 11
 LED駆動PWM出力 : 5, 10, 3 
これはATmega328Pにある3つのタイマーユニット
出力のペアに合わせてるので飛び飛びになってます。
  OC0A 6
  OC0B 5
  OC1A 9
  OC1B 10
  OC2A 11
  OC2B 3

※3ch版、完成形に
ラジオペンチさんの「ダイソーのゆらゆらLEDキャンドルライト」#2
  出窓へのデビューはいつになりますか・・・

|

« ATtiny402サンプル:"Wire.h"を使わずI2Cで液晶表示 AQM1602だと | トップページ | リコーのデジカメGXR+S10 寿命か!? »

出窓」カテゴリの記事

Arduino」カテゴリの記事

コメント

ダイソーの通販から「発送しました」とのメールが着信。
キャンドルライト、なんとか手に入りそうです。

投稿: 居酒屋ガレージ店主(JH3DBO) | 2025年9月12日 (金) 09時46分

コメントを書く



(ウェブ上には掲載しません)




« ATtiny402サンプル:"Wire.h"を使わずI2Cで液晶表示 AQM1602だと | トップページ | リコーのデジカメGXR+S10 寿命か!? »