アーカイブ
ユビキタスコンテンツシンポジウム2009
今週の金曜日に去年もあったシンポジウムがまたあります。
今回はPhysical ComputingやMaking Things TalkのTom Igoe先生と、Gainerの小林茂先生の講演があります。
xtel: Ubiquitous Content Project: 「ユビキタスコンテンツシンポジウム 2009」開催
2009年2月27日・28日、「ユビキタスコンテンツ製作支援システムの研究」は、東京・代官山ヒルサイドバンケット・ヒルサイドプラザにて、「ユビキタスコンテンツシンポジウム2009 – And then there are three. -」を開催致します。
ユビキタスコンテンツとは、私たちの衣食住遊に新たな経験と感動をもたらすコンテンツです。それらは物や環境に溶け込み、人や状況によってダイミックに変化し、ネットワークを作成し、経験の蓄積や連動を可能とする必要があります。しかしながら、この近未来のコンテンツを製作するためには、従来のデザインツールやデザインセオリーでは不十分でした。そこで私たちは、この問題を解決するためのツールとしてユビキタスコンテンツプラットフォーム「xtel」を開発してきたのです。
今年度のシンポジウムは「And then there are three.」をテーマに据え、「Making Things Talk」著者のTom Igoe氏、「Gainer」開発者の小林茂氏をゲストスピーカとしてお招きし、「未知なるもの」をデザインする「ツールのデザイン」についてディスカッションを行います。また作品展では、われわれの新たなデザインセオリーを踏まえ、「xtel」によって構築したユビキタスコンテンツを皆様に体験していただきます。
皆様のご来場を心よりお待ち申し上げております。
日時&場所:
・シンポジウム(作品展 内覧会あり)
2009年2月27日(金) 13:00~19:00 (開場 12:30)
代官山ヒルサイドバンケット
・作品展
2009年2月28日(土) 10:00~19:00
代官山ヒルサイドテラス
http://www.hillsideterrace.com/access/index.html
参加費用:
無料
お席に限りがございますので、
シンポジウムにご来場される方は事前登録にご協力ください
事前登録方法:
シンポジウムへのご来場をお考えの方は、
・お名前
・所属
・電話番号
・メールアドレス
を添えて、xtra [at] imgl.sfc.keio.ac.jpまでメールをお送りください。
シンポジウム プログラム
第1部:デザイン思考とプロトタイピングツール
13:00 – 13:20 開会挨拶と進捗報告 (稲蔭正彦)
13:20 – 13:50 講演1 (Tom Igoe氏)
「フィジカルコンピューティングにおけるプロトタイピング」
13:50 – 14:30 講演2 (奥出直人)
「デザイン思考とプロトタイピング」
14:20 – 15:00 討論および質疑応答
・すべてのプレゼンテーション資料は英語になります.
・講演1および討論は英語にて行います.
休憩
第2部:コンテンツデザインのためのツール
15:20 – 15:40 展示作品紹介
15:40 – 16:00 講演3 (石澤太祥・植木淳朗)
「xtel」
16:00 – 16:30 講演4 (小林茂氏)
「Gainer/Funnel」
16:30 – 17:10 討論および質疑応答
・すべてのプレゼンテーション資料は英語になります.
・討論は英語にて行います.
休憩
第3部:内覧会
17:30 – 19:00 ヒルサイド プラザにて内覧会
PCなしで、moxaで音を出す
xtel technical information > learning> Sound Writeより
moxaとスピーカを直結させて、soundWrite(ピン番号, 周波数)関数を使うと音が出せる
センサと組み合わせるとインタラクティブに音階を変えられる。CdSという明度センサを使っている

moxaでセンサーネットワーク
xtelのmoxaを使う。
moxaのzigbee無線で距離を測るから距離情報を削って、少しフォーマットを変えただけだが
たくさんあるセンサ付きノードの状態を、zigbee無線で一カ所に集めるのが簡単にできる。
8ビットマイコンなのにclassが作れて(厳密にはJavaScript互換なのでクラスではないが)文字列が可変長でString.splitなども使えてArrayもあるので、こういう無線通信プロトコルは簡単に作れる
続きを読む…
moxa – 明るさと振動をシリアル通信で送る
CdSと振動スイッチを使った。
xtel基盤のDigitalReadとAnalog Readのページが大変参考になりました。
このサイズのCdSだと、330ΩをGNDにつないで分圧したら丁度良くなった。

まずブレッドボードで回路を組んでみた

それからはんだづけ

