obniz+スマホの加速度センサーでラジコン

スマートフォンの加速度センサーを使って、ラジコンを動かします。

obnizはスマートフォンのセンサーとの連携も簡単で、気軽に高性能なセンサーを使えます。

加速度を取得するのも3行でできます。

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

用意するもの

  • obniz x1
  • obnizの電源 x1
  • 加速度センサーつきのスマートフォン x1
  • DCモーター x2
  • タイヤ x2
  • ダンボールなどの工作道具

手順

DCモーターがついたタイヤ2つで動くラジコンカーを想定しています。

以下の表や図のように配線します。DCモーター取り付ける向きによってタイヤの回転方向が変わるため、適宜調整してください。

obniz DCモーター
0 左側のDCモーター OUT1
1 左側のDCモーター OUT2
2 右側のDCモーター OUT1
3 右側のDCモーター OUT2

DCモーターにタイヤを取り付け、ダンボール等の工作道具でラジコンの車体を作ります。 obnizやobnizの電源用バッテリーを固定できるように作ると良いでしょう。

最後にobnizに電源を繋げてプログラムを実行すると、スマートフォンの傾きに応じてDCモーターが周り、ラジコンが動きます。

プログラム

<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@2.0.2/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("OBNIZ_ID_HERE");
  let motorL, motorR;
  let threshold = 1, maxAccel = 5;

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

  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>

関連記事