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");
}}
-
お忙しい所すみません、これお願いします。
-
notifyを拾うためには、2つ設定を行う必要があります。
- 特定ディスクリプタ(2902)へnotifyを受取りたいと設定する。
- 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つの変数に分解して取り出す方法を教えて下さい。
-
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になる」
という仕様だそうです。
どんなコードを書けばよいか教えて下さい。
-
こちら、お願いします。
-
リトルエイディアンですと、
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の補数計算 }
-
ありがとうございました、動作確認できました。