« 足のなまり度チェック | Main | 【Excel VBA】シェイプ内の検索 »

お祭り提灯

Choutinn

町内ではお祭りの少し前から提灯を飾ることになっています。

ただ、この提灯は灯りをともすことはなく、夜はちょっとさみしい感じです。そこで、電子工作でLEDをともしてみることにしました[動画]

ただ、単純にLEDを点けてしまうと、のっぺりした明るさになるので、こちらに掲載されている「間欠カオスによる1/fゆらぎ」の計算式をマイコンのArduinoに計算させて、LEDの明るさをコントロールしてみました。さらに、明るい間はLEDを点けないようにするため、明るさセンサーを付けています。

Dsc_1167

配線はこんな感じ。

LEDは黄色の5mmで、光を拡散するキャップをつけてます。このキャップはLEDの集中的でカチッととした光をふんわりとやわらかいものにします。電源の前に100Ωの抵抗を付けています。

明るさセンサーにはCdSセルを使いました。そのままだと電源がもったいないので、明るい間は10分おきに明るさセンサーの電源を入れて、測定するようにしました。

ソースコードは以下の通り

<メインコントロール>

#include "Yuragi.h"

//明るさセンサーを読み取るピン
int pinCds = A0;

//明るさセンサーに電源を供給するピン
int pinCdsPwr = 4;

//ゆらぎLEDの数
int yuragiLen = 3;

//ゆらぎLEDの設定 ピン, 最小値, ゆらぎ開始値
YURAGI _yuragi[] = {
  YURAGI(9, 0, 0.4),
  YURAGI(11, 0, 0.6),
  YURAGI(10, 60, 0.3)};

//ゆらぎ開始時間
unsigned long startTime = 0;

//ゆらぎ開始時間
unsigned long interval = 5000;

//明るさセンサーの値
int value = 0;

//明るさレベル
float level = 0.0;

//明るさレベル追加分
float addlevel = 0.01;

void setup() {
  pinMode(pinCdsPwr, OUTPUT);
  pinMode(pinCds, INPUT);
  
  digitalWrite(pinCdsPwr, LOW);
}

void loop() {
  //明るさセンサーの電源を入れて明るさ測定
  digitalWrite(pinCdsPwr, HIGH);
  delay(100);
  value = analogRead(pinCds);
  if(value < 200) {
    //ゆらぎLED実行
    playYuragi();
  }
  digitalWrite(pinCdsPwr, LOW);

  // 10分待機
  delay(600000);
}

void playYuragi() {
  boolean doPlay = true;
  while(doPlay) {
    if(startTime == 0 || (millis() - startTime) > interval) {
      value = analogRead(pinCds);
      if(value < 200) {
        startTime = millis();
        if(level > 1.0) {
          addlevel = 0;
        }
        else {
          addlevel = 0.01;
        }
      }
      else {
        startTime = 0;
        addlevel = -0.01;
      }
    }

    if(level < 0.0) {
      level = 0.0;
      doPlay = false;
    }
    else if(level > 1.0) {
      level = 1.0;
    }
    else {
      level += addlevel;
    }
    for(int i = 0; i < yuragiLen; i++) {
      _yuragi[i].Next(level);
    }
    delay(60);
  }
}

<ゆらぎコントロールクラス>

#ifndef YURAGI_H
#define YURAGI_H

#include "Arduino.h"

class YURAGI
{
public:
  YURAGI(int pin, int baseLevel, float seed) {
    pinMode(pin, OUTPUT);
    _pin = pin;

    if(baseLevel > 255) {
      baseLevel = 255;
    }
    else if(baseLevel < 0) {
      baseLevel = 0;
    }
    _baseLevel = baseLevel;
    _range = 255 - baseLevel;

    if(seed < 0.1 || seed > 0.9) {
      seed = random(100, 800) / 1000.0;
    }
    _value = seed;
  }

  void Next(float level) {
    //レベルが 0 から 1 の範囲を越えないようにする
    if(level > 1) {
      level = 1;
    }
    else if(level < 0) {
      level = 0;
    }
    _level = level;

    // 1/fゆらぎ計算
    if(_value < 0.5) {
      _value = _value + 2 * _value * _value;
    }
    else {
      _value = _value - 2 * (1 - _value) * (1 - _value);
    }

    // 上限下限付近で極端な値にならないよう制限する
    if(_value > 0.9) {
      _value = 0.9;
    }
    else if(_value < 0.1) {
      _value = 0.1;
    }

    //明るさを計算して設定する
    _brightness = (int)(_baseLevel + (int)(_value * _range)) * _level;
    analogWrite(_pin, _brightness);
  }

  void Off() {
    digitalWrite(_pin, LOW);
  }

  int GetBrigthness() {
    return _brightness;
  }

private:
  int _pin;
  int _baseLevel;
  float _level;
  int _range;
  float _value;
  int _brightness;
};
#endif

|

« 足のなまり度チェック | Main | 【Excel VBA】シェイプ内の検索 »

Comments

お祭り提灯の雰囲気がいい感じに出ていますね。
流石です!

Posted by: クロタマ | July 13, 2013 at 09:31 PM

>クロタマさん
ありがとうございます。
電子工作は素人なので、勉強のし甲斐があります。
今は試作用基板で作ってますが、もう少し小型化できればと思っています。

Posted by: だいにゃん@管理人 | July 14, 2013 at 05:29 AM

Post a comment



(Not displayed with comment.)




« 足のなまり度チェック | Main | 【Excel VBA】シェイプ内の検索 »