ボタンガジェット
今回のHWの一番大きなポイントとしてリアルなボタンを押すと機体から弾がビュンビュンと振動とともに出るところです。Mont Blanc Pj.で行ったゲームと現実の融合というコンセプトを継承することができました。vine.co
回路
緑のLEDが常灯していてボタンを押すと黄色いLEDと振動アクチュエータも電圧がかかって動作します。またボタンのイベント検知はDI1とDI2をを利用しています。特徴的なのはDI2にはDI1を反転した値をTC7S04Fというインバータを利用して入力しているところです。ボタン1つで2ポートを利用している理由は、TWE-Liteは間欠モードという省電力モードでは立ち上がりor立ち下がりしか検知できないためです。東京コスモス電機さんのサポート担当者様によると今回使ったファームウェア(超簡単!無線マイコンTWE-Lite DIP)は立ち下がり設計とのことです。今回のゲームではボタンのPushDown/Upが取りたかったのでDI1とそれを反転したDI2を利用することで解決しました。
Fritzing Project – TWE-LITE Single Push Button
ガジェットの中にはスペースがほとんどないので苦労しましたが、便利な商品を見つけてなんとか乗り切りました。シール基板は特に面白く、ピッチ変換をしたりGNDなどに使うラインのタイプがあったりします。切り取って普通の基板に接着剤でくっつくのでとても便利でした。ハンダもつきます!また基板はハサミでちょきちょきと切れるので使い勝手がかなり良かったです。
ちなみに今回のボタンガジェットに必要な部品はすべて秋月電子、千石電商、マルツパーツで手に入ります。店舗とオンラインストア、どちらでも入手できます。
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);
} 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モデル
ボタンと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段目より上のレゴは認識できないという技術的制約があるため、取付部を設けて機体のカスタマイズ方法を限定させた。
裏側も工夫しています。擬似レゴを使ったため素材の密度が粗く、認識に使う赤外線カメラの赤外線の反射率が悪化しました。そこで薄いプラ版をレゴ裏面に貼ることで反射率を稼ぐことにしました。下が蓋みたいになるので、結果的に段を重ねるような遊び方を子供に抑えさせることが出来ました。本当はあまり制約は与えたくはないんですけどね。つけ心地もイマイチだったのでレゴに頼らない形状なども引き続き検討していきたいです。
課題と今後に向けて
長くなってしまいましたが最後に簡単に課題と今後について書きます。
省電力化
今回消費電力を真面目に検討しなかった結果、ボタン電池を30分に1回は交換するレベルでした。振動アクチュエータが電池をかなり食ってるのは分かっていますが、ちゃんと計測して最低起動電圧は次回までに正しく調査しようと思っています。また今回TWE-LiteのOption Bits #2の値を間違えていてプルアップ分の電流がずっと流れていた、というのも1つの原因で有りそうです。
専用基板
今回無理やりマイコン類を入れましたが、小型化とショート防止などのために専用基板を次回は起こしたいと思っています。Seeed Studioなど自分のスキルアップ&経験値アップのためこれもマストで行いたいですね。
筐体
今回のデモ筐体は時間もなかったため、カラーアングルをただ組み立てただけ、投影面もアクリル板にトレーシングペーパーを貼っただけど、かなりお粗末な見た目でした。持ち運びも難しいためデモを外でするにも一苦労です。今度は専用の組み立て式の筐体で見た目も綺麗な筐体に仕上げたいです。
ボタン以外のガジェット作成
今回本当はプッシュボタン以外に切り替え式のスイッチ(上の写真に載ってます)も作っていたのですが、うまい使い方が考えきれずお蔵入りとなりました。ボタン以外のも分かりやすいインタフェースは多いのでこの辺り遊び方含めてもっとアイデアを出していきたいです。