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");
    }

    }



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


  • administrators

    @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つの変数に分解して取り出す方法を教えて下さい。


  • administrators

    @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になる」
    という仕様だそうです。
    どんなコードを書けばよいか教えて下さい。



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


  • administrators

    @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の補数計算
    }
    


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


 

Recent Projects

  • @nak435 かしこまりました。よろしくお願いします。

    read more
  • @Yuki-Sato さん、

    外部の3.3vを使うとはいえ普通にvccやgndを供給して問題なくうごくのであれば、弊社での動作確認後Flick Hatのライブラリとして公開できればと思っているのですがいかがでしょう。

    今週末に確認しますので、お待ちください。

    read more
  • @nak435 時間がかかってすいません、

    なんとか3.3vをgndにつないでFlick Largeを動かしたかったのですが、うまく動かすことができなかったです。
    3.3vをgndを繋がずに接続するというのはライブラリで推奨して伝えることは難しいと思ってます。

    Flick LargeでなくFlick Hatの方で、外部の3.3vを使うとはいえ普通にvccやgndを供給して問題なくうごくのであれば、弊社での動作確認後Flick Hatのライブラリとして公開できればと思っているのですがいかがでしょう。

    よろしくお願い致します。

    read more
  • @nak435 ありがとうございます。
    接続は3.3vのgnd以外同じでした。
    エラーはそのせいかもしれませんが、しかし電気的にはgndを繋がない場合3.3vとしてうまく供給できないはずなのでそこが不思議です。

    教えていただいたプログラムの部分を修正して試してみたいと思います。
    また少し時間がかかりそうなのですが、早めに試したいと思います。

    引き続きよろしくお願い致します。

    read more