先日学内で行われたUnitus主催のハッカソンに,Miceとして参加しました。

大半がゲームを作っていた中,僕たちだけはなぜかマウスを持ち込み,GR-PEACHを持ち込み,モーターを持ち込み……,異様な空間が出来ていました。

人目を引くこともあってか,なぜか1票差で最優秀賞! レッドブル2ダースを獲得しました!

……とまあ,そんなことはどうでも良いのですが,個人的には面白い取り組みを一つしたので失敗談を含めて紹介しようと思います。

 

マウスを動かすだけの簡単なシステムを製作したのですが,それだけではつまらないのでマウスに触れずに動作できるようにしました。

具体的に言うと,赤外線でマウスに行き先座標を送信するというシステムです。

「赤外線通信」と言うと,まずテレビのリモコンが思い浮かぶと思います。

今回は詳しい規格は紹介しませんが,あれは38kHzの搬送波にデータを載せて転送していたはずです。(これは後日たりぷろで実験します。絶対します。)

こいつを,簡易的に実装しようと思い立ち,次のプロトコルをでっち上げました。

(※プロトコル:通信規格のこと。例えばマクドナルドで注文するときには「商品名」と「個数」を言わないと頼めませんし,この基本的なルールは広く知られています。同じように,機械が機械と会話(通信)するときは,何を,どれだけ(何ビット)送信するか,というルールが決まっていないといけません。)

 

・1語を4ビットとし,「ヘッダ・データ本体・フッタ」を続けて送信する。

・ヘッダは4語で「1111 1111 0000 NNNN」で構成される。

 NNNN:送信するデータ本体の語数(0~15)

・フッタは3語で「PPPP 0000 0000」で構成される。

 PPPP:パリティ(文字数と送信文字すべてとパリティを加算すると下8桁が1111になるようなビット列)

・1ビットを5msで送信し,赤外線点灯時を1,消灯時を0とする。

 つまりビットレートは200bpsとなる。

 

イメージ出来るでしょうか……?

例えば,ゴール座標{ 3, 1 }を送る場合次のようになります。

「1111 1111 0000 0010 0011 0001 1011 0000 0000 」

今回は近距離無線通信,外乱も非常に小さい環境で動作させたため,また送るデータ量も小さかったので何の問題も無く動作してくれました。

 

さて,プチ反省会をしましょう。

今回のプロトコルでは全く持ってダメダメな設計をしています。

赤外線センサを教室の上に向け,そして下に向けるとデータ受信が行われてしましました。なぜでしょうか……?

 

正解はさっき挙げた「外乱」,それと「ヘッダのダメ仕様」です。

教室の上に付いている「蛍光灯」,こいつからは赤外線も出ています。そりゃあ蛍光灯に向けたらセンサが反応しますよね。

これに対応するために,製品化されている赤外線通信の規格では,比較的高周波のパルス波の赤外線が照射されている場合のみ「1」と判断するようになっています。比較的,というのは蛍光灯などの外乱では発生しないレベルで,と言う意味です。

そしてプロトコルのヘッダ部分を見てください,「1111 1111 0000」となっていますよね。赤外線が強いところから弱いところに切り替われば,確かにこのヘッダと一致している! と認識されてもおかしくありません。

例えばヘッダを「1010 1010 1010」としてみましょう。これならば外乱をヘッダと読み違えることも大幅に減ると思われます。

 

今回の実験でプロトコルの重要性を体感させられました。

この結果を基に,たりぷろの赤外線通信を良い物に出来ればと思います。

ではでは,また。

 

○今回のサンプルコード

https://github.com/taniho0707/kani_kama

なおバグのため,パリティが一時的に無効化されているコードです,悪しからず。