とりあえず読むだけ。
前回やってたこと
とりあえず、Raspberry Piからmicro:bitをスキャンしたりしていました。
今回は、実際に接続して、データを取得してみます。
とりあえずやってみる
startScanning()
で見つかったペリフェラルに対して以下の処理をします。
- 所望のサービス(今回は加速度センサーサービス)を探す
- そのサービスの所望のキャラクタリスティック(今回は加速度センサーの通知)を探す
- そのキャラクタリスティックに対してRead/Writeや通知の設定などをする
こんな感じです。加速度センサーのサービスのUUIDはe95d0753251d470aa062fa1922dfa9a8
、加速度の変化があるたびに情報を通知してくれるキャラクタリスティックはe95dca4b251d470aa062fa1922dfa9a8
なので、これを探してみます。
var noble = require('noble') function scanPeripheral() { noble.on('discover', peripheral => { var localName = peripheral.advertisement.localName if (localName && localName.startsWith('BBC micro:bit')) { console.log(peripheral) noble.stopScanning() setTimeout(() => { connectPeripheral(peripheral) }, 500) // wait 500msec to avoid disconnection. } }) noble.startScanning() } function connectPeripheral(peripheral) { peripheral.on('connect', () => { console.log('connected') peripheral.discoverServices() }) peripheral.on('disconnect', () => { console.log('disconnected') process.exit(1) }) peripheral.on('servicesDiscover', services => { console.log(services) services.forEach(service => { if (service.uuid && service.uuid === 'e95d0753251d470aa062fa1922dfa9a8') { searchCharacteristic(service) } }); }) peripheral.connect() } function searchCharacteristic(service) { service.on('characteristicsDiscover', characteristics => { console.log(characteristics) characteristics.forEach(characteristic => { if (characteristic.uuid && characteristic.uuid === 'e95dca4b251d470aa062fa1922dfa9a8') { subscribeChatacteristic(characteristic) } }) }) service.discoverCharacteristics() } function subscribeChatacteristic(characteristic) { characteristic.on('data', (data, isNotification) => { console.log('x : ' + data.readInt16LE(0) + ' / y : ' + data.readInt16LE(2) + ' / z : ' + data.readInt16LE(4)) }) characteristic.subscribe() } scanPeripheral()
今回ハマったのは、
- スキャンで発見から接続までを間髪をいれずに処理してしまうと、なぜか切断してしまうケースがあったので、不本意ながらSleepを入れています。
- micro:bitから通知される情報はバイト列のBufferで来るが、X/Y/Z軸の情報がInt16でそれぞれ詰まってるので変換する必要がある。
このあたりでした。
いざ実行
Node.js上で上記コードを実行すると・・・
かなり短い間隔で加速度センサー情報が送られてきます。
今回、micro:bitのLEDマトリックスがある側を上にして測定してましたが、Z軸の加速度が負の値だったので、もしかしたらLEDマトリックスは裏側なのかもしれません。。。