maaash.jp

what I create

Wi-Fi機能を備えたデバイスのセットアップ、そしてモールスWi-Fiセットアップについて

IRKitのように、スマートフォンとWi-Fiで接続するデバイスをつくる際には、
どのように家のWi-FiのSSIDやセキュリティの設定(WPA2なのかWEPなのか等)、パスワードをどのようにスマートフォンからデバイスに伝えるのか、ということが問題になる。

スマフォからは同時に1つのWi-Fiアクセスポイントにしか接続できないのだから、
家でも使うデバイスなのであれば、デバイスが家のWi-Fiアクセスポイントに接続することになる。

だがデバイスには入力用のインターフェースがない。

一番思いつきやすいのが、デバイスがWi-Fiアクセスポイントになり、スマフォからそれに接続して家のWi-Fiアクセスポイントの情報を伝える、という方法。
だがこれでは自分のアプリ内でセットアップが完結しない。iOSであれば一度設定アプリを開き、Wi-Fiの設定からデバイスのアクセスポイントを選択し、、となる。

興味深い事例をいくつかご紹介すると、
Eye-Fiカードでは、一度PCにつなぎ、PC上のセットアップツールを使い、Eye-Fiカードが接続するアクセスポイントの情報を直接カードに書き込む。

この方法だとアクセスポイントはプルダウンメニューから選択できるのでSSID等を手入力せずに済むし、Wi-Fiに接続できなかった場合にデバイスからのフィードバックもあるが、PCにつながくてもセットアップできるとなおよい。

Electric Imp というWi-Fiモジュールでは、光の点滅をデジタル信号のようにして使う BlinkUp Technology を使う。

スマフォのディスプレイがチカチカするのだ。かっこいい。
オープンソースにはなっていないし、Wi-FiモジュールとしてElectric Impを採用する必要があったがIRKitではそれは別の理由でできない。TELECも2014年3月現在取得していない。

IRKitをつくるときには、他のWi-Fiモジュールを使いつつこれをぱくろうかと最初は思ったが、
Patent Pendingと強調されているし、探すと申請中の特許 Optically configured modularized control system to enable wireless network control and sensing of other devices も見つかったのでびびってやめておいた。

光がだめなら音はどうか。
モールス信号はかっこいい。

(中略)ということで音でいこうと決めた。

Arduinoでモールス信号の送受信を試している人も何人かいて google: arduino morse 、それらを参考に組んでみた。

モールス信号 は、長音と短音、無音区間の比率を規定するもので、速度は WPM という単位を使い、可変である。
WPM は Words Per Minute の略。
Word は “PARIS” を基準とする場合が多い。
つまり .__. ._ ._. .. ... (ただし ‘_’ が長音, ‘.’ が短音, ‘ ’ が文字区切りとする) の長さである。
長音1つは短音3つに相当し、
各音の間には1短音分、文字区切りは3短音分、単語区切りは7短音分の無音区間があるので、
“PARIS” は 50短音分の長さがあり、
WPM は 1分間で 50短音分の長さ をいくつ再生できるのか、という速度の単位である。

SSIDとパスワード+アルファを送ろうとするのに、何分もかかるようでは困る。
ということで IRKit で採用する際には高速化をはかった。

まずは鳴らす側、iPhoneアプリではモールス音を高速に鳴らすライブラリは無かったので、書くことにした。
できあがったものはこちら。
IRMorsePlayerOperation.m
モールス信号をサイン波のサンプルから生成し、ローパスフィルターを通し(サイン波を鳴らしたり無音にしたりする境目で発生するノイズを落とすため)、マイクから鳴らす。
AudioUnit, AUGraphを使った。

Arduino側はこちら。
morse.cpp

モールス信号は、長音と短音の組み合わせにアルファベットをマッピングしていく。
その表はこちら。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// # standard morse tree
// T _    M _ _    O _ _ _    CH _ _ _ _
//                            Ö _ _ _ .
//                 G _ _ .    Q _ _ . _
//                            Z _ _ . .
//        N _ .    K _ . _    Y _ . _ _
//                            C _ . _ .
//                 D _ . .    X _ . . _
//                            B _ . . .
// E .    A . _    W . _ _    J . _ _ _
//                            P . _ _ .
//                 R . _ .    Ä . _ . _
//                            L . _ . .
//        I . .    U . . _    Ü . . _ _
//                            F . . _ .
//                 S . . .    V . . . _
//                            H . . . .

ところがSSIDには日本語が使えてしまうので、SSIDをモールスで送ろうとすると困る。

IRKitでは以下のように [0-9A-F] と区切り用に ‘/’ に特化したマッピングを採用した。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// # hex+/ morse tree
// # 4,5 should be used more frequently than others because they're used in ascii alphabet
// 4 _    3 _ _    0 _ _ _    ? _ _ _ _
//                            ? _ _ _ .
//                 1 _ _ .    ? _ _ . _
//                            ? _ _ . .
//        6 _ .    8 _ . _    ? _ . _ _
//                            ? _ . _ .
//                 9 _ . .    ? _ . . _
//                            A _ . . .
// 5 .    2 . _    B . _ _    ? . _ _ _
//                            ? . _ _ .
//                 C . _ .    ? . _ . _
//                            ? . _ . .
//        7 . .    D . . _    ? . . _ _
//                            ? . . _ .
//                 E . . .    F . . . _
//                            / . . . .

これで厳密にはモールス信号ではないのだろうが、しょうがない。
文字列はUTF-8にエンコードしたものを16進にして4bitずつ1文字として送る。
例: “あ” -> “E38182” -> ... __ _._ __. _._ ._

iPhoneアプリでモールス音を再生し、Arduinoでデコードする。
安定して認識できた速度 100 WPM を採用した。
これでそこそこ長いSSIDとパスワードの組み合わせ+アルファを送るのに 12 秒。
セーフか。

こんなふうにして再生する、 100 WPM のモールス信号の音を参考までに置いておく。

この方式を モールスWi-Fiセットアップ と勝手に呼んでいた。

Comments