obnizはかんたんにIoT工作ができるマイコンボードですが、パソコンやスマホからブラウザを操作してobnizを制御するという仕組み上、一定間隔で処理したい場合に、JavaScriptで一定間隔で動作するコードを書いても、ネットワーク遅延が加わって厳密には一定間隔になりません。
これを解決する方法として、obnizにはIO-Animationという仕組みが用意されていますので、本記事で使い方を紹介します。
以下の動画に動作の様子を収めており、IO-Animationの効果がわかります。
使用環境
項目 | 内容 |
---|---|
obniz本体 | obniz |
プログラミング環境 | Mac / Windows / Android / iPhone / iPad |
サーボモーター | SG90 |
USBケーブル | USB Micro-Bケーブル |
配線 | ジャンパーワイヤー |
プログラム
開発者コンソールから以下のようなJavaScriptコードを作成しました。
<!-- HTML Example --> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://obniz.com/js/jquery-3.2.1.min.js"></script> <script src="https://unpkg.com/obniz@3.3.0/obniz.js"></script> </head> <body> <h1>Servo Wing</h1> <button id="fast">Fast</button> <button id="slow">Slow</button> <button id="stop">Stop</button> <script> var obniz = new Obniz("OBNIZ_ID_HERE"); const MIN_ANGLE = 60; const MAX_ANGLE = 120; var angle = 60; obniz.onconnect = async function () { var servo0 = obniz.wired("ServoMotor", {gnd:0, vcc:1, signal:2}); var servo1 = obniz.wired("ServoMotor", {gnd:3, vcc:4, signal:5}); /* setInterval(async function(){ servo0.angle(angle); servo1.angle(angle); if (angle == 60) { angle=120; } else { angle=60; } }, 200);*/ obniz.io.animation("animation-fast", "loop", [ { duration: 120, state: function(index){ // index = 0 servo0.angle(MIN_ANGLE); servo1.angle(MAX_ANGLE); } },{ duration: 120, state: function(index){ // index = 1 servo0.angle(MAX_ANGLE); servo1.angle(MIN_ANGLE); } } ]); obniz.io.animation("animation-fast", "pause"); obniz.io.animation("animation-slow", "loop", [ { duration: 180, state: function(index){ // index = 0 servo0.angle(MIN_ANGLE); servo1.angle(MAX_ANGLE); } },{ duration: 180, state: function(index){ // index = 1 servo0.angle(MAX_ANGLE); servo1.angle(MIN_ANGLE); } } ]); obniz.io.animation("animation-slow", "pause"); $("#fast").click(async function() { obniz.io.animation("animation-fast", "resume"); obniz.io.animation("animation-slow", "pause"); console.log("Fast"); }); $("#slow").click(async function() { obniz.io.animation("animation-fast", "pause"); obniz.io.animation("animation-slow", "resume"); console.log("Slow"); }); $("#stop").click(async function() { obniz.io.animation("animation-fast", "pause"); obniz.io.animation("animation-slow", "pause"); console.log("Stop"); }); }; </script> </body> </html>
OBNIZ_ID_HERE
の部分はお使いのobnizのIDで置き換えてください。
コメントにしてあるsetInterval
記述はJavaScriptで一定間隔のループを記述する方法ですが、こちらはネットワーク遅延が乗るため、微妙に一定間隔になりません。
obniz.io.animation("animation-fast", "loop", [〜]);
がIO-Animationによる一定間隔のループを定義する記述になります。
duration
で時間間隔を定義します。(単位はミリ秒)
初期状態として、ループは止めた状態にしておきたかったので、上記コードではループ定義直後にobniz.io.animation("animation-fast", "pause");
として止めています。
上記コードでは2つのループを定義して、それぞれ「Fast」「Slow」ボタンを押すとループを開始するようにしてあります。
「Stop」ボタンを押すと止まります。
以下、実行画面です。
動作確認の様子は冒頭の動画に収めていますのでご覧ください。
まとめ
obnizで一定の時間間隔で処理を実行するための方法として、IO-Animationを使う方法を紹介しました。
obnizでは通常ブラウザ側からの命令を受けて処理が行われるところを、IO-Animationではobniz側でタイミングを取って実行するため、一定の時間間隔で処理を実行できます。
obnizで一定間隔の連続動作をさせたい場合はお使いください。
書籍紹介
obnizの使い方はもちろんのこと、センサーやモーターを使った電子工作やmicro:bitなど他の機器との接続方法も説明されていて、入門から応用まで幅広い知識が身につきます。
参考文献
obniz公式 IO-Animation(https://obniz.com/ja/doc/reference/common/io-animation)