enebularとobnizで鏡餅を動かしてみた

# はじめに

2019年11月に行われた[第3回 ビジュアルプログラミング交流会](https://visualprogramming.connpass.com/event/150717/) という enebular と obniz を使ったハンズオンに参加して２つのビジュアルプログラミングを繋げて使う方法を学びました。

また最近はLEGOなどを使って簡単に動くものを作ることができるという事を [ゆるメカトロ](https://www.facebook.com/groups/yurumect/) というグループで知りました。

そこで今回は、これらを組み合わせて何か作ってみようと考えた結果、昨年は [クリスマスツリーを点滅させてみた](https://qiita.com/yskmjp/items/cdcffff84a25584a4418) ので、今年はお正月に向けて鏡餅を動かしてみます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149785/ab2952d6-e4cc-967f-3c76-33cf37c6f5d7.png)


# 使ったもの

- [enebular](https://www.enebular.com/ja/)
- [obniz](https://obniz.io/ja/)
- LEGO Crazy Action Contraptions
- Geek Servo
- モバイルバッテリー
- 100円ショップの鏡餅

LEGOは様々な種類のパーツが販売されていますが、「Crazy Action Contraptions」というテクニカルパーツのセットと、「Geek Servo」というモーターのセットを買う人が多いようなので、私も購入しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149785/9df7f6af-f10c-6a43-3171-e6c6c403b9b8.png)


# モーターを動かす
私が参加したハンズオン資料にモーターを動かす内容が公開されてます。
[obnizハンズオン（ブロックプログラム）](https://qiita.com/wicket/items/794223f85f5e02ed3a72)

ハンズオンではアクリル板を車体にしていますが、今回はLEGOで車体を組んでいます。
Geek ServoのDCモーターはobnizのブロックプログラムやライブラリの「DCMotor」をそのまま使って動かすことができました。サーボモーターについてもobnizのライブラリ「ServoMotor」を使って動かすことができます。

# enebularとつなげる
enebularとobnizをつなげる部分のハンズオン資料は以下になります。
[enebularとobnizをつなげて操作してみる](https://qiita.com/wicket/items/bc7b4fa247edb72003a2)

今回はハンズオンの内容に加えて以下の2つを使っています。
- enebularのダッシュボードからの操作
- サーボモーターで鏡餅を動かす

## enebularのダッシュボードからの操作
obnizは簡単にウェブ上にボタンなどを作って操作ができますが、enebularでもダッシュボードというノードを使って簡単にボタンを作ることができます。

下の水色のノードが今回追加したダッシュボードのノードになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149785/38e99f22-e07f-a472-bb66-ec2a93313543.png)

以下のようにダッシュボード画面からボタンを押して1秒や10秒動かしたり、スライドバーで動かす秒数を決めることができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149785/015df9fd-5917-4ac5-70f3-6d18545fa040.png)

実際に作ったFlowは以下のとおりです。

```
[{"id":"7e1f4921.de6038","type":"inject","z":"f3932e61.b2911","name":"","topic":"","payload":"{\"duration\":1000}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":180,"y":60,"wires":[["4f1866f1.bda6f8","6bda8b28.6da214"]]},{"id":"4f1866f1.bda6f8","type":"debug","z":"f3932e61.b2911","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":538,"y":70,"wires":[]},{"id":"6bda8b28.6da214","type":"websocket out","z":"f3932e61.b2911","name":"","server":"6b499733.914c68","client":"","x":560,"y":180,"wires":[]},{"id":"eabb3700.074828","type":"template","z":"f3932e61.b2911","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{\"duration\": {{payload}} }","output":"str","x":360,"y":220,"wires":[["6bda8b28.6da214"]]},{"id":"5b241924.4bb128","type":"ui_button","z":"f3932e61.b2911","name":"","group":"872da47e.b58c08","order":1,"width":0,"height":0,"passthru":false,"label":"1 sec","tooltip":"","color":"","bgcolor":"","icon":"","payload":"{\"duration\":1000}","payloadType":"json","topic":"","x":150,"y":120,"wires":[["6bda8b28.6da214"]]},{"id":"61063876.eac8b8","type":"ui_button","z":"f3932e61.b2911","name":"","group":"872da47e.b58c08","order":2,"width":0,"height":0,"passthru":false,"label":"10 sec","tooltip":"","color":"","bgcolor":"","icon":"","payload":"{\"duration\":10000}","payloadType":"json","topic":"","x":150,"y":160,"wires":[["6bda8b28.6da214"]]},{"id":"63f4a4b0.c73f6c","type":"ui_slider","z":"f3932e61.b2911","name":"","label":"slider","tooltip":"","group":"872da47e.b58c08","order":4,"width":0,"height":0,"passthru":true,"outs":"end","topic":"","min":0,"max":"1000","step":1,"x":150,"y":220,"wires":[["eabb3700.074828"]]},{"id":"6b499733.914c68","type":"websocket-listener","z":"","path":"/ws","wholemsg":"false"},{"id":"872da47e.b58c08","type":"ui_group","z":0,"name":"鏡餅カー操作","tab":"49db2715.892e08","disp":true,"width":"6","collapse":false},{"id":"49db2715.892e08","type":"ui_tab","z":0,"name":"ホーム","icon":"dashboard","disabled":false,"hidden":false}]
```


## サーボモーターの制御
ハンズオンの資料にあったDCモーター以外にサーボモーターを追加しています。
モーター周りのコードは以下の通りで、動いている間に鏡餅が動くようにしました。

```
        dm1 = obniz.wired("DCMotor",{forward:0, back:1});
        dm2 = obniz.wired("DCMotor",{forward:3, back:2});
        sm1 = obniz.wired("ServoMotor",{vcc:5, gnd:6, signal:4});
        ang1 = 90;
        ang2 = 0;
        while (true) {
          await ObnizUI.Util.wait(0);
          if (button.isTouching()) {
            dm2.move(true);
            dm1.move(true);
            if(ang1==180){
              ang2 = 1
            }
            if(ang1 == 0){
              ang2 = 0
            }

            if(ang2 == 0){
              sm1.angle(++ang1);
            }else{
              sm1.angle(--ang1);
            }
          } else {
            dm1.stop();
            dm2.stop();
          }
        }
```


# できたもの
実際に動かした様子を動画にしてあるので御覧ください。
![IMB_PFYmrB.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149785/64d95fb2-e6ff-fa2d-c1e5-6fcb6a48c560.gif)


Youtube の動画はこちら [enebularとobnizで鏡餅を動かしてみた](https://youtu.be/Gb0uk-JvPPc)

# 終わりに
enebularのようなビジュアルプログラミングツールで簡単にプログラムが作れるのに加えて、動くモノ自体を簡単に作ることができるLEGOはとても相性がいいツールだと感じました。
これからも楽しくいろいろなものを作っていこうと思います！