1 / f で七色にゆらぐLED照明を電子工作する(入門レベル)


趣味で宇宙開発を行う団体「リーマンサット・プロジェクト」がお送りする新春アドベントカレンダーです。
私はRSP-01という超小型人工衛星の、アームを伸ばしてカメラで自撮りをする機能の開発を担当しています。



完成したものの動画はこちらです。

ぼーっと眺めて自分が癒やされるために以前から作りたいと思っていた、1/fで七色に揺らぐ照明を作ってみました。
部品も少なく、プログラムの調整で動きが変わることが実感でき、筐体に収めるという一通りの作業が必要なため、電子工作入門した方の次の一歩にいかがでしょうか。

そして、このレベルの電子工作ならばできそう、という方ならばリーマンサットの人工衛星開発にも十分参加できると思います。
あとはTeDD (Teach each other Driven Development)でどんどん進めていくことができます。
自分も本当にいろんなことをRSPのメンバーに教えてもらいました。

1 / f のゆらぎとは

Wikipediaに以下のような記載があります。宇宙にも通ずるものがありそうです(こじつけ)。

Wikipedia 1/fゆらぎ」より引用:

1/fゆらぎ(エフぶんのいちゆらぎ)とは、パワー(スペクトル密度)が周波数 f に反比例するゆらぎのこと。ただし f は 0 より大きい、有限な範囲をとるものとする。
ピンクノイズはこの1/fゆらぎを持つノイズであり、1/fノイズとも呼ばれる。自然現象においても見ることができ[1]、具体例としては人の心拍の間隔、ろうそくの炎の揺れ方、電車の揺れ、小川のせせらぐ音、目の動き方、木漏れ日、蛍の光り方などがある。また物性的には、金属の抵抗、ネットワーク情報流が例として挙げられる。

そして、1/fゆらぎを作る方法を調べると間欠カオスというものがありました。
https://ktblog820.blog.fc2.com/blog-date-201403-1.htmlにグラフがあってわかりやすいです。

作る

1 / f で七色にゆらぐ照明はArduinoとフルカラーLEDがあれば作ることができそうです。
そして、気になる部品を購入して積んでいたのでそれらを消化しつつ作って行きたいと思います。

材料一覧

部品 価格 個数 備考
ATTiny85開発ボード 250円 1 https://www.amazon.co.jp/dp/B07437LK9N/
フルカラーLED 50円 1 https://akizukidenshi.com/catalog/g/gI-02476
470Ω抵抗 10円 3 https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=7AVS-6UHK
ユニバーサル基板 (2.54mmピッチ 23.5mm x 18.0mm) 15円 1 https://akizukidenshi.com/catalog/g/gP-12731/
筐体(壊れたソーラーライト) 100円 1
micro-B USB ケーブル 120円 1 余っているもので良いです。https://akizukidenshi.com/catalog/g/gC-09314/
電線 少々 余っているもので良いです。https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=8CJ2-U6NY

フルカラーLEDにはマイコンが入っていて信号を送って点灯するタイプと、PWM x 3本で点灯するタイプがあります。
以前に自分はPWMで50個入りを250円で買っていたようで、ストックがあるためPWMタイプを使います。

PWMタイプのフルカラーLEDに必要な3つのPWMですが、Arduinoならば問題なく対応できます。
手元にもArduinoの在庫がいくつかあるのでArduinoを使います。できるだけ小さくしたいので買い置きの中でもATTiny85開発ボードを使いたいところです(PICでもいいのですが)。
ATTiny85のデータシートで調べると幸いPWM(OC0A, OC0B, OC1B)が3本出せるのでATTiny85開発ボードを使うことにします。 
それと筐体については、100円ショップで買った(けど壊れていた)LED照明の外身を使うことにします。その他ユニバーサル基板、抵抗、電線を使います。

材料の写真

回路の作成

以下のように接続します。ATTinyのUSBポートから給電することを想定しています(図ではUSBは省略)。

作ったHWは以下のようになります。配置を考えてATTiny85開発ボードをユニバーサル基板に直接はんだ付けしてもOKです。

プログラムの作成

基本的にはLチカと同じです。
1/fのゆらぎを作るためにプログラムを書いていきます。

さきにプログラム全体を載せておきます。



#define REDPIN (4)
#define GREENPIN (1)
#define BLUEPIN (0)