プログラム。
連続でシリアル通信するとPCが大変なので、1秒ぐらいのインターバルを取る。
明るさはアナログ値なのでその時間内の平均を取った。
振動も、一度でも振動センサが反応したらshaked:trueになるようにして、serialSendでまとめて送った。
serialInit(9600);
pinMode(0, true); // 振動センサ
function loop(){
var an = 0;
var shaked = false;
var loopTime = 1000;
for(var i = 0; i < loopTime; i++){
an += analogRead(0); // 明るさ
if(!digitalRead(0)) shaked = true;
}
an = an/loopTime;
serialSend("light:"+an+",shake:"+shaked+"¥r¥n");
sleep(1);
}
function sleep(count){
for(var i = 0; i < count*10; i++){
}
}
while(true){
loop();
}
moxaのzigbee無線で距離を測る
zigbee無線で距離を測った。
moxaの無線は出力を変える事ができる。これを利用して、サンプルプログラムの中にあった距離が近づいたらLEDが点灯する奴を改造し、
・複数nodeをID識別
・距離の計測の高速化
を行った。
1つのanchorと複数のnodeとの間の距離を取る。たくさんプログラムを書きこむ羽目になるのでUSBハブが無いと大変。

■しくみ
徐々に電波強度を上げていくと、「最も弱い出力で受信できた時」を距離とする事ができる。
電波強度は、無線通信のデータ本文に数値として含めておいて、受信側で文字列をparseして読み出す。
moxaはマイコン上でECMAScriptが使えるので、Stringを分解したり、Object型インスタンスに何でも突っ込んだり、配列に溜めたりするのが楽に出来るので通信プロトコルを作るのが楽だった。
■nodeのプログラム
徐々に電波強度を上げながらanchorに無線を送り続ける
node/source.js
var radio = new Object();
radio.id = 2; // id:2以降がnode
radio.group = 7;
var time = 1;
var power_borders = new Array();
power_borders = [1,2,3,4,11,12,13,30,31]; // 距離の境目リスト
function loop() {
dist_send();
}
function dist_send(){
for(p in power_borders){ // power
radioInit(0xDEAD, radio.id, radio.group, p);
message = "power:"+p+",time:"+time;
radioSend(0xFFFF, message);
sleep(1);
}
time++;
}
function sleep(count){
for(var i = 0; i < count*10; i++){
}
}
while(true){
loop();
}
■プロトコル
powerを1から徐々に上げながら送信する。
“power:2,time:15″
“power:3,time:15″
“power:4,time:15″
という風にtimeという変数も合わせて送る事で、1セット分の無線送信試行を表している。
■距離の境目
実際にはpowerと無線の飛距離は正比例していなくて、簡単に調べた所
・power 4ぐらい → 4メートル以内ぐらい
・power 10前後 → 5~15メートルぐらい
・power 20前後 → 15~30メートルぐらい
・power 30前後 → それ以上
となっていた。なので、その境目あたりを重点的に送信するために
power_borders = [1,2,3,4,11,12,13,30,31]; // 距離の境目リスト
を使った。こうすると1から最大31まで全powerを試す必要が無くなり、3倍ぐらい速くなっても精度はあまり落ちない。
■anchorのプログラム
nodeからの最低出力で受信できた時のpowerを本文から取り出し、nodeのID毎に配列に保存しておく。
anchor/source.js
var radio = new Object();
radio.id = 1; // nodeはid:2以降
radio.group = 7;
var dist = new Object();
dist.lastTime = 0;
dist.lastPower = 0;
nodes = new Array(16);
nodes_init(nodes);
serialInit(9600);
radioInit(0xDEAD, radio.id, radio.group, 31);
function loop(){
}
function onRadioReceive(seq,id,pan,data,rss) {
if(id < 2) return; // nodeからではない時
commands = data.split(",");
for(c in commands){
tmp = c.split(":");
if(tmp[0] == "power") distance = tmp[1];
if(tmp[0] == "time") time = tmp[1];
}
if(nodes[id].lastTime != time){ // 新しいデータの時
nodes[id].distance = distance;
// nodeのidと距離を出力
serialSend("id:"+id+",distance:"+distance+",time:"+time+"¥r¥n");
}
nodes[id].lastTime = time;
}
function nodes_init(nodes){
for(i = 1; i < nodes.length; i++){
var node = new Object();
node.lastTime = 0;
node.distance = 0;
node.id = i;
nodes[i] = node;
}
}
function sleep(count){
for(var i = 0; i < count*10; i++){
}
}
while(true){
loop();
}
■無線データの受信と解析
onRadioReceive(seq,id,pan,data,rss) という関数を宣言すると無線を受信できる。
こういうデータが来るので
“power:3,time:15″
splitで : と , を分けて、nodeオブジェクトに保存する。
commands = data.split(",");
for(c in commands){
tmp = c.split(":");
if(tmp[0] == "power") distance = tmp[1];
if(tmp[0] == "time") time = tmp[1];
}
また、引数 id に送信元のIDが入っているので、あわせて保存しておく。
■シリアルポートに出力
今回はanchorからパソコンにシリアル通信で出力した。
id:2,distance:10,time:18\r\n
id:6,distance:3,time:11\r\n
id:7,distance:13,time:7\r\n
こんな感じの文字列がきて、anchorとnodeの間の距離、IDがわかる。

ちなみに、node側でさらにボタンの押下状態なんかも付けられる。


最近のコメント