目次

蛍の光スケッチ

 日本には源平合戦の話から、ヘイケホタルとゲンジホタルが
 有名です。最近は、ヘイアンチョウに伝書蛍が出てきますが
 淡い光の明滅を見ると、心が和みます。




 蛍の腹部から発せられる淡い光の明滅は
 正弦波をLEDに与えると実現できます。

 デジタル回路では、連続した正弦波を出力
 できないので、PWM(Pulse Width Modulation)
 を利用し、疑似正弦波でLEDを発光させます。


 Arduinoでは、PWMの波形出力をanalogWriteという
 関数で処理します。

 analogWriteは、波形出力ピンと0〜255の値を
 引数にとります。

 PWMの波形出力が可能なピンは、固定されているため
 ピン指定に気をつけないと動作がおかしくなります。

 PWMの波形出力ができるピンのリストは、以下。

 9ピンにLEDを接続して、関数analogWriteの
 動作を確認するスケッチを作成してみます。

#define INTERV 50
#define LAST   256
#define MAX    255

/* pin assign */
#define HOTALA 9

/* variables */
word xinterval ;
word state ;

void setup()
{
  /* PWM pin */
  pinMode(HOTALA,OUTPUT);
  /* set interval */
  xinterval = INTERV ;
  /* set state */
  state = 0 ;
}

void loop()
{
  /* increment */
  for ( state = 0 ; state < LAST ; state++ ) {
    /* impress */
    analogWrite(HOTALA,state);
    /* delay */
    delay(xinterval);
  }
  /* decrement */
  for ( state = 0 ; state < LAST ; state++ ) {
    /* impress */
    analogWrite(HOTALA,MAX-state);
    /* delay */
    delay(xinterval);
  }
}

 単純に0〜255、255〜0と1刻みでパラメータを
 変化させているだけにしました。

 LEDがひとつだけでは、蛍が発光している状態には
 見えないので、3LEDに位相を変えてPWM波形を出力
 するようにしてみます。

 関数analogWriteは、数値として0〜255の範囲ですが
 最高値を240とします。

 3つの位相差を考えると、0、80、160で初期値を与えて
 1刻みで240まで到達するようにfor文で制御すればよい
 でしょう。

 位相制御を加えた蛍の発光スケッチは、以下です。

#define INTERV 50
#define MAX    240
#define LAST   241
#define I1     80
#define I2     160

/* pin assign */
#define HOTALU 9
#define HOTALV 10
#define HOTALW 11

/* variables */
word xinterval ;
byte stateu ;
byte statev ;
byte statew ;

void setup() {
  /* PWM pin */
  pinMode(HOTALU,OUTPUT);
  pinMode(HOTALV,OUTPUT);
  pinMode(HOTALW,OUTPUT);
  /* set interval */
  xinterval = INTERV ;
}

void loop()
{
  /* increment */
  for ( stateu = 0 ; stateu < LAST ; stateu++ ) {
    /* calculate phase */
    statev = (stateu + I1) % MAX ;
    statew = (stateu + I2) % MAX ;
    /* impress */
    analogWrite(HOTALU,stateu);
    analogWrite(HOTALV,statev);
    analogWrite(HOTALW,statew);
    /* delay */
    delay(xinterval);
  }
  /* decrement */
  for ( stateu = 0 ; stateu < LAST ; stateu++ ) {
    /* calculate phase */
    statev = (stateu + I1) % MAX ;
    statew = (stateu + I2) % MAX ;
    /* impress */
    analogWrite(HOTALU,MAX-stateu);
    analogWrite(HOTALV,MAX-statev);
    analogWrite(HOTALW,MAX-statew);
    /* delay */
    delay(xinterval);
  }
}

 ブレッドボードを利用して点滅させる場合
 次のようにLEDを実装します。



 1LEDの蛍の光は、自転車用ライトを
 少し改造してテストしました。



 ブレッドボード用ワイヤーに赤をD9に
 緑をGNDに接続して、LEDの光り方を
 見て動作確認できます。


目次

inserted by FC2 system