読者です 読者をやめる 読者になる 読者になる

The jonki

呼ばれて飛び出てじょじょじょじょーんき

Maker Faire Tokyo 2015 で LITTAI を出展してきた(ハードウェア解説編)

f:id:jonki:20150726173310j:plain

はじめに

8/1・8/2で東京ビッグサイトで開催された Maker Faire Tokyo 2015 に、id:hecomiid:AMANELITTAI というタイトルで展示してきました。熱も冷めやらぬうちにハードウェアの解説を行いたいと思います。認識やゲームに関してはid:hecomiの記事をご参考ください。tips.hecomi.com


www.youtube.com

ボタンガジェット

今回のHWの一番大きなポイントとしてリアルなボタンを押すと機体から弾がビュンビュンと振動とともに出るところです。Mont Blanc Pj.で行ったゲームと現実の融合というコンセプトを継承することができました。vine.co

仕組み

これはTWE-LiteというZigBeeに対応した無線マイコンモジュール(東京コスモス電機さん開発)を利用しています。低レイテンシ、低消費電力、長距離通信、とIoTなどの分野で大活躍しそうなモジュールです。2.4GHz帯で特別な免許もいらず日本では技適も通ってるので安心して利用できます。id:kssaoさんの投稿で知りました。
超小型IEEE802.15.4/ToCoNet無線モジュール TWE-Lite(トワイライト) - TOCOS-WIRELESS.COM
qiita.com


使ったTWE-Lite製品を参考に挙げておきます。

このUSBドングルは親機専用として非常に便利です。DIP用書き込み基板でも代用できますが、持ち運びや見栄えなどが良いので1個あると便利です。

