yoshiaki110のアイコン画像
yoshiaki110 2021年04月14日作成 (2021年05月07日更新)
製作品 製作品 閲覧数 1607
yoshiaki110 2021年04月14日作成 (2021年05月07日更新) 製作品 製作品 閲覧数 1607

遠隔お酌 for obniz

  • obniz
  • obniz IoT コンテスト 2021
遠隔お酌 for obniz

概要

オンライン飲み会で使える、面白アイテムです。
センサ付きのM5StickCをコントローラーとして、お酌する動作をすると、
リモートにある、obnizに繋がった、装置が傾き、お酒を注ぎます。

デモ動画

ここに動画が表示されます

https://youtu.be/Wr2BMYqvxvU

システム概要

obnizとM5StickCを使用します。
1つのhtml/JavaScriptで、obnizとM5StickC双方コントロールします。
M5StickCの加速度センサで傾きの角度を検知し、obnizに繋がれているサーボを同じ角度で傾けます。

構成図

キャプションを入力できます

材料

下記の部品を使用します

部品 数量 購入先 備考
obniz Board 1 https://akizukidenshi.com/catalog/g/gM-14930/
M5stickC 1 https://akizukidenshi.com/catalog/g/gM-15151/
TowerPro サーボ MG996R 1 https://akizukidenshi.com/catalog/g/gM-12534/
両端ロングピンヘッダ 1×40 (40P 6.1) 1 https://akizukidenshi.com/catalog/g/gC-09056/ オス-オスのジャンパーワイヤでも代用可能
遠隔お酌ライト版 外枠 1 https://make.dmm.com/item/1190592/ キャプションを入力できます
遠隔お酌ライト版 内枠♂ 1 https://make.dmm.com/item/1190794/ キャプションを入力できます
遠隔お酌ライト版 内枠♀ 1 https://make.dmm.com/item/1190793/ キャプションを入力できます
ダブルクリップ 9 ダイソーなど 挟口19mm程度
ブックエンド 2 ダイソーなど 高さ160mm程度
M3ネジ及びナット 10mm 4 ホームセンターなど
飲料の紙パック 1 高さ10cmでカット
滑り止めのシート、両面テープ 少々 ダイソーなど 必要に応じて紙パックの内側に張り付け

配線

obnizのピン0、1、2にサーボの紫、オレンジ、黄色を接続します。
両端ロングピンヘッダを使うときれいですが、オス-オスのジャンパーワイヤでも代用可能です。
キャプションを入力できます

組み立て

  • 「遠隔お酌ライト版 外枠」にサーボを取り付けます。
  • サーボホーンに「遠隔お酌ライト版 内枠♀」を取り付けます。
  • サーボに組み立てたサーボホーンを取り付けますが、ねじ止めは、後でします、実際に動かしてみて、角度を調整してから、ねじ止めします。
    キャプションを入力できます
  • ダブルクリップとブックエンドで写真のように組み立てます。
    キャプションを入力できます
    キャプションを入力できます
  • 傾いたとき瓶や缶が滑らないように、必要に応じて、滑り止めのシートを、紙パックの内側に張り付けます。

動かし方

  • ローカルに保存した、htmlファイルを実行します(htmlはサーバにおいてもOK)
  • 最初の「Connect obniz device」のダイアログは、M5StickCのIDを、次のダイアログはobnizのIDを入力します(プログラム中に直接指定してもOK)
  • obnizのスイッチを押すと、M5StackCの傾きに応じてサーボが動作します、再度押すと停止します
    キャプションを入力できます
  • 紙パックの中に缶ビールなどを入れ、お酌をしてもらってください!

ソースコード

  • obnizとM5StickCのobnizIDを設定してください。
  • センサ誤差の修正方法
    • 傾きの計算は、加速度センサの値、Y軸の値を利用します
    • 通常M5StickCを立てた状態では、Y軸の値は+1.0、横にした場合±0.0、逆さにした場合ー1.0になります
      キャプションを入力できます
    • 個体差により値が+1~ー1でない場合があります、コンソールログにY軸の値が表示されるので、立てた状態の値をMAX_Yに、逆さにした状態の値をMIN_Yに設定してください
  • サーボの動きを滑らかにするため、0.1秒ごとに2度の速度で動作するようにしています
  • 意図しないときに傾くのを防ぐため、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" /> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <script src="https://unpkg.com/obniz@3.x/obniz.js" crossorigin="anonymous" ></script> </head> <body> <div id="obniz-debug"></div> <h3>遠隔お酌</h3> <div id="print">obnizのスイッチを押すと開始します</div><br> <img src="https://raw.githubusercontent.com/Yoshiaki110/oshaku-obniz/main/tokkuri.png?raw=true" id="tokkuri"/> <script> var MIN_Y = -0.84; var MAX_Y = 1.17; var obniz = null; var servo = null; var angle = 0.0; // M5StickCの角度 var sAngle = 0.0; // サーボの角度 var oshaku = false; // M5StickC(コントローラ側)のobnizのID var obnizM5 = new Obniz.M5StickC("OBNIZ_ID_HERE"); // お酌装置側のobnizのID obniz = new Obniz("OBNIZ_ID_HERE"); obnizM5.onconnect = async function () { obnizM5.display.clear(); obnizM5.display.print("enkakuoshaku start"); // M5stickCの加速度センサが MPU6886 の場合 // await obnizM5.setupIMUWait(); // M5stickCの加速度センサが SH200Q の場合 await obnizM5.setupIMUWait("SH200Q"); obnizM5.onloop = async function () { if (oshaku) { let accele = await obnizM5.accelerationWait(); console.log(accele.y); // 1~-1を0~180に変換 angle = ((accele.y * -1 + MAX_Y) * 180) / (MAX_Y + MIN_Y * -1); $("#print").text("角度:" + Math.round(angle)); obnizM5.display.clear(); obnizM5.display.print("angle:" + Math.round(angle)); } await obnizM5.wait(200); }; }; obniz.onconnect = async function () { obniz.display.clear(); obniz.display.print("push switch"); // サーボの設定 servo = obniz.wired("ServoMotor", { gnd: 0, vcc: 1, signal: 2 }); // スイッチが押されたら obniz.switch.onchange = function(state) { if (state === "push") { oshaku = !oshaku; // 押すたびにモード変更 if (oshaku) { $("#print").text("お酌開始"); } else { $("#print").text("お酌停止中、スイッチを押すと開始します"); angle = 0; } } } }; // サーボをゆっくり動かすため、10ミリ秒毎に動かす function move() { if (servo) { var diff = sAngle - angle; if (Math.abs(diff) > 3) { if (diff < 0) { sAngle += 2; } else { sAngle -= 2; } obniz.display.clear(); obniz.display.print( "angle:" + Math.round(angle) + " " + Math.round(sAngle) ); // サーボを回転 servo.angle(sAngle); // 画像を回転 var arrow = document.getElementById("tokkuri"); arrow.style.transform = "rotate(" + sAngle + "deg)"; } } setTimeout(move, 100); } setTimeout(move, 1000); </script> </body> </html>

感想

obnizを使ったの初めてでした、
M5StickCとobnizの通信をどのように実装するか考えていたのですが、1つのhtmlで複数のデバイスを実行できることがわかり、とっても簡単に実現できました。
インターネット通信できる環境なら、コストをかけずにIoTシステムの開発できますね。

1
1
1
yoshiaki110のアイコン画像
オンライン飲み会で使える「遠隔お酌」装置を開発しています。 https://enkakuoshaku.localinfo.jp/
ログインしてコメントを投稿する