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

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ソースコードは以下のとおりです。
- Getting started · noble/noble Wiki
- Buffer | Node.js v9.5.0 Documentation
- noble/central.js at master · 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を実行します。

無事接続までされました。micro:bitではどうなっているでしょうか。
無事文字が送られました!WOMBAT!と出ます。
Bufferに文字を入れるだけで送れたので、めちゃくちゃ手軽ですね。
まとめ
これにより、Node.js nobleで、LED Matrixにより文字の出力と、ボタン操作の検知が行えたので、入出力の感覚がつかめたということになります。
LED Matrixにより文字の出力によって、外部からのデータ表示ができるので表現力に幅が出ます。また、ボタン操作の検知よって、データ取得、つまり加速度や温度センサーの値を取るイメージもできます。
文字の出力は、5 x 5のマス目ながらも、これくらいでかなり表現が色々できそうなので、ドット絵を打つ間隔で、視覚伝達につなげられそうに思えました。現在の状況でも、接続・切断。データ受信による文字表示。ができるので、だいぶわかりやすいです。
それでは、よき micro:bit & Node.js Life を!