micro:bitのBLE LEDサービスにNode.js nobleでWOMBAT!と文字を送るメモ

micro:bitのBLE LEDサービスにNode.js nobleでWOMBAT!と文字を送るメモです。

やりたいこと

image

micro:bitでのBLEのやり取りが掴めてきたので文字を送るようにしてみましょう。

micro:bitのBLEのA・BボタンイベントをNode.js nobleで取得してみるメモ – 1ft-seabass.jp.MEMO

先日のこの記事を元にしてLEDサービスで文字を送ります。Raspberry Piの設定は、上記と同様のもので行っています。

BLE LEDサービスのUUID

BLE LEDサービスのUUIDの情報も、やはり node-bbc-microbit/led-service.js at master · sandeepmistry/ode-bbc-microbitが参考になります。

var LED_SERVICE_UUID                        = 'e95dd91d251d470aa062fa1922dfa9a8';
var LED_MATRIX_STATE_CHARACTERISTIC_UUID    = 'e95d7b77251d470aa062fa1922dfa9a8';
var LED_TEXT_CHARACTERISTIC_UUID            = 'e95d93ee251d470aa062fa1922dfa9a8';
var LED_SCROLLING_DELAY_CHARACTERISTIC_UUID = 'e95d0d2d251d470aa062fa1922dfa9a8';

今回はLED_TEXT_CHARACTERISTIC_UUIDを使います。

nobleソースコード

nobleソースコードは以下のとおりです。

こちらを参考にしつつ write によって文字列を送信していきます。

ソースコードは以下のとおりです。

var noble = require('noble');
 
var LED_SERVICE_UUID                        = 'e95dd91d251d470aa062fa1922dfa9a8';
var LED_MATRIX_STATE_CHARACTERISTIC_UUID    = 'e95d7b77251d470aa062fa1922dfa9a8';
var LED_TEXT_CHARACTERISTIC_UUID            = 'e95d93ee251d470aa062fa1922dfa9a8';
var LED_SCROLLING_DELAY_CHARACTERISTIC_UUID = 'e95d0d2d251d470aa062fa1922dfa9a8';

var LED_TEXT_CHARACTERISTIC;

// 状態がパワーONだったらスキャンに移行
noble.on('stateChange', function(state) {
    console.log('on -> stateChange: ' + state);
 
    if (state === 'poweredOn') {
        noble.startScanning();
    } else {
        noble.stopScanning();
    }
});
 
noble.on('scanStart', function() {
    console.log('on -> scanStart');
});
 
noble.on('scanStop', function() {
    console.log('on -> scanStop');
});
 
// discover 機器が発見されたら
noble.on('discover', function(peripheral) {
    console.log('on -> discover: ' + peripheral);
    // まずスキャンをとめる
    noble.stopScanning();
 
    // KONASHI接続時のイベント
    peripheral.on('connect', function() {
        console.log('on -> connect');
        this.discoverServices();
    });
    // KONASHI切断時のイベント
    peripheral.on('disconnect', function() {
        console.log('on -> disconnect');
    });
 
    // 見つけたサービス(機器)へのアクセス
    peripheral.on('servicesDiscover', function(services) {
 
        for(i = 0; i < services.length; i++) {
 
            // サービスがUUIDと一致した時だけ処理
            if(services[i]['uuid'] == LED_SERVICE_UUID){
 
                // サービスのcharacteristic捜索
                services[i].on('includedServicesDiscover', function(includedServiceUuids) {
                    console.log('on -> service included services discovered [' + includedServiceUuids + ']');
                    this.discoverCharacteristics();
                });
 
                // characteristic取得イベント
                services[i].on('characteristicsDiscover', function(characteristics) {
 
                    // characteristics配列から必要なCHARACTERISTICSをUUIDから判断してcharacteristic格納
                    for(j = 0; j < characteristics.length; j++) {
                        if( LED_TEXT_CHARACTERISTIC_UUID == characteristics[j].uuid ){
                            console.log("LED_TEXT_CHARACTERISTIC exist!!");
                            
                            LED_TEXT_CHARACTERISTIC = characteristics[j];
                            
                            console.log("LED_TEXT_CHARACTERISTIC write WOMBAT! buffer");
                            var buf = new Buffer("WOMBAT!");
                    	    LED_TEXT_CHARACTERISTIC.write(buf,false,function(error) {
                    	        console.log(error);
                            });
                            
                        }
                    }
 
                });
 
                services[i].discoverIncludedServices();
            }
        }
 
    });
 
    // 機器との接続開始
    peripheral.connect();
});

led_access.jsとして保存しておきます。

動かしてみる

それでは動かしてみましょう。さきほどのled_access.jsを実行します。

image

無事接続までされました。micro:bitではどうなっているでしょうか。

無事文字が送られました!WOMBAT!と出ます。

Bufferに文字を入れるだけで送れたので、めちゃくちゃ手軽ですね。

まとめ

これにより、Node.js nobleで、LED Matrixにより文字の出力と、ボタン操作の検知が行えたので、入出力の感覚がつかめたということになります。

LED Matrixにより文字の出力によって、外部からのデータ表示ができるので表現力に幅が出ます。また、ボタン操作の検知よって、データ取得、つまり加速度や温度センサーの値を取るイメージもできます。

文字の出力は、5 x 5のマス目ながらも、これくらいでかなり表現が色々できそうなので、ドット絵を打つ間隔で、視覚伝達につなげられそうに思えました。現在の状況でも、接続・切断。データ受信による文字表示。ができるので、だいぶわかりやすいです。

それでは、よき micro:bit & Node.js Life を!