エモい作品をJavaScriptでも!IchigoLatte用 WS2812B LEDテープドライバ “emo-driver” 完成!

iottie1-02.jpg

LED間接照明のエモいネクタイ「IoTie」を福野くんが作っています。こんなネクタイならしてみたい。

IMG_3424.jpg

というわけで、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) しておいてください。)

IMG_3426 copy.jpgIMG_3429 copy.jpgIMG_3427 copy.jpg

接続はこう。DIはEXに接続します。

IMG_3433.jpg

モバイルバッテリーにつなげばどこででも光らせられますね。

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個をランダムな色で呼吸させるプログラム!

IMG_3440.jpg

さっそくIchigoDakeにプログラムを入れてウェアラブルに。コイン電池の3Vからでも一応光りますが青色が弱い。WS2812Bの仕様上は3.5v以上のようですね。軽くて小さくてコンビニでも入手可能な3.5v前後の電池ほしいな。

みんなも「イケすぎウェア」を作ってみよう!


 

flyer01.png

みんなのエモい作品、待ってます

 

 

 

 

 

 

.

 

Leave a comment