obniz から MESH の動き(Move)ブロックの Y 軸に振られた強さを検知するメモ

obniz から MESH の動き(Move)ブロックの Y 軸に振られた強さを検知するメモです。

MESH アプリのように振られた強さによって動作を変えたい

この動き(Move)ブロックは、そのままでも内蔵の判定で「振られた」が取れます。

加速度センサー振る動作とか自前でつくれなくはないですが、つくるのは大変なので、それを内蔵でやってくれるのはめっちゃいいのですが、ちょっと振られただけでも反応しちゃうんです。これをなんとかしたい。

image

このように MESH アプリのように振られた強さによって動作を変えたいのでやってみます。

振るときの持ち方

動きブロック (MESH-100AC) – MESH 技術ドキュメント にあるように、振られたときに、加速度センサーの値が取れます。

image

こちらの上面が上に向いている状態を基準にします。

手で持ったときに上面を上にしてから振ります。

縦に振って反応する軸を確認 → Y軸だった

こちらののプログラムで、振られた方向の加速度の値を見れるようにして振ってみます。

<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
    <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
    <script src="https://unpkg.com/obniz@3.24.0/obniz.js" crossorigin="anonymous"></script>
  </head>
  <body>
    <h1>MESH Move</h1>
    
    <script>

      // 今回の obniz を指示するための設定
      const obniz = new Obniz("OBNIZ_ID_HERE");

      // 接続後、MESH と接続
      obniz.onconnect = async function () {
        obniz.display.clear();
        obniz.display.print("[MESH Move]");

        const MESH_100AC = Obniz.getPartsClass('MESH_100AC');

        // BLE の初期化待ちコードを加えます
        await obniz.ble.initWait();

        obniz.ble.scan.onfind = async (peripheral) => {

          if (!MESH_100AC.isMESHblock(peripheral)) {
            return;
          }
          console.log('found');
          obniz.display.print("found");

          // Create an instance
          const moveBlock = new MESH_100AC(peripheral);

          // Connect to the Move block
          await moveBlock.connectWait();
          console.log(`connected: ${moveBlock.peripheral.localName}`);
          obniz.display.print("connected");

          // Shake Event
          moveBlock.onShaked = (accele) => {
            console.log('shaked! (ax, ay, az) = (' + accele.x + ', ' + accele.y + ',' + accele.z + ')');
          };

        };

        // スキャンの開始待ちのコードを加えます
        await obniz.ble.scan.startWait();
      }
      
    </script>
  </body>

上下に振ってみると Y軸の値が強く反応しました。

image

これで縦に振った時に今回狙う加速度の軸が分かりました。

縦に強く振られたらを検知

image

振られたときの加速度センサーの強さは、-2 ~ +1.999 の値で来るようです。

ということで、何度か振って値を確認した結果「強く振られた」を 1.8 以上、-1.8 以下で判定します。

<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
    <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
    <script src="https://unpkg.com/obniz@3.24.0/obniz.js" crossorigin="anonymous"></script>
  </head>
  <body>
    <h1>MESH Move</h1>
    
    <script>

      // 今回の obniz を指示するための設定
      const obniz = new Obniz("OBNIZ_ID_HERE");

      // 接続後、MESH と接続
      obniz.onconnect = async function () {
        obniz.display.clear();
        obniz.display.print("[MESH Move]");

        const MESH_100AC = Obniz.getPartsClass('MESH_100AC');

        // BLE の初期化待ちコードを加えます
        await obniz.ble.initWait();

        obniz.ble.scan.onfind = async (peripheral) => {

          if (!MESH_100AC.isMESHblock(peripheral)) {
            return;
          }
          console.log('found');
          obniz.display.print("found");

          // Create an instance
          const moveBlock = new MESH_100AC(peripheral);

          // Connect to the Move block
          await moveBlock.connectWait();
          console.log(`connected: ${moveBlock.peripheral.localName}`);
          obniz.display.print("connected");

          // Shake Event
          moveBlock.onShaked = (accele) => {
            console.log('shaked! (ax, ay, az) = (' + accele.x + ', ' + accele.y + ',' + accele.z + ')');
            const powerY = accele.y;
            if( powerY > 1.8 ){
              console.log('強く振られたよ! powerY > 1.8');
            } else if( powerY < -1.8 ){
              console.log('強く振られたよ! powerY < -1.8');
            }
          };

        };

        // スキャンの開始待ちのコードを加えます
        await obniz.ble.scan.startWait();
      }
      
    </script>
  </body>

このようにコードを書きました。

image

動かしてみたところ、そーっと弱く上下に動かした場合は反応せず、強く振った時に反応することができました。 1.8 のしきい値は、色々試してみて調整すると良さそうです。

ちなみに、何もしきい値を設定しない時の通常の「振った」判定では、X か Y か Z の軸で加速度が 1.0 以上、-1.0 以下の時に反応しているようです。それ以外の値で降りてくることがなかったので、そのように解釈してます。これだと確かに敏感に反応しすぎなので、このように調整できると、いろいろなシーンで使えそうです。