MetaGadget を使って、cluster から接続する物理的なデバイスを用意しましょう。
今回は、マイクロコンピュータとして Rapberry Pi Zero 2 W を用意し、GPIO を使って LED を点灯させます。出来上がりのイメージとしては、cluster の中で、電球にインタラクトする(画面中でタップする)と、現実の LED が点灯するというガジェットを作ります。
図のような回路を構成しておきます。
この先は、Raspberry Pi OS Lite をインストールしてある前提で話を進めます。
Raspberry Pi OS Lite のインストール方法についてはこちらを御覧ください。
必要パッケージのインストール
sudo apt-get install vim python3-dev
python -m venv venv
. venv/bin/activate
pip install metagadget RPi.GPIOMetaGadget を動かすためには、ngrok のアカウントのが必要です。無料で取得可能なので、こちらからアカウントを作成してください。作成した後に管理画面から、Auth Token と自分のアカウントに紐づけられたドメインを取得してください。
セットアップが出来たので、MetaGadget ライブラリを使ったプログラムを用意します。
import RPi.GPIO as GPIO
from metagadget import MetaGadget
# PIN Number
LED_PIN = 14
# GPIO Setup
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
def main():
app = MetaGadget()
@app.receive
def handle(data):
if data == "on":
GPIO.output(LED_PIN, 1)
else:
GPIO.output(LED_PIN, 0)
app.run()
GPIO.cleanup()
if __name__ == "__main__":
main()用意したプログラムを次のような環境変数をセットして起動します。これらの環境変数は ngrok のの設定のために必要なものです。ngrok アカウント作成時に取得した Auth Token とドメインをそれぞれ指定してください。
NGROK_AUTHTOKEN="YOUR_NGROK_KEY" NGROK_DOMAIN="YOUR_NGROK_DOMAIN" python main.py
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5001
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: XXX-XXX-XXX上記のようにメッセージが表示されれば起動しています。
cluster を使って確認を行う前に、curl を使って動作を確認してみましょう。次のコマンドで LED が点灯します。
curl -X POST -H 'Content-Type: application/json' -d '{"request": "on"}' https://YOUR_NGROK_DOMAIN/今度は LED を消灯します。
curl -X POST -H 'Content-Type: application/json' -d '{"request": "off"}' https://YOUR_NGROK_DOMAIN/点灯しない場合は、LED の回路が正しく接続されているか確認しましょう。また、raspberry pi のシェルにエラーメッセージが表示されていないかも確認しましょう。
Cluster Creator Kit が Setup されている Unity で Craft Item を作ります
まずは、簡単な球を Item として登録します。
Empty Game Object を作成し、Light という名前をつけます。
その配下に Sphere を作成しておきます。Hierachy 画面は以下のようになるはずです。
Empty GameObject である Light オブジェクトの Inspector 画面から、”Item(Script)” と “Scriptable Item (Script)” コンポーネントを追加しておきます。”Item(Script)”コンポーネントの設定で、Item Name と Size を指定するのを忘れないようにしましょう。“Scriptable Item (Script)”ではこのオブジェクトに紐づける Cluster Script を設定できますが、後ほど設定するのでこの場では空のままで問題ありません。
アイテムが出来たら、upload が必要です。menu の Cluster > UploadCraftItem を選ぶと設定画面が現れます。
この画面に、Prefab にしたアイテムを Drag&Drop すると Item が登録できます。Valid Item と表示されていたら、Upload を押して作ったアイテムを登録しましょう。
その後、callExternal の接続先を Unity のメニューから登録します。menu の Cluster > ExternalCommunication を選ぶと設定画面が現れます。先に ngrok で取得した自分のドメインを指定して、”https://YOUR_NGROK_DOMAIN/” という形で、URL を登録してください。
作ったアイテムを自分のワールドクラフトにおいてみましょう。
このアイテムにはスクリプトが登録されていないので、クラフトモードでアイテムを選択した状態で F12 を押してスクリプトを編集します。
let ledOn = false;
$.onInteract(() => {
$.log("interacted.");
if (ledOn) {
ledOn = false;
$.callExternal("off", "led");
} else {
ledOn = true;
$.callExternal("on", "led");
}
});
$.onExternalCallEnd((res, meta, err) => {
$.log("external call end.");
$.log(res); // デバッグ用にレスポンスを表示します
$.log(meta); // デバッグ用にリクエスト時に指定しているmeta情報を表示します。"led" と表示されます
$.log(err); // エラーが起きている場合このコードによりエラーが表示されます。
});このスクリプトをアイテムに登録すると、球体をクリックすることで、LED の点灯、消灯を行うことができます。
これで、MetaGadget を使って Craft Item から現実のデバイスの制御を行う一連の流れが実装できました。






