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

前回，[スマホを最高級電子部品として電子工作に組み込む](https://qiita.com/wicket/items/a45cf72e64fc346f4fe2)で，OpenCVを使ってサーボモータを動かすのを書きました．
好評だったので，今度はスマホの加速度を使ってみたいと思います．

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

- **<font color="Red">キャリブレーションがいらない</font>**
- 無線なので，電子回路から離れた場所の加速度を取ることができる
- 精度が段違い
- サンプリング数も段違い

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

詳細はこちらの公式サイトを見てください
[obniz.io](https://obniz.io)


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

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


<img src="https://qiita-image-store.s3.amazonaws.com/0/227015/1d5597c9-c137-ab58-31d1-200d86811fa1.gif" width=100%>


##材料
![IMG_0020.JPG](https://qiita-image-store.s3.amazonaws.com/0/227015/f4f2fc67-9d2f-f3e1-46cd-a18786c1ce5a.jpeg)

- iPhone
- [obniz](obniz.io)
- [モーター＋タイヤ](https://www.amazon.co.jp/HiLetgo®-2個セット-スマートかーロボットプラスチックタイヤホイールDC-3-6Vギアモーターと付属-ロボット65/dp/B01HTC5C86) * 2
- ダンボールの切れ端
- モバイルバッテリー


##作り方
###ハードウェア
回路は回路図がいらないぐらい，ただただシンプルにモータとobnizをつなげるだけです

<img src="https://qiita-image-store.s3.amazonaws.com/0/227015/9c2b09ec-d232-8f36-cbe6-27df35f32d51.jpeg" width=50%>

本体は簡単にダンボール工作で作りました．
ハサミで切れ目を入れて挟むだけの簡単工作です
<img src="https://qiita-image-store.s3.amazonaws.com/0/227015/c6215bac-b006-a618-9a31-f6f912ee0396.jpeg" width=50%>
<img src="https://qiita-image-store.s3.amazonaws.com/0/227015/b8ee727d-fb8f-17a4-cf54-efbb2ae5af5d.jpeg" width=50%>

タイヤを両面テープでくっつけるとこうなります．
![IMG_4911.JPG](https://qiita-image-store.s3.amazonaws.com/0/227015/677c0580-777d-8ecd-c529-bf7765191f5b.jpeg)


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

###ソフトウェア
まずいちばん大事な，加速度を取るところですが，たった３行でできます．
カメラのときとは段違いですね

```javascript
window.addEventListener("devicemotion", function (event1) {
    let x = event1.accelerationIncludingGravity.x;
}
```
これで加速度が変化したときに，関数が呼ばれて加速度の値を取得できます．

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

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

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


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

HTML全体はこうなります

```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よりもだいぶ簡単に作ることができました

<img src="https://qiita-image-store.s3.amazonaws.com/0/227015/1d5597c9-c137-ab58-31d1-200d86811fa1.gif" width=100%>


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