uniboから遠隔地のArduino製ラジコン(SheildBot)を動かす

はじめに

12月21日に開催しました第一回スキルクリエイター体験会 ( 東京会場大阪会場 )にて、東京のユニボに話しかけると、大阪のユニボが反応して、目の前にあるラジコン(SheildBot)を動かすというデモを行いました。

今回は、このデモの裏側を紹介したいと思います。

デモの紹介

肝心のデモは、体験会に参加された方が撮影されておりました。

なお、動画は下記のような流れで構成されています。

  1. 東京のユニボに、「ラジコンスタート」と話しかける
  2. 上記のコマンドを受け取ったユニボは、通知サーバーにPOSTリクエストを行う
  3. 大阪のユニボは、通知ノードにリクエストが届いたら、「ラジコンを動かします」と発話後、リモコンノード経由で、目の前のラジコンを動かす

使用したもの

当日のデモ

当日のデモでは、次のようなものを使用しました。

大阪で使用したShieldBot

なお、プロトタイピングボードは受信器を嵩上げするための土台として使用しているだけですので、特にこれでないといけないということはありません。
また、赤外線受信器を発泡スチロールでさらに嵩上げしている理由は、受信器の位置をユニボの赤外線発振器の位置と合わせるためです。

準備(リモコンの登録)

事前にリモコン信号をユニボに登録するため、下記のものを使用しました。

SheildBotの設定

配線

写真を参照しながら、下記のように各部品を設置します。

  1. ShieldBot下面に、Arduinoを設置
  2. SheildBot上面に、プロトタイピングボードを設置
  3. SheildBotのD2(D3)ピンに、赤外線受振器を接続

プログラミング

ShieldBotを動かすため、Arduinoに下記の内容を含めたコードを記述します。

  1. リモコン信号の受信を待つ
  2. リモコン信号のデータが 0 であれば、Botを1秒間だけ前進させる

具体的なコードは下記になります。

#include <IRSendRev.h>
#include <Shieldbot.h>

Shieldbot shieldbot = Shieldbot();
unsigned char dta[20];

void setup()
{
  IR.Init(2);
  Serial.begin(9600);
}

void loop()
{
  shieldbot.setMaxSpeed(255);
  while (true) {
    if (IR.IsDta()) {
      IR.Recv(dta);
      if (dta[6] == 0) {
        shieldbot.forward();
        delay(1000);
      }
    }
  }
}

なお、ビルドするためには、ライブラリは下記のものが別途必要です。

リモコンの設定

ユニボに覚えさせるためのリモコン信号を、Arduinoで作っておきます。

#include 
unsigned char dtaSend[20];

void dtaInit()
{
  dtaSend[0] = 11;
  dtaSend[1] = 180;
  dtaSend[2] = 91;
  dtaSend[3] = 11;
  dtaSend[4] = 33;
  dtaSend[5] = 1;
}

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  dtaInit();
  dtaSend[6] = 0;
  IR.Send(dtaSend,38);
  Serial.print("send ok");
  while (true) {
  }
}

上記で作成したリモコン信号は、Arduinoの起動時に1度だけ発信されるようになっています。
再度信号を発信したい場合は、ArduinoのResetボタンを押して下さい。

ユニボの設定

東京側ユニボ

東京側のユニボは、「ラジコン動かして」と発話したら、HTTPリクエストノードを使って、通知サーバーへPOSTリクエストする機能を実装しました。

なお、通知サーバーへのPOSTリクエストについては、上記のサンプルコードとともに、ユニボストアの「通知ノードの使い方」を参照ください。

[{"id":"17d6d3344.6d521c","type":"debug","z":"1728aa0e4.b79c4","name":"","active":true,"console":"false","complete":"true","x":769,"y":124,"wires":[]},{"id":"14c3f8a10.3bb0e4","type":"http request","z":"1728aa0e4.b79c4","name":"","method":"POST","ret":"obj","url":"https://distribution.unibo.info:16009/api/v1/distributions","tls":"","x":582,"y":125,"wires":[["17d6d3344.6d521c"]]},{"id":"13096b03c.fb3cc","type":"inject","z":"1728aa0e4.b79c4","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":175,"y":126,"wires":[["1591650d9.5addc"]]},{"id":"1591650d9.5addc","type":"function","z":"1728aa0e4.b79c4","name":"","edit":"","func":"msg.headers = {\n \"Content-Type\": \"application/json\"\n}\nmsg.payload = {\n \"targetSkillpackPackageName\": \"***\",\n \"user\": {\n \"identifier\": \"***\",\n \"password\": \"***\"\n },\n \"contents\": [\n {\n \"textMessage\": \"通知ノードのテストです。\"\n }\n ]\n}\nreturn msg;","outputs":1,"dummy":"1","noerr":0,"x":390,"y":125,"wires":[["14c3f8a10.3bb0e4"]]},{"id":"11a15cd46.430b63","type":"listen","z":"1728aa0e4.b79c4","name":"","priority":"1","rules":[{"t":"JP","v":"ラジコンスタート"},{"t":"EN","v":""},{"t":"CN","v":""}],"version":1,"dummy":"1","x":181.5,"y":222,"wires":[["1591650d9.5addc"]]}]

