suzan_worksのアイコン画像
suzan_works 2021年05月16日作成 (2021年05月19日更新)
製作品 製作品 閲覧数 1367
suzan_works 2021年05月16日作成 (2021年05月19日更新) 製作品 製作品 閲覧数 1367

ノーコードで作る、スマホからカーテン開閉くん

ノーコードで作る、スマホからカーテン開閉くん

全体まとめ

obnizを使って、スマホからカーテンを操作するデバイスを作ってみました。
obnizはどのI/Oからも1A流せて、モータードライバーに最適だと思って、あと、自分はプログラミングは不慣れなので、ブラウザからブロックプログラムでさくっとプログラミングしてみました。
今回は実装し切れませんでしたが、obniz Board 1Yでスリープ使えば、もっと長時間動作できそうですね。
簡単な回路、簡単なプログラミングで動くものが作れて、ものづくりの敷居が下がって、obnizはとてもありがたいです。良い経験、勉強になりました。

デモ動画

まずは動作の動画を見てみてください。
簡単な部品説明もしてます。

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

使用部品

obnizでタミヤのモーター回してるのがメインの構成です。
プロトタイプな感じで、結束バンドとか使っちゃってます。
電池ケースが、タミヤのユニバーサルプレートに無加工で良い感じに固定できました。

アイテム 数量 用途
obniz Board 1Y 1 全体制御
タミヤ ダブルギアボックス (左右独立4速タイプ) 1 動力
タミヤ ユニバーサルプレート 1 車輪や電池ボックスを固定
単3電池 3 電源
電池ボックス 2 2本セットを2個使って電池3本搭載
結束バンド 1 カーテンレールへ固定

回路図、接続

回路は、単3乾電池3本を直列にobnizに入力して、モーター2個をobnizの4ポートにつないでいます。
アルカリ乾電池は初期電圧は3.0V超えると思いますけど、2本ではobniz Board 1Yは起動しませんでした。

回路図

接続はこんな感じです。
obnizにはピンを挿して、電池ボックスとモータははんだ付けしました。

接続、外観

ソースコード

ブロックプログラム

開発者コンソールからブロックプログラムでプログラミングしました。
「カーテン開」「カーテン閉」の他に、タイマーで開く機能も作ってみました。

ブロックプログラム1

ブロックプログラム2

スマホ操作画面

スマホのブラウザから見た操作画面はこんな感じです。
とりあえず文字とボタン置いただけですいません。。
スマホ操作画面

コード

ブロックプログラムで作成しましたが、一応コードも載せときます。
コンソール>ファイル>コードを見る で確認できます。

カーテン開閉くん

<html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous" ></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous" ></script> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" /> </head> <body> <h3 id="bploading" style="text-align:center;">LOADING...</h3> <div id="OBNIZ_OUTPUT"></div> <br /> <script src="https://unpkg.com/obniz@latest/obniz.js" crossorigin="anonymous" ></script> <script src="https://unpkg.com/obniz-parts-kits@0.16.0/iothome/index.js" crossorigin="anonymous" ></script> <script src="https://unpkg.com/obniz-parts-kits@0.16.0/airobot/index.js" crossorigin="anonymous" ></script> <script src="https://unpkg.com/obniz-parts-kits@0.16.0/ui/index.js" crossorigin="anonymous" ></script> <script src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/howler2.1.2/howler.js" crossorigin="anonymous" ></script> <script src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/opencv3.4/opencv.js" crossorigin="anonymous" ></script> <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.3.0"></script> <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/mobilenet@2.1.0"></script> <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/posenet@2.2.2"></script> <script src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/clmtrackr/clmtrackr.js" crossorigin="anonymous" ></script> <script src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/clmtrackr/emotion_classifier.js" crossorigin="anonymous" ></script> <script src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/clmtrackr/emotionmodel.js" crossorigin="anonymous" ></script> <script src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/clmtrackr/model_pca_20_svm.js" crossorigin="anonymous" ></script> <script src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/index.js" crossorigin="anonymous" ></script> <script src="https://unpkg.com/obniz-parts-kits@0.16.0/storage/index.js" crossorigin="anonymous" ></script> <script> $("#bploading").text("RUNNING..."); (async function(){ var obniz, timer_hour, motor1, motor2, label, open2, close2, label1, label2, label3, up, down, start; obniz = new Obniz('7164-4056'); await obniz.connectWait(); timer_hour = 6; motor1 = obniz.wired("DCMotor",{"forward":0, "back":1}); motor2 = obniz.wired("DCMotor",{"forward":2, "back":3}); label = new ObnizUI.Label('label'); label.setText('カーテン開閉'); open2 = new ObnizUI.Button('開く'); close2 = new ObnizUI.Button('閉じる'); label1 = new ObnizUI.Label('label'); label1.setText('タイマー'); label2 = new ObnizUI.Label('label'); label2.setText(timer_hour); label3 = new ObnizUI.Label('label'); label3.setText('時間後に開く'); up = new ObnizUI.Button('↑'); down = new ObnizUI.Button('↓'); start = new ObnizUI.Button('タイマー開始'); while (true) { await ObnizUI.Util.wait(0); if (close2.isClicked()) { motor1.move(true); motor2.move(true); await obniz.wait(23000); motor1.stop(); motor2.stop(); } if (open2.isClicked()) { motor1.move(false); motor2.move(false); await obniz.wait(2300); motor1.stop(); motor2.stop(); } if (up.isClicked()) { timer_hour = (typeof timer_hour == 'number' ? timer_hour : 0) + 1; label2.setText(timer_hour); } if (down.isClicked()) { timer_hour = (typeof timer_hour == 'number' ? timer_hour : 0) + -1; label2.setText(timer_hour); } if (start.isClicked()) { await obniz.wait((timer_hour * 3600000)); motor1.move(false); motor2.move(false); await obniz.wait(23000); motor1.stop(); motor2.stop(); } } })(); </script> </body> </html>
2
ログインしてコメントを投稿する