2021年6月13日日曜日

obnizのプログラムの実行形態

obnizはブラウザ上の開発ツールでプログラムを書いて,「実行」ボタンを押すことで,プログラムが実行される.ここで

  • プログラムがどこで動いているのかわからない
  • ArduinoやRaspberry Piのように,マイコンボード単体でプログラムが動いて欲しい
という気持ち悪さがあったので,プログラムの実行形態を調べてみた.

公式ガイドによると,以下のプログラム実行形態があるらしい.
  1. ブロックプログラム
    Webブラウザ上の開発環境で,Scratchのようにブロックプログラムを作成して動かす.プログラムはブラウザ上で動いている?

  2. JavaScriptプログラム
    Webブラウザ上の開発環境で,HTMLとJavaScriptを用いてプログラムを作成して動かす.プログラムはブラウザ上で動いている?

  3. node.jsプログラム
    node.jsはJavaScriptのライブラリであるが,nodeというコマンドがあって,パソコン上で実行される.node.jsプログラムは,JavaScriptで書かれたプログラムであるにもかかわらず,Webブラウザ上で動くプログラムではなく,パソコン上で動くプログラムである.これにより,ブラウザを立ち上げて特定のページにアクセスしなくてもプログラムの実行が可能である.
    node.jsプログラムは,AWS LambdaとAPI Gatewayを使ってプログラムを動かすことができる.作ったプログラムをzipファイルに固めて,AWS Lambdaサービスに登録して,AWS上でプログラムが動くらしい.さらに,AWS API Gatewayを使うことで,ブラウザから,ここに置いてあるプログラムを実行できるらしい.

  4. ブラウザアプリ
    Webブラウザ上の開発環境で,HTMLとJavaScriptを用いてプログラムを作成したものを,クラウドに登録する.Webページに,事前にアカウントの作成とデバイスの登録が必要である.デバイスにインストールできるが,「アプリのプログラムはインストールごとにコピーされません」と書いてあるので,実行時に指定した機器番号(obniz ID)のデバイスにアクセスするだけで,実際にはプログラムはクラウド上にある.また,クラウド実行ができるとも書いてあるので,プログラムはクラウド上に常に存在し,デバイス内には書き込まれないのが正解のようである.
    となると,obnizデバイスは,センサーやアクチュエーターがWi-Fiクライアントに繋がった物理ゲートウェイで,クラウド実行されているプログラムがこのデバイスにアクセスして,センサーの情報を取り込んだりアクチュエーターを動かしたりするために存在するらしい.

  5. ホステッドアプリ
    クラウドでサーバーサイドアプリが動いていて,ここに複数のデバイスが繋がってプログラムが動く.このページを見ると,obnizプログラムのインストールの実態が判明する.デバイスの中にプログラムが書き込まれるのではなくて,指定されたデバイスにアクセスできるように紐付けられたプログラムがクラウドに登録されるということらしい.
ぱっと見える範囲で調べた感じでは,(Webブラウザでプログラムを書いている場合を含めて,)クラウド上にプログラムが置かれて,そのプログラムにはデバイスのobniz IDが書かれている.クラウド上でプログラムが実行されると,指定されたobnizに接続して,ハードウェアにアクセスするらしい.

他のマイコンボードなどと違い,クラウドベースのIoTデバイスで,「デバイスにインストール」という用語が,「プログラムとデバイスIDの紐付け」を意味すると言っても良いかも知れない.

また,ちっちゃいESP32が載ったマイコンボードの割に値段が高いなと思っていたら,これだけのクラウド環境が,デバイスを購入するだけで使用できるのだから,クラウド使用料がその値段の中に含まれていると言っても良いかも知れない.

気温や湿度,気圧,二酸化炭素濃度などを計測して,それらのデータをAmbientなどのクラウドに保存してグラフを描画したい,などという場合,センサーとWi-Fiクライアントのつながったマイコンボードがあれば,センサーで取得したデータをWi-Fi経由でいきなりクラウドに送りつけて,プログラム自体はクラウド上で動いていても良いことになる.このobnizを使用する場合,プログラムによっては,ちょっとマイコンボードとしての考え方を変えて,ArduinoやRaspberry Piとは違うものと考える必要があるかも知れない.

2021年6月12日土曜日

obnizを使ってみる

obnizというマイコンボードを買ってみた.値段は結構高くて,ESP32のボードに液晶とボタン,ピンソケットがついただけなのに6,000円もする.

Raspberry Pi 3Bと4Bの間くらいの値段だ.

このボードの特徴的なところは,以下のようなものらしい.

  1. 開発環境がWeb上で動いており,パソコンにインストールする必要がないこと.
  2. Web上ではブロックベースのエディタとJavaScriptベースのエディタが動いており,どちらでもプログラミングできること.
  3. obniz OSというOSがESP32で使えるため,公式のobnizボード以外でも使用可能なこと.
  4. ピン配置に制約が全くなく,電源,I/Oを全てプログラムから制御できることである(すべてのピンから1Aの出力ができるため,ピンから5Vを出すだけで電源ピンとして使用できる).
  5. どうもクラウドのライセンスも込み込みみたいで,クラウド環境をそのまま使用できる.
電源を入れると,いきなりWi-Fiを探しに行く.

Wi-Fiが無いと使えないらしい.

Wi-Fiアクセスポイントの一覧が表示されるので,アクセスポイントの接続パスワードを入れる.これは,左上の左右ダイヤル+クリックで入力する.このサイズで文字入力ができるようにしてあるのは賢い.

無事にWi-Fiアクセスポイントに接続できると,QRコードが表示される.また,右にはobnizIDという8桁の機器番号(obniz id)が表示される.
QRコードをスマホで読み取ると,いきなりプログラミングするためのWebサイトに飛ぶようになっている.
HTMLプログラム(JavaScript)とブロックプログラム(Scratchのようなもの)が使えるらしい.
「ブロックプログラムを開く」をタップすると,いきなり次の画面のようなプログラムが表示される.

画面の右上に実行ボタン「▶︎」があるので,これをタップすると,obniz上でプログラムが実行される.
ちなみに,メニューから「コードを見る」を選択すると,同じプログラムのJavaScript版を読むことができる.

このサンプルプログラムの場合,以下のようなソースコードが表示される.

<html lang="en">
  <head>
    <meta charset="utf-8" /&tt;
    <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, led;
  
  
  obniz = new Obniz('2040-XXXX');
  await obniz.connectWait();
  obniz.display.print('Hello, World!')
  led = obniz.wired("LED",{"anode":0, "cathode":1});
  while (true) {
  await ObnizUI.Util.wait(0);
    led.on();
    await ObnizUI.Util.wait(500);
    led.off();
    await ObnizUI.Util.wait(500);
  }
  
})();
    
    </script>
  </body>
</html>

パソコンのWebブラウザからもプログラミングできる.JavaScriptの場合には
https://obniz.io/ja/console/program
に,ブロックプログラムの場合には
に接続する.機器番号(onniz id)を聞かれるので,8桁の機器番号(obniz id)を入力するだけでプログラムを書くことができる.

機器番号(obniz id)を入れているため,クラウドからネット経由でこのボードにアクセスしてプログラムを動かしているようだ.