目次
前
次
蛍の光スケッチ
日本には源平合戦の話から、ヘイケホタルとゲンジホタルが
有名です。最近は、ヘイアンチョウに伝書蛍が出てきますが
淡い光の明滅を見ると、心が和みます。
蛍の腹部から発せられる淡い光の明滅は
正弦波を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の光り方を
見て動作確認できます。
目次
前
次