
新ファーム機能!EdisonでBLE機器を制御してみた(2)
前回までのBLEシリーズでは、Edisonを使用して探せるキーホルダーのバッテリー残量の取得や、バイブの鳴動を行いました。今回はiPhoneアプリと同じように、Edisonと探せるキーホルダーの距離によってLEDをつけたり消したりしてみたいと思います。
EdisonのIO制御
EdisonのLEDを制御するために、mraaというライブラリをインストールします。mraaライブラリは、Intelから提供されているEdisonのIO制御を行うためのライブラリです。mraaライブラリを使うことで、様々なプログラミング言語から簡単にIO制御を行うことができます。
mraaライブラリのインストール
下記の手順でEdisonにmraaライブラリをインストールします。
1. /etc/opkg/mraa-upm.conf というファイルを作成し、ファイル内にインストール元アドレスを記載する
echo “src mraa-upm http://iotdk.intel.com/repos/1.1/intelgalactic” > /etc/opkg/mraa-upm.conf |
2. パッケージマネージャopkgを使用してmraaをインストールする
opkg update opkg install libmraa0 |
探せるキーホルダーの制御
前回までに行ったBLE機器制御の仕組みと、mraaによるEdisonのIO制御を使用して、実際にiPhoneアプリで提供されているような、Edisonと探せるキーホルダーの距離によってLEDをつけたり消したりするプログラムを作成したいと思います。
プログラム
今回作成したのは、Edisonに挿した3つのLEDを、探せるキーホルダーとの距離によって順番に光らせるプログラムです。2番ピンLEDが常に光った状態で、距離が近づくにつれて、7番ピンLED、8番ピンLED、12番ピンLEDの順に光っていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
var noble = require('./index'); console.log('noble'); var mraa = require('mraa'); console.log('mraa ' + mraa.getVersion()); var ledImmediate = new mraa.Gpio(12); ledImmediate.dir(mraa.DIR_OUT); ledImmediate.write(0); //12番ピンLEDはデフォルトで消灯させておく var ledNear = new mraa.Gpio(8); ledNear.dir(mraa.DIR_OUT); ledNear.write(0); //8番ピンLEDはデフォルトで消灯させておく var ledFar = new mraa.Gpio(7); ledFar.dir(mraa.DIR_OUT); ledFar.write(0); //7番ピンLEDはデフォルトで消灯させておく var ledOn = new mraa.Gpio(2); ledOn.dir(mraa.DIR_OUT); ledOn.write(1); //2番ピンLEDはデフォルトで光らせておく 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'); }); noble.on('discover', function(peripheral) { console.log('on -> discover: ' + peripheral); noble.stopScanning(); peripheral.on('rssiUpdate', function(rssi) { console.log('// RSSI update: ' + rssi + ' (' + peripheral.advertisement.localName + ')'); if(rssi > -30) { //電波強度が-30dBmより強い場合、全てのLEDを光らせる ledImmediate.write(1); ledNear.write(1); ledFar.write(1); } else if(rssi > -40) { //電波強度が-40dBmより強い場合、8番・12番ピンLEDを光らせる ledImmediate.write(0); ledNear.write(1); ledFar.write(1); } else if(rssi > -50) { //電波強度が-50dBmより強い場合、12番ピンLEDを光らせる ledImmediate.write(0); ledNear.write(0); ledFar.write(1); } else { //電波強度が-50dBmより弱い場合、2番ピンLED以外を消灯させる ledImmediate.write(0); ledNear.write(0); ledFar.write(0); }); peripheral.on('connect', function() { console.log('on -> connect'); setInterval(function(){ peripheral.updateRssi(); }, 1000); }); peripheral.on('disconnect', function() { console.log('on -> disconnect'); }); peripheral.connect(); }); |
実際に動かしてみた
作成したプログラムを実際に動かしてみます。
まず、探せるキーホルダーを遠くに置くと…
光っているのは2番ピンLEDのみで、その他のLEDは光りません。探せるキーホルダーを近づけると…
LEDの2つ目が光りました!さらに近づけると…
LEDの3つ目が光りました!!さらにさらに近づけると…
全てのLEDが光りました!!!
最後に、アニメーションで動く様子を見てください!!!
次回は…
EdisonのBLEシリーズはこれにて終了です。次回は…お楽しみに!!