JavaScript
iPhone
電子工作
おうちハック
obniz

スマホを最高級電子部品として電子工作に組み込む(加速度編)

前回,スマホを最高級電子部品として電子工作に組み込むで,OpenCVを使ってサーボモータを動かすのを書きました.
好評だったので,今度はスマホの加速度を使ってみたいと思います.

加速度モジュールではなくスマホで加速度を取る利点

  • キャリブレーションがいらない
  • 無線なので,電子回路から離れた場所の加速度を取ることができる
  • 精度が段違い
  • サンプリング数も段違い

どうやってスマホの加速度を使うか については,前回と同じくobnizを使って,HTML経由で加速度を取ります.

詳細はこちらの公式サイトを見てください
obniz.io

作ったもの

せっかくなので,上記の利点を最大限活用できるものがいいですよね.
リモートで加速度を使うもの・・・そうだ,ラジコンにしよう! 

というわけで,iPhoneの加速度をインプットにしたラジコンを作りました.
これを作るのに書いたコードがたったの1時間/60行程度で作れちゃいました
(OpenCVよりよっぽど簡単でした)

材料

IMG_0020.JPG

作り方

ハードウェア

回路は回路図がいらないぐらい,ただただシンプルにモータとobnizをつなげるだけです

本体は簡単にダンボール工作で作りました.
ハサミで切れ目を入れて挟むだけの簡単工作です

タイヤを両面テープでくっつけるとこうなります.
IMG_4911.JPG

obnizがだらんとしているのが嫌だったので,obnizを挟む切れ目も入れて挟んでいます
モバイルバッテリーはお好きなところにおいてください

ソフトウェア

まずいちばん大事な,加速度を取るところですが,たった3行でできます.
カメラのときとは段違いですね

window.addEventListener("devicemotion", function (event1) {
    let x = event1.accelerationIncludingGravity.x;
}

これで加速度が変化したときに,関数が呼ばれて加速度の値を取得できます.

それに応じてモーターを動かすのがこちら

motorL = obniz.wired("DCMotor", {forward: 0, back: 1});
motorL.power(100)
motorL.move(true);

obnizのどのピンにモーターがつながっているか設定して,あとはpowerとmove関数で,速度と方向を指定したら動きます.

あとは,X軸Y軸の加速度に応じてパワーと方向を変えるだけです.
今回はiPhoneを前後に傾けると前進・後退,左右に傾けたら回転をするようにしました.

HTML全体はこうなります

<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
  <script src="https://unpkg.com/obniz@1.3.0/obniz.js" crossorigin="anonymous"></script>
</head>
<body>

<div id="obniz-debug"></div>
<h1>obniz robot controller </h1>
<div id="print"></div>

<script>

  let obniz = new Obniz("2580-0064");
  let motorL, motorR;
  let threshold = 1, maxAccel = 5;

  obniz.onconnect = function () {
    motorL = obniz.wired("DCMotor", {forward: 0, back: 1});
    motorR = obniz.wired("DCMotor", {forward: 10, back: 11});
  };

  window.addEventListener("devicemotion", function (event1) {
    let x = event1.accelerationIncludingGravity.x;
    let y = event1.accelerationIncludingGravity.y;

    if (!motorR || !motorL) {
      return;
    }
    if (Math.abs(y) > threshold) {
      let power = Math.min(100 * (Math.abs(y) - threshold) / (maxAccel - threshold), 100);
      motorL.power(power);
      motorR.power(power);

      let direction = y > 0;
      motorL.move(direction);
      motorR.move(direction);


    } else if (Math.abs(x) > threshold) {
      let power = Math.min(100 * (Math.abs(x) - threshold) / (maxAccel - threshold), 100);
      if (x > 0) {
        motorR.power(power);
        motorR.move(true);
        motorL.stop();
      } else {
        motorL.power(power);
        motorL.move(true);
        motorR.stop();
      }
    } else {
      motorL.stop();
      motorR.stop();

    }

  }, true);

</script>
</body>
</html>

完成!

OpenCVよりもだいぶ簡単に作ることができました

前回の顔検出と合わせたら,人を追っかけるロボットなんてのも簡単に作れそうです.
音声認識もjsでできるので,「いけ!」って声をかけたら前進とかも作れそうですね!