LED間接照明のエモいネクタイ「IoTie」を福野くんが作っています。こんなネクタイならしてみたい。
というわけで、IchigoLatte JavaScript によるエモ工作に挑戦です。とっても便利なLEDテープ( ¥2,860/150個 )ですが、通信プロトコルは独自仕様。IchigoJam BASICではマシン語によるドライバをインクルードしています。IchigoLatte JS 1.1.7以降 のマシン語は強化されているので、今回は WS2812B 用ドライバ を作るところから。
仕様はこちら。μsec単位のパルスでH,Lを送信して各LEDのGRBを0x00~0xffで指定、シンプルですね。
// install emo-driver { var a=mem(" "); mem(a,0xf0,0xb5,0x85,0xb0,0x72,0xb6,0x0e,0x68,0x00,0x21,0xf3,0x68,0x02,0x93,0x02,0x9b);a=a+16; mem(a,0x99,0x42,0x3c,0xd0,0x10,0x22,0xcc,0x00,0x33,0x19,0x01,0x93,0x01,0x9b,0x80,0x25);a=a+16; mem(a,0xdb,0x69,0x13,0x41,0xdb,0xb2,0x03,0x93,0x08,0x23,0x9c,0x46,0x03,0x9b,0x02,0x20);a=a+16; mem(a,0x2b,0x40,0x01,0xd0,0x00,0x20,0x02,0x23,0xa0,0x27,0x16,0x4c,0x00,0x93,0xff,0x05);a=a+16; mem(a,0x3f,0x59,0x04,0x24,0x27,0x43,0xa0,0x24,0x12,0x4b,0xe4,0x05,0xe7,0x50,0x1f,0x00);a=a+16; mem(a,0x00,0x9b,0x01,0x3b,0x00,0x93,0x01,0xd3,0xc0,0x46,0xf9,0xe7,0xa0,0x23,0x04,0x24);a=a+16; mem(a,0xdb,0x05,0xdb,0x59,0xa3,0x43,0xa0,0x24,0xe4,0x05,0xe3,0x51,0x01,0x38,0x01,0xd3);a=a+16; mem(a,0xc0,0x46,0xfb,0xe7,0x01,0x23,0x5b,0x42,0x9c,0x44,0x63,0x46,0x6d,0x08,0x00,0x2b);a=a+16; mem(a,0xd4,0xd1,0x08,0x3a,0x13,0x00,0x08,0x33,0xc8,0xd1,0x01,0x31,0xbf,0xe7,0x62,0xb6);a=a+16; mem(a,0x05,0xb0,0xf0,0xbd,0xfc,0x3f,0x00,0x00); } // send lighting plan to LED tape function emo(p){env(p);mem();}
こちらが完成したドライバ、その名も「emo-driver」。これをソースの先頭にインクルード(書いておく)してください。
var plan = new Array(5); plan[0] = 0x00ff00; plan[1] = 0xff0000; plan[2] = 0x0000ff; plan[3] = 0xffffff; plan[4] = 0x202020; emo(plan);
こちらがLED5個の場合のサンプルコード。5個の配列を作って各要素にLEDの色を0xGGRRBBで指定、その配列を emo(…) に渡せばLEDテープに信号を投げてくれます。(信号送信時に画面がブレます。気になる方は video(0) しておいてください。)
接続はこう。DIはEXに接続します。
モバイルバッテリーにつなげばどこででも光らせられますね。
var plan = new Array(32); var t = -90; var r = 0xff; var g = 0xff; var b = 0xff; while(1){ if((t+90)%360 == 0){ r = (rnd(0x80)+0x00); g = (rnd(0x80)+0x00); b = (rnd(0x80)+0x00); } var s = sin8(t)+0x100; var l = (((g*s)>>9)<<16) + (((r*s)>>9)<<8) + (((b*s)>>9)<<0); plan[ 0] = l; plan[ 1] = l; plan[ 2] = l; plan[ 3] = l; plan[ 4] = l; plan[ 5] = l; plan[ 6] = l; plan[ 7] = l; plan[ 8] = l; plan[ 9] = l; plan[10] = l; plan[11] = l; plan[12] = l; plan[13] = l; plan[14] = l; plan[15] = l; plan[16] = l; plan[17] = l; plan[18] = l; plan[19] = l; plan[20] = l; plan[21] = l; plan[22] = l; plan[23] = l; plan[24] = l; plan[25] = l; plan[26] = l; plan[27] = l; plan[28] = l; plan[29] = l; plan[30] = l; plan[31] = l; emo(plan); t=t+1; sleep(20); }
IchigoLatte JavaScript の配列は最大32なので、今回のエモ-ドライバで32の長さのLEDテープを制御できます。ドライバにループさせる機能をつければもっと長いのもいけますね。動画は32個をランダムな色で呼吸させるプログラム!
さっそくIchigoDakeにプログラムを入れてウェアラブルに。コイン電池の3Vからでも一応光りますが青色が弱い。WS2812Bの仕様上は3.5v以上のようですね。軽くて小さくてコンビニでも入手可能な3.5v前後の電池ほしいな。
みんなも「イケすぎウェア」を作ってみよう!
みんなのエモい作品、待ってます!
.