float fRed = 0.7;
float fGreen = 0.5;
float fBlue = 0.3;

void setup()
{
  randomSeed(analogRead(0));
}

void loop()
{
  float lastRed = fRed;
  float lastGreen = fGreen;
  float lastBlue = fBlue;

  fRed = fluctuate(fRed);
  fGreen = fluctuate(fGreen);
  fBlue = fluctuate(fBlue);

  for (int i = 1; i <= 100; i++)
  {
    analogWrite(REDPIN, (int)(interpolate(fRed, lastRed, i) * 255));
    analogWrite(GREENPIN, (int)(interpolate(fGreen, lastGreen, i) * 255));
    analogWrite(BLUEPIN, (int)(interpolate(fBlue, lastBlue, i) * 255));
    delay(20);
  }
}

float interpolate(float next, float prev, int percent)
{
  return (next * percent / 100 + (prev * (100 - percent)) / 100);
}

float fluctuate(float x)
{
  if (x < 0.5)
  {
    x = x + 2 * x * x;
  }
  else
  {
    x = x - 2 * (1.0 - x) * (1.0 - x);
  }
  if (x < 0.05 || x > 0.95)
  {
    x = random(100, 900) / 1000.0;
  }

  return (x);
}

間欠カオスでゆらぎを作る部分がfluctuate()です。

float fluctuate(float x)
{
  if (x < 0.5)
  {
    x = x + x * x;
  }
  else
  {
    x = x - 2 * (1.0 - x) * (1.0 - x);
  }
  if (x < 0.05 || x > 0.95)
  {
    x = random(100, 900) / 1000.0;
  }

  return (x);
}

ゆらぎの値が小さくなりすぎたり、大きくなりすぎると値がなかなか中央に戻ってこなくなります。
そうなるとゆらがなくなるため、しきい値を設けて乱数を入れて戻すようにしています。

このプログラムではRGBの三色の強さがゆらぎます。
ゆらぎの移り変わりには補間を入れてゆっくり色が移り変わるようになっています。

書き込み

作成したプログラムを書き込みます。

まず、https://github.com/digistump/DigistumpArduino/tree/master/toolsからドライバをダウンロードして、DPinst64.exeを実行し、インストールします。

次にArduino IDEの設定です。

Arduino IDEのファイル > 環境設定 を開いて「追加のボードマネージャのURL」にhttp://digistump.com/package_digistump_index.jsonを追加します。

ツール > ボード > ボードマネージャDigistump AVR Boardsを検索してインストールします。
そうすると、ツール > ボード からDigistump AVR Boardsが選べるようになっています。デフォルトのDigispark (Default -16.5mhz)を選択します。

これで準備はOKです。ただし、ATTiny85開発ボードの書き込み方法は少し変わっているので注意が必要です。
ATTiny85開発ボードを接続せずに スケッチ > マイコンボードに書き込むを選択し、以下の表示が出たら接続します。そうすると書き込みが始まります。

Plug in device now... (will timeout in 60 seconds)

組み上げ

筐体に組み込んでいきます。
100円のライトにもともと入っていた部品は取り除きます。
USBケーブルを通すための穴も開けておきます。
USBケーブルを穴に通してATTiny85開発ボードと接続した後、ボードを収めます。

余裕で収まりました。完成したものの動画はこちらです(再掲)。
ソーラーパネルは飾りで使っていません。消費電力少ないのでバッテリー&ソーラーでも動くかもしれません。
あとは外装を変えてみても面白いかもしれませんね。

免責事項

本記事の内容に付きまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。
本記事の情報の内容およびその利用によって利用者にいかなる損害、被害が生じても著者は一切の責任を負いかねますのでご了承ください。
電子工作はやけどや火災、感電の可能性があります。事故や怪我をおこすことがないよう十分に注意して作業してください。


明日は @Ushinji さんの「CSSアニメーションで、Webブラウザに流れ星を流したい」です。

リーマンサット・プロジェクトは「普通の人が集まって宇宙開発しよう」を合言葉に活動をしている民間団体です。
興味を持たれた方は https://www.rymansat.com/join からお気軽にどうぞ。

やりたいことをなんとかして実現する、全員が協力を惜しまない空気があります。ベンチャーのような勢いがあって楽しいです。普段とは違う空気を感じたい人はぜひ!