POSTリクエスト時の記入項目

POSTリクエストには、使用する環境に合わせて下記の内容を入力する必要があります。

  • 通知先となるノードID(大阪側ユニボの通知ノードのノードIDを入力)
  • 認証情報(ユーザーID、パスワード)
  • メッセージ内容(文字列)

大阪側ユニボ

リモコンの登録

大阪側のユニボは、事前にShieldBotを動かすためのリモコン信号を覚えさせておく必要があります。

ユニボは、標準でリモコン登録機能が実装されていますが、今回は、せっかくなのでキルクリエイターで登録部分を作成してみました。

このサンプルでは、タイムスタンプを実行すると、「リモコンを登録します。青く光ったら、リモコンをかざして下さい。」とユニボが喋るので、指示どおり、頭のLEDが青く光ったら、Arduinoのリモコン信号をユニボにかざします。

これで、1chにリモコンが登録できます。(なお、ユニボは16chまで登録することができます。)

[{"id":"11680c3a2.e7546c","type":"remocon","z":"1261795ad.e6fdca","name":"","commands":[{"t":"JP","v":"ラジコン動いて"},{"t":"EN","v":""},{"t":"CN","v":""}],"ch":1,"mode":"memory","version":1,"x":587,"y":194,"wires":[[]]},{"id":"1c6b8f6b1.e4d028","type":"inject","z":"1261795ad.e6fdca","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":205.5,"y":217,"wires":[["1deb9c83.fd91438"]]},{"id":"1deb9c83.fd91438","type":"speech","z":"1261795ad.e6fdca","word":"リモコンを登録します。青く光ったら、リモコンをかざして下さい。","subtitle":"リモコンを登録します。青く光ったら、リモコンをかざして下さい。","name":"","edit":false,"version":1,"x":392.5,"y":213,"wires":[["11680c3a2.e7546c"]]}]

通知の受信〜リモコン動作

肝心のShieldBotを動かすプログラムは、下記のようになっています。

プログラムの内容は、通知ノードが通知を受け取ると、「ラジコンを動かします」と発話し、リモコン(1ch)を動作させるというシンプルな仕組みです。

[{"id":"195d524cf.236568","type":"notification","z":"178ec490e.4762e8","name":"","version":1,"x":260,"y":201,"wires":[["11a928381.d27f4c"]]},{"id":"11a928381.d27f4c","type":"speech","z":"178ec490e.4762e8","word":"ラジコンを動かします","subtitle":"ラジコンを動かします","name":"","edit":false,"version":1,"x":418,"y":201,"wires":[["19c4f6c2f.7060c"]]},{"id":"19c4f6c2f.7060c","type":"remocon","z":"178ec490e.4762e8","name":"","commands":[{"t":"JP","v":""},{"t":"EN","v":""},{"t":"CN","v":""}],"ch":1,"mode":"send","version":1,"x":587,"y":204,"wires":[["1fa8379f.08b6988"]]},{"id":"1baeb97a0.fc86a8","type":"inject","z":"178ec490e.4762e8","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":194.5,"y":281,"wires":[["11a928381.d27f4c"]]},{"id":"1fa8379f.08b6988","type":"debug","z":"178ec490e.4762e8","name":"","active":true,"console":"false","complete":"false","x":641.5,"y":332,"wires":[]}]

最後に

ユニボは今回使用したリモコン機能や通知機能(Webhook)の他にも、いろいろなノードが用意しています。

今後も体験会を継続的に実施していきますので、ぜひ connpassの unibo Developer グループ( https://unibo.connpass.com/ )に登録ください。

関連記事一覧

PAGE TOP