こちらは書き込みに利用します。今回はDIP版のTWE-Liteを買いましたが、ピンヘッダの足をつけていません。それでも先端に5ピンのピンヘッダを取り付けることで書き込めます(使用例Cを参考

あとはボタンウィジェットに1個ずつこれが入ってます。

いろんな使い方が載っています。TWE-Liteについてまとめて一気に勉強したい人は情報がまとまっているのでオススメです。

回路

緑のLEDが常灯していてボタンを押すと黄色いLEDと振動アクチュエータも電圧がかかって動作します。またボタンのイベント検知はDI1とDI2をを利用しています。特徴的なのはDI2にはDI1を反転した値をTC7S04Fというインバータを利用して入力しているところです。ボタン1つで2ポートを利用している理由は、TWE-Liteは間欠モードという省電力モードでは立ち上がりor立ち下がりしか検知できないためです。東京コスモス電機さんのサポート担当者様によると今回使ったファームウェア(超簡単!無線マイコンTWE-Lite DIP)は立ち下がり設計とのことです。今回のゲームではボタンのPushDown/Upが取りたかったのでDI1とそれを反転したDI2を利用することで解決しました。
f:id:jonki:20150803235755p:plain
Fritzing Project – TWE-LITE Single Push Button


ガジェットの中にはスペースがほとんどないので苦労しましたが、便利な商品を見つけてなんとか乗り切りました。シール基板は特に面白く、ピッチ変換をしたりGNDなどに使うラインのタイプがあったりします。切り取って普通の基板に接着剤でくっつくのでとても便利でした。ハンダもつきます!また基板はハサミでちょきちょきと切れるので使い勝手がかなり良かったです。
f:id:jonki:20150721231000j:plain
f:id:jonki:20150806000359j:plain


ちなみに今回のボタンガジェットに必要な部品はすべて秋月電子千石電商、マルツパーツで手に入ります。店舗とオンラインストア、どちらでも入手できます。

TWE-Liteの設定

ファームウェア超簡単!TWE標準アプリのver 1.7.1を使ってます。赤色の部分が変更した値です。'Option Bits #1'の0x00000010はADCを利用しない場合に設定するとAD1~4の配線を省略できます。'Option Bits #2'でDI1とDI2でプルアップ停止にして電流を節約します。

CONFIG/TOCOS TWELITE DIP APP V1-07-1
a: set Application ID (0xXXXXXXXX)
i: set Device ID (12=0x0c)
c: set Channels (18)
x: set Tx Power (3)
t: set mode4 sleep dur (1000ms)
y: set mode7 sleep dur (1000s)
f: set mode3 fps (32)
z: set PWM HZ (1000)
o: set Option Bits (0x00000010)
O: set Option Bits #2 (0x00000011)
b: set UART baud (38400)
p: set UART parity (N)

他の項目は下記を参考にしてみてください。
設定変更(インタラクティブ)モード - TOCOS-WIRELESS.COM

通信

構成としてはボタンガジェットにあるTWE-Liteの子機とゲームを動かすMacにトコスティック(親機)を挿し、Macで動いているUnityで親機からくるシリアルデータを読み取っています。そのときid:hecomiにリリースしたコードはgithubにあげてあります。github.com

シリアルデータの読み込みとイベント発火はSerialHandlerクラスで行っています。ここでは簡単に読み込みとイベント発火の部分を説明します。

スレッドでのデータ読み込み
Updateでは60fpsしか出ないので、スレッドを動かしてmessageQueue_に対して高速にデータを格納していきます。私の環境ではThread.Sleepがないとloopが高速に回りすぎてUnityがクラッシュしてしまいました。下のRead_関数がThreadクラスに渡している関数になります。

private void Read_()
{
    while (isRunning_ && serialPort_ != null && serialPort_.IsOpen) {
        try {
            if (serialPort_.BytesToRead > 0) {
                lock(guard_) {
                    messageQueue_.Enqueue(serialPort_.ReadLine());
                }
            }
            Thread.Sleep (0); // for avoiding busy loop
        } catch (System.Exception e) {
            Debug.LogWarning(e.Message);
        }
    }
}

格納したデータの利用
スレッド内で格納したデータはUpdate内でコピーし、そのコピーしたデータをイベントとして発火します。

void Update()
{
    Queue<string> tmpQueue = null;
    lock(guard_) {
        while(messageQueue_.Count > 0) {
            tmpQueue = new Queue<string>(messageQueue_);
            messageQueue_.Clear();
        }
    }

    if(tmpQueue	!= null) {
        while(tmpQueue.Count > 0) {
            // シリアルデータの送信(略)
        }
    }
}

イベント(定義)
C#ではeventという便利な仕組みがあります。これを公開用に定義しておきます。

public delegate void SerialDataHandler(int id);

public static event SerialDataHandler Pressed = (int id) => {};
public static event SerialDataHandler Pressing = (int id) => {};
public static event SerialDataHandler Released = (int id) => {};
public static event SerialDataHandler SwitchOn = (int id) => {};
public static event SerialDataHandler SwitchOff = (int id) => {};

イベント(受信)
あとは上の公開されたイベントを登録することでポーリングすることなく、イベントをコールバック形式で受信することができます。

void onPressed(int id) {
    Debug.Log (System.DateTime.Now + " onPressed: " + id);
}

void onPressing(int id) {
    Debug.Log (System.DateTime.Now + " onPressing: " + id);
}

void onReleased(int id) {
    Debug.Log (System.DateTime.Now + " onReleased: " + id);
}

void onSwitchOn(int id) {
    Debug.Log (System.DateTime.Now + " onSwitchOn: " + id);
}

void onSwitchOff(int id) {
    Debug.Log(System.DateTime.Now + " onSwitchOff: " + id);
}

void Start () {
    SerialHandler.Open();
    SerialHandler.Pressed += onPressed;
    SerialHandler.Pressing += onPressing;
    SerialHandler.Released += onReleased;
    SerialHandler.SwitchOn += onSwitchOn;
    SerialHandler.SwitchOff += onSwitchOff;
}

3Dモデル

f:id:jonki:20150716005312j:plain
ボタンとTWE-Liteなどを格納するケースとそのケースに付ける擬似レゴの3Dモデルです。
3Dプリンター(Up Plus 2)と123D Designを使ったCADによる簡単な3Dモデル作成のスキルは習得済みだったので、今回のMaker Faireから早速活用出来ました。実際にプリントして試行錯誤できるのはMy 3Dプリンターの強みだと改めて感じました。また一度モデルが完成してしまえば見栄えが良くまったく同じものを多く作ることができるのでMakerのみなさんにはやはりおすすめしたいですね。www.123dapp.com
www.123dapp.com

セイミツ工業 PS-14-DN-K ゲームスイッチφ24 ネジ式 スケルトン クリア


ちなみに今回本物のレゴを使わなかった理由は2つです。

  • 上から見た時(ユーザー目線)、下から打ち上げているプロジェクターの光がレゴをほとんど透過しないため暗い部屋では真っ暗に見えてしまった。そのため3Dプリンターで作った密度の粗いレゴを利用し、見た目が光る(下からの光が透ける)ようにした
  • 接地面から2段目より上のレゴは認識できないという技術的制約があるため、取付部を設けて機体のカスタマイズ方法を限定させた。

裏側も工夫しています。擬似レゴを使ったため素材の密度が粗く、認識に使う赤外線カメラの赤外線の反射率が悪化しました。そこで薄いプラ版をレゴ裏面に貼ることで反射率を稼ぐことにしました。下が蓋みたいになるので、結果的に段を重ねるような遊び方を子供に抑えさせることが出来ました。本当はあまり制約は与えたくはないんですけどね。つけ心地もイマイチだったのでレゴに頼らない形状なども引き続き検討していきたいです。
f:id:jonki:20150807004453j:plain

課題と今後に向けて

長くなってしまいましたが最後に簡単に課題と今後について書きます。

省電力化

今回消費電力を真面目に検討しなかった結果、ボタン電池を30分に1回は交換するレベルでした。振動アクチュエータが電池をかなり食ってるのは分かっていますが、ちゃんと計測して最低起動電圧は次回までに正しく調査しようと思っています。また今回TWE-LiteのOption Bits #2の値を間違えていてプルアップ分の電流がずっと流れていた、というのも1つの原因で有りそうです。

専用基板

今回無理やりマイコン類を入れましたが、小型化とショート防止などのために専用基板を次回は起こしたいと思っています。Seeed Studioなど自分のスキルアップ&経験値アップのためこれもマストで行いたいですね。

筐体

今回のデモ筐体は時間もなかったため、カラーアングルをただ組み立てただけ、投影面もアクリル板にトレーシングペーパーを貼っただけど、かなりお粗末な見た目でした。持ち運びも難しいためデモを外でするにも一苦労です。今度は専用の組み立て式の筐体で見た目も綺麗な筐体に仕上げたいです。

ボタン以外のガジェット作成

今回本当はプッシュボタン以外に切り替え式のスイッチ(上の写真に載ってます)も作っていたのですが、うまい使い方が考えきれずお蔵入りとなりました。ボタン以外のも分かりやすいインタフェースは多いのでこの辺り遊び方含めてもっとアイデアを出していきたいです。

無線通信

TWE-Liteは2.4GHzですが、当日の会場では無線が混みあいすぎて想定以上にイベントをドロップしました。
ミクミンP/Kazuhiro Sasao on Twitter: "MFT会場、超低消費電力モードだと厳しい。この距離でも繋がらない、、。 http://t.co/Mn1FavTnI3"

会場を訪れた方にも、赤外線を使った方が良いというコメントが多くもらいました。これは確かにそうで、次回に出す機会があれば、赤外線を使ってイベントの通知やウィジェットのトラッキングを行いたいと思っています。この辺り技術的に面白そうなネタを温めているので近いうちに記事を書きたいと思っています。