昨日、スケッチをアップするの忘れてた。
#include <MsTimer2.h>
#define lower1 (256L * 512)
#define limit1 (((255L*255L * 5 + lower1)) / 255L)
#define lower2 (256L * 128)
#define limit2 (((255L*255L * 5 + lower2)) / 255L)
int ledPin1 = 9;
int ledPin2 = 10;
volatile unsigned int cnt;
unsigned char wave_form[] = {
0x80,0x83,0x86,0x89,0x8C,0x90,0x93,0x96,
0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE,
0xB1,0xB3,0xB6,0xB9,0xBC,0xBF,0xC1,0xC4,
0xC7,0xC9,0xCC,0xCE,0xD1,0xD3,0xD5,0xD8,
0xDA,0xDC,0xDE,0xE0,0xE2,0xE4,0xE6,0xE8,
0xEA,0xEB,0xED,0xEF,0xF0,0xF1,0xF3,0xF4,
0xF5,0xF6,0xF8,0xF9,0xFA,0xFA,0xFB,0xFC,
0xFD,0xFD,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFD,
0xFD,0xFC,0xFB,0xFA,0xFA,0xF9,0xF8,0xF6,
0xF5,0xF4,0xF3,0xF1,0xF0,0xEF,0xED,0xEB,
0xEA,0xE8,0xE6,0xE4,0xE2,0xE0,0xDE,0xDC,
0xDA,0xD8,0xD5,0xD3,0xD1,0xCE,0xCC,0xC9,
0xC7,0xC4,0xC1,0xBF,0xBC,0xB9,0xB6,0xB3,
0xB1,0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,
0x99,0x96,0x93,0x90,0x8C,0x89,0x86,0x83,
0x80,0x7D,0x7A,0x77,0x74,0x70,0x6D,0x6A,
0x67,0x64,0x61,0x5E,0x5B,0x58,0x55,0x52,
0x4F,0x4D,0x4A,0x47,0x44,0x41,0x3F,0x3C,
0x39,0x37,0x34,0x32,0x2F,0x2D,0x2B,0x28,
0x26,0x24,0x22,0x20,0x1E,0x1C,0x1A,0x18,
0x16,0x15,0x13,0x11,0x10,0x0F,0x0D,0x0C,
0x0B,0x0A,0x08,0x07,0x06,0x06,0x05,0x04,
0x03,0x03,0x02,0x02,0x02,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x03,
0x03,0x04,0x05,0x06,0x06,0x07,0x08,0x0A,
0x0B,0x0C,0x0D,0x0F,0x10,0x11,0x13,0x15,
0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x24,
0x26,0x28,0x2B,0x2D,0x2F,0x32,0x34,0x37,
0x39,0x3C,0x3F,0x41,0x44,0x47,0x4A,0x4D,
0x4F,0x52,0x55,0x58,0x5B,0x5E,0x61,0x64,
0x67,0x6A,0x6D,0x70,0x74,0x77,0x7A,0x7D};//sine wave
void count_up() {
cnt++;
}
void setup() {
cnt = 0;
MsTimer2::set(1, count_up); // 1ms period
MsTimer2::start();
}
void loop() {
long led1,l11,l12,l13,l14,l15,l16;
long led2,l21,l22,l23,l24,l25,l26;
unsigned int c;
while ((c = cnt) != cnt){
}
l11 = (long)wave_form[c % 256] * (long)wave_form[(c * 3 / 256) % 256];
l12 = (long)wave_form[(c / 2) % 256] * (long)wave_form[(c * 5 / 32) % 256];
l13 = (long)wave_form[(c / 8) % 256] * (long)wave_form[(c * 7 / 128) % 256];
l14 = (long)wave_form[(c / 8) % 256] * (long)wave_form[(c /16) % 256];
l15 = (long)wave_form[(c / 16) % 256] * (long)wave_form[(c * 9 / 128) % 256];
l16 = lower1;
l21 = (long)wave_form[(c * 13) / 16 % 256] * (long)wave_form[(c / 256) % 256];
l22 = (long)wave_form[(c / 2) % 256] * (long)wave_form[(c * 9 / 32) % 256];
l23 = (long)wave_form[(c / 4) % 256] * (long)wave_form[(c * 5 / 16) % 256];
l24 = (long)wave_form[(c / 8) % 256] * (long)wave_form[(c * 3 / 64) % 256];
l25 = (long)wave_form[(c / 16) % 256] * (long)wave_form[(c * 7 / 64) % 256];
l26 = lower2;
led1 = ((l11 + l12 + l13 + l14 + l15 + l16) / limit1);
led2 = ((l21 + l22 + l23 + l24 + l25 + l26) / limit2);
analogWrite(ledPin1, led1); // flicking softly (bottom of fire)
analogWrite(ledPin2, led2); // flicking strongly (top of fire)
}
こんな感じで、D9とD10の2つのアナログ出力ピンに
それぞれ6個ずつ(うち直流成分が1個)の波形を
合成して、ろうそくの炎っぽいちらつきを表現して
みた。
片方ずつでもそれなりにちらちらした感じがろうそく
っぽい感じで点燈できる。
重畳させている各波形の周波数は、あえてマチマチに
なるようにしてあって、あたかも、乱数で明るさを
ちらちらさせているかのような瞬きが表現できてる
と思うんだけどな。
まだ、これに追加したい機能があるんだよな。
衝撃が加わると、炎が一瞬消えそうなくらいに小さく
なって、その一瞬後に「ポッ」と大きくなるような
表現とか、電池が切れ掛かってきたら、炎が不安定に
なりながら、光が小さくなっていく感じとか、そういう
のまで再現したいんだよな。
もう少し進んだら、ページにまとめておきたいところ。
そういえば、Hack A Dayに、
http://hackaday.com/2014/03/02/reverse-engineering-candle-flicker-leds-again/
ちょうど似たような感じのがあったんだけど、これは
正弦波を重ねるイメージじゃなくて、以前ノイズ発生
でも使った線形帰還シフトレジスタの乱数発生の
ロジックを使って、不安定に瞬かせる感じみたい。
同じ瞬きでも、ちょっと印象がちがうんだよな。
aitendoに、色々電源関係が。
http://www.aitendo.com/product/5902
MC34063は、ちょっと単価が高いかな。秋月でNJM2360
を買っちゃった方が安いな。
http://www.aitendo.com/product/9663
この手の、100V交流からのコンバータはかなりいい
んだけど、問題は、トランス周りも一緒に売って
くれないと、ナカナカ手が出ないかなぁ…
http://www.aitendo.com/product/1789
5V1Aで250円って言うのはいいなぁ。USBコネクタの
形だし。
http://www.nicovideo.jp/watch/sm22879933
eVY1であの楽器って… あれって、楽器だったのか?
http://www.huffingtonpost.jp/2014/03/03/mayor-of-minami-soma_n_4888187.html?utm_hp_ref=japan
もうじき3年経つんだな。
それにしても、この話を読むと、マスコミの取り組み
って言うのが、目を瞑りたくなるようなナニだな。
その目を瞑りたくなるような情報を欲しがっている
のが、自分たちなのかな?