Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

前回,スマホを最高級電子部品として電子工作に組み込むで,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でできるので,「いけ!」って声をかけたら前進とかも作れそうですね!

iotlt
IoT縛りの勉強会です。 毎月イベントを実施しているので是非遊びに来てください! 登壇者を中心にQiitaでも情報発信していきます。 https://iotlt.connpass.com
https://iotlt.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away