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 を!