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

obnizとLEGOとGeekServoでクリスマスツリーを回して光らせて得た知見

この記事は IoTLT Advent Calendar 2019 の7日目の記事です。

はじめに

このような仕組みができていたんですが、やはりもっとしっかりしたクリスマスツリーを回して光らせてみたくなりました。

このように、回して光らせることが出来ました。

クリスマスツリーを買ってきた

2019-12-05_21h00_23.jpg

DAISOで買ったクリスマスツリー(ミニ)です。

2019-12-05_21h16_30.jpg

こんな感じ。

2019-12-05_21h23_21.jpg

ひとまず分解します。

2019-12-05_21h26_16.jpg

キリで裏側から穴を開けます。

2019-12-05_21h27_06.jpg

ぶっすーっと。

LEGOにくっつける

2019-12-05_21h27_40.jpg

LEGOとくっつけるためにDAISOおゆぷらを使います。色はクリスマスカラーの赤!

これは、ゆるメカトロ というゆるくメカトロニクスで楽しむグループで新井さんから伺った知見です。

2019-12-05_21h28_54.jpg

お湯で温めて柔らかくします。

2019-12-05_21h29_45.jpg

柔らかくするぞー!

2019-12-05_21h31_49.png

ジャボン。

2019-12-05_21h31_49.jpg

くんにゃりしてきました。

2019-12-05_21h32_56.jpg

キリで穴を開けても穴が小さく実装がしにくいので、もうちょっと掘ります。

2019-12-05_21h34_24.jpg

うまく空けれました。

2019-12-05_21h35_33.jpg

おゆプラ1本だけだと量が足りなかったので、2本・3本追加しました。まずは、LEGOのテクニックの軸を結びつけます。

2019-12-05_21h37_23.jpg

さきほどの、おゆプラましましさせて、ツリーを差し込みました。

2019-12-05_21h39_08.jpg

良い感じに、つながりました!

2019-12-05_21h42_22.jpg

先ほどのものに置き換えてみます!

obnizのソースコード

obnizのソースコードです。1つのプログラムで、回すobnizと光らせるobnizを同時に動かします。

<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">
  <link rel="stylesheet" href="/css/starter-sample.css">
  <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
  <script src="https://unpkg.com/obniz@2.4.0/obniz.js" crossorigin="anonymous"></script>
</head>
<body>

<div class="wrap">

  <div class="DCMotor">
    <h3 class="text-center">Controling on Chritsmas Tree!</h3>
  </div>

  <div class="DCMotor">
    <button class="btn btn-primary btn-block" id="forward">Forward</button>
    <button class="btn btn-primary btn-block" id="reverse">Reverse</button>
    <button class="btn btn-primary btn-block" id="rightroll">RightRoll</button>
    <button class="btn btn-primary btn-block" id="leftroll">LeftRoll</button>
    <button class="btn btn-success btn-block " id="powerup">Power 100</button>
    <button class="btn btn-success btn-block" id="powerdown">Power 30</button>
    <button class="btn btn-secondary btn-block" id="stop">Stop</button>
  </div>

</div>

<script>
  var obniz = new Obniz("MY_OBNIZ_1");
  var obniz2 = new Obniz("MY_OBNIZ_2");

  var timerID;
  var leds;

  obniz2.onconnect = async function () {

    obniz2.display.clear();
    obniz2.display.print("Hello LEDTape!!!");

    leds = obniz2.wired("WS2812B", {gnd:2, vcc: 0, din: 1});

    // Start
    var colors = [
      [255, 0, 0],
      [0, 255, 0],
      [0, 0, 255],
      [255, 0, 0],
      [0, 255, 0],
      [0, 0, 255],
      [255, 0, 0],
      [0, 255, 0],
      [0, 0, 255],
      [255, 0, 0],
      [0, 255, 0],
      [0, 0, 255],
      [255, 0, 0],
      [0, 255, 0],
      [0, 0, 255]
    ];

    leds.rgbs(colors);
  }


  obniz.onconnect = async function () {

    var motor = obniz.wired("DCMotor", {forward:0, back:1});

    obniz.display.clear();
    obniz.display.print("Hello World");

    $('#forward').click(function () {
      motor.forward();
      obniz.display.clear();
      obniz.display.print("forward");

    });

    $('#reverse').click(function () {
      motor.reverse();
      obniz.display.clear();
      obniz.display.print("reverse");
    });

    $('#powerup').click(function () {
      motor.power(100);
      obniz.display.clear();
      obniz.display.print("powerup");

      clearInterval(timerID);
      timerID = setInterval(async function(){
        // ランダム色変更 100ms だけどそれほど速くはない、処理が少し貯まる
        colors = [];
        for(var i = 0; i < 15; i++){
          colors.push([
            Math.floor(Math.floor(Math.random() * 2) * 255),  // R
            Math.floor(Math.floor(Math.random() * 2) * 255),  // G
            Math.floor(Math.floor(Math.random() * 2) * 255)   // B
          ])
        }
        leds.rgbs(colors);
      },100);

    });

    $('#powerdown').click(function () {
      motor.power(30);
      obniz.display.clear();
      obniz.display.print("powerdown");

      clearInterval(timerID);
      timerID = setInterval(async function(){
        // ランダム色変更 2秒くらい 速度を戻すとき
        colors = [];
        for(var i = 0; i < 15; i++){
          colors.push([
            Math.floor(Math.floor(Math.random() * 25) * 10),  // R
            Math.floor(Math.floor(Math.random() * 25) * 10),  // G
            Math.floor(Math.floor(Math.random() * 25) * 10)   // B
          ])
        }
        leds.rgbs(colors);
      },2000);
    });

    $('#stop').click(function () {
      motor.stop();
      obniz.display.clear();
      obniz.display.print("stop");
    });

    timerID = setInterval(async function(){
      // ランダム色変更 2秒くらい 初動
      colors = [];
      for(var i = 0; i < 15; i++){
        colors.push([
          Math.floor(Math.floor(Math.random() * 25) * 10),  // R
          Math.floor(Math.floor(Math.random() * 25) * 10),  // G
          Math.floor(Math.floor(Math.random() * 25) * 10)   // B
        ])
      }
      leds.rgbs(colors);
    },2000);

  };


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

動かしたものがこちらです。

学んだ知見「回転物で光らせるときは一緒に載せる」

そういえば、うっかり床にバッテリーを置いたまま動かすと、そのまま一緒に回転してしまいますね。

これは一緒に載せる形で解決しました。バッテリーの固定には、ツリーに飾り用のヒモがついてて、かつプラスチックの器がついていてよかったです。

まとめ

ということで「クリスマスツリーを回して光らせたい!」という気持ちで作ってみたところ、手を動かしてみていろいろな学びがありました。

  • おゆプラ
    • こういうときにLEGOと他の物体の固定に便利だった
  • 回転物で光らせるときには一緒に載せる
    • もっというと、床にバッテリーを置いたまま、コードが絡まず回るスマート方法が思いつかない
  • obniz
    • 2つのobnizを同時に動かすのもラクラク

特に「回転物で光らせるときには一緒に載せる」については、一度やってみると身にしみて分かるんですが、最初ビックリしますね。

最後に、暗い部屋で動かしたバージョンもお伝えしておきます!

明日は

wamisnetさんです!

littleBits
littleBitsに知り、littleBitsが好きになった人たちが交流し、littleBitsのいろいろな楽しみ方や活かし方を共有していくユーザーグループです。
https://www.facebook.com/groups/littlebitsugjp/
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