Androidのメモとか

ポキオの日記です。今日も遅延してない。

Raspberry Piからmicro:bitにBLEで接続して加速度センサーの情報を読み取る

スポンサードリンク

とりあえず読むだけ。

ポキオ Raspberry Pi BLE Central noble

前回やってたこと

とりあえず、Raspberry Piからmicro:bitをスキャンしたりしていました。

relativelayout.hatenablog.com

今回は、実際に接続して、データを取得してみます。

とりあえずやってみる

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上で上記コードを実行すると・・・

ポキオ Raspberry Pi BLE Central noble

かなり短い間隔で加速度センサー情報が送られてきます。

今回、micro:bitのLEDマトリックスがある側を上にして測定してましたが、Z軸の加速度が負の値だったので、もしかしたらLEDマトリックスは裏側なのかもしれません。。。

BBC micro:bit(マイクロビット)バルク品 正規品

BBC micro:bit(マイクロビット)バルク品 正規品

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。