obnizのフォーラムは新しいシステムに移行しております。

新しいフォーラムはこちらになります

BLEセントラルでreadWaitをペリフェラルからのNotifyタイミングでひろいたい



  • micro:bitの加速度センサーのBLEペリフェラルサービスからデータを受け取るために、下記のBLEセントラルのコードを書きました。関連質問2点です。
    ①現在readWaitをrepeatにしていますが、これをNotifyをうけてイベント関数でひろうようにする方法を教えて下さい。
    ②micro:bitからdataArrayに2Byte×3(X/Y/Z)の計6つの配列にデータが返されているようなのですが、これをx/y/zの3つの変数に分解して取り出す方法を教えて下さい。

    ■obniz BLEセントラルのコード
    var target = { localName: "BBC micro:bit [pevov]" }
    var SID = "E95D0753251D470AA062FA1922DFA9A8";
    var CID = "E95DCA4B251D470AA062FA1922DFA9A8";
    obniz.onconnect = async function () {

    var peripheral = await obniz.ble.scan.startOneWait(target);
    var connected = await peripheral.connectWait();
    if ( connected ) {
    obniz.repeat( async function(){
    var dataArray = await peripheral.getService(SID).getCharacteristic(CID).readWait();
    obniz.display.clear();obniz.display.print("y:"+dataArray[2]);
    },500)
    }else{
    obniz.display.clear();obniz.display.print("cannnot connected");
    }

    }



  • お忙しい所すみません、これお願いします。



  • @Google-Homer さん

    notifyを拾うためには、2つ設定を行う必要があります。

    1. 特定ディスクリプタ(2902)へnotifyを受取りたいと設定する。
    2. notifyを受け取ったときに動かす関数を設定する

    具体的にはif ( connected ) { ... }の中で下記のように書くことができます。

      // 1. 特定ディスクリプタ(2902)へnotifyを受取りたいと設定する。
      let char = peripheral.getService(SID).getCharacteristic(CID);
      let cccd = char.getDescriptor("2902");
      let result = await cccd.writeWait([0x00, 0x01]); 
    
     //2. notifyを受け取ったときに動かす関数を設定する
      char.registerNotify( function(){
        console.log("notify");
      });
    


  • こちらもお願いします。
    ②micro:bitからdataArrayに2Byte×3(X/Y/Z)の計6つの配列にデータが返されているようなのですが、これをx/y/zの3つの変数に分解して取り出す方法を教えて下さい。



  • @Google-Homer さん

    data = [x1, x2, y1, y2, z1, z2]のようになっているということかと思います。

    xとx1,x2の関係はmicrobit側の仕様で把握できていませんが、
    大抵はx = x1 * 256 + x2 もしくはx = x2 * 256 + x1 の関係になっていることが多いです。
    その場合、x = data[0] * 256 + data[1] とすれば、xの値を出すことができます。

    正確なxとx1,x2の関係については、micro:bitの仕様を確認いただければと思います。



  • ありがとうございました。



  • 「XYZの順に各sint16、リトルエンディアンで格納 1000で割ると単位Gになる」
    という仕様だそうです。
    どんなコードを書けばよいか教えて下さい。



  • こちら、お願いします。



  • @Google-Homer さん

    リトルエイディアンですと、x = x2 * 256 + x1になりますので下記のとおりです。

    var x = (data[1] * 256) + data[0];
    

    ただし、今回はマイナスの範囲もあるようなので、その時の処理も追加する必要があります。

    var x = (data[1] * 256) + data[0];
    if(x & 0x8000){ // マイナスのときの処理
        x = -((x - 1) ^ 0xffff);    //2の補数計算
    }
    


  • ありがとうございました、動作確認できました。



SUGGESTED TOPICS