Raspberry Pi2にBluetoothのドングルを指して、Broadcom WICED SenseとTI SensorTagに同時にBluetooth経由でNodeJSでアクセスする方法について、備忘録で残しておく。
– 現物
右 : Broadcom WICED Sense
左 : TI Sensor Tag
– Broadcom WICED Sense
搭載されているセンサーとしては、加速度、ジャイロ、電子コンパス、気圧、温度、湿度が取れますね。BluetoothはBCM20737S。スイッチサイエンスさん、マクニカオンラインさんとかでゲットできるですね。
– TI Sensor Tag
こちらは、CC2650が搭載された激しめの端末。加速度、ジャイロ、3軸磁力計(というかMPU 9250)、照度、湿度、気圧、磁気、IRサーモパイルセンサといった感じで盛り積み。
– Raspberry PI2上での作業
NodeJSとbluezを入れるだけ。
uname -a # nodejsとbluezのインストール # Linux raspberrypi 4.1.7-v7+ #817 SMP PREEMPT Sat Sep 19 15:32:00 BST 2015 armv7l GNU/Linux # RASPBIAN JESSIEを使っています。 # sudo wget http://node-arm.herokuapp.com/node_latest_armhf.deb sudo dpkg -i node_latest_armhf.deb node -v npm -v sudo apt-get install bluez
– WICED Senseにつなぐ
npm install cylon npm install cylon-ble npm install cylon-wiced-sense
test.js
var Cylon = require('cylon'); // UUIDはhcitool lescanで見れるMacアドレス // 00:10:18:01:4A:FA WICED Sense Kit // こんな感じで Cylon.robot({ connections: { bluetooth: { adaptor: 'ble', uuid: '001018014afa' } }, devices: [ {name : 'wiced', driver: 'wiced-sense' }, ], display: function(err, data) { if (err) { console.log("Error:", err); } else { console.log("Data:", data); } }, work: function(my) { my.wiced.getData(function(err, data) { if (!!err) { console.log("Error: ", err); return; } console.log("Data: ", data); }); } }).start();
結果
sudo node test.js 2015-10-15T07:22:39.092Z : [Robot 1] - Starting connections. 2015-10-15T07:22:39.152Z : [Robot 1] - Starting connection 'bluetooth'. 2015-10-15T07:22:43.960Z : [Robot 1] - Starting devices. 2015-10-15T07:22:43.963Z : [Robot 1] - Starting device 'wiced'. 2015-10-15T07:22:43.963Z : [Robot 1] - Working. Data: { accelerometer: { x: 0, y: 0, z: 89 }, gyroscope: { x: -50, y: -247, z: -222 }, magnetometer: { x: 548, y: 653, z: -1464 } } Data: { accelerometer: { x: 1, y: 0, z: 88 }, gyroscope: { x: 6, y: -249, z: -220 }, magnetometer: { x: 535, y: 656, z: -1463 } } Data: { accelerometer: { x: 0, y: 0, z: 89 }, gyroscope: { x: -19, y: -219, z: -217 }, magnetometer: { x: 553, y: 651, z: -1460 } } Data: { accelerometer: { x: 0, y: 0, z: 88 }, gyroscope: { x: 24, y: -250, z: -208 }, magnetometer: { x: 558, y: 643, z: -1451 } } Data: { accelerometer: { x: 1, y: 0, z: 89 }, gyroscope: { x: 30, y: -243, z: -215 }, magnetometer: { x: 558, y: 648, z: -1448 } } Data: { accelerometer: { x: 0, y: 0, z: 89 }, gyroscope: { x: -11, y: -243, z: -204 }, magnetometer: { x: 565, y: 671, z: -1460 } } Data: { accelerometer: { x: 1, y: 0, z: 90 }, gyroscope: { x: 9, y: -246, z: -225 }, magnetometer: { x: 562, y: 646, z: -1440 } } Data: { accelerometer: { x: 0, y: 0, z: 89 }, gyroscope: { x: 10, y: -227, z: -206 }, magnetometer: { x: 557, y: 651, z: -1462 } } Data: { accelerometer: { x: 0, y: 0, z: 89 }, gyroscope: { x: -12, y: -251, z: -223 }, magnetometer: { x: 556, y: 642, z: -1451 } } Data: { humidity: 701, pressure: 10120, temperature: 285 } Data: { accelerometer: { x: 0, y: 0, z: 89 }, gyroscope: { x: 3, y: -248, z: -196 }, magnetometer: { x: 554, y: 655, z: -1455 } }
– Sensortagにつなぐ
npm install async npm install bluebird npm install sensortag
test.js
var SensorTag = require('sensortag'); // UUIDはhcitool lescanで見れるMacアドレス // 68:C9:0B:06:E4:8D CC2650 SensorTag // こんな感じで SensorTag.discoverByAddress("68:C9:0B:06:E4:8D", function(tag) { tag.on('disconnect', function() { console.log('disconnected!'); process.exit(0); }); function connectAndSetUpMe() { console.log('connectAndSetUp'); tag.connectAndSetUp(enableTempMe); } function enableTempMe() { console.log('enableSensor'); tag.enableHumidity(notifyMe); tag.enableLuxometer(notifyLux); } function notifyLux() { } function notifyMe() { tag.notifyHumidity(listenForHumidity); tag.setHumidityPeriod(10000, function(error) { if (error != null) console.log(error); }); } function listenForHumidity() { tag.on('humidityChange', function(temperature, humidity) { tag.readLuxometer(function(error, lux) { console.log('\tlux = %d', lux.toFixed(1)); console.log('\thumidity Temp = %d deg. C', temperature.toFixed(1)); console.log('\tthumidity = %d', humidity.toFixed(1)); }); }); } connectAndSetUpMe(); });
結果
sudo node test.js connectAndSetUp enableSensor lux = 134185 humidity Temp = 27.2 deg. C thumidity = 64.9 lux = 140.2 humidity Temp = 27.2 deg. C thumidity = 64.9 lux = 140.6 humidity Temp = 27.2 deg. C thumidity = 64.9
めちゃ簡単。