Objective-C
iPhone
iOS
Swift
iOSDay 12

超音波通信の概要と,iOS での実現方法

More than 3 years have passed since last update.

最近,超音波通信技術が注目を浴びています.先日,あの LINE の友だち追加機能にも,超音波通信を用いる方法が追加されました.今後,超音波通信はますます実用化されていくことと思われます.

今回は,そんな話題の超音波通信に関して,その概要と,iOS での実現方法をざっくりと書いてみようと思います.


超音波通信の概要

超音波通信は,人には聴こえない,高周波音で情報通信をおこなう手段です.人の可聴域は 18kHz あたりまでなので,基本的にそれ以上の周波数を用います.

超音波は当然のことながら 「音」 なので,デバイス非依存であり,かつデバイス間のペアリングが不要というメリットがあります.また,音 = 近距離へのブロードキャスト通信 なので,自分の周囲にいる人全員に情報を送りたい,というような場合に超音波通信は適しているといえます.


なぜ QR コードやふるふるよりも超音波通信が優れているのか?

LINE には,QR コード,ふるふる,Bluetooth などと多くの友だち追加機能がありますが,それらの中でも,超音波通信は 1 番優れているように思います.

QR コードは,ほぼ間違いなく正確に情報を送ることができるというメリットがありますが,QR コードをカメラでいちいち読み込むのは面倒です.また,1 つずつしか読み込めないので時間がかかります.

逆にふるふるは,手軽に複数人同時に交換をおこなうことができますが,今度は正確さが犠牲になります.渋谷のハチ公前でふるふるしてみると,誰だか分からない人がいっぱい表示されます.これは GPS を利用しているからで,現在の GPS の精度ではどうしようもありません.

これら 2 つの手段から分かるように,正確さと手軽さというのは基本的にトレードオフになります.しかし超音波通信では,その問題を見事に克服しています.超音波通信をおこなうには,通信ボタンを押すだけとかでいいはずなので,ふるふるよりも手軽ですし,自分の周囲にしか届かないため,知らない人に追加される心配もありません.そのため,アカウントなどの交換手段としては,超音波通信は,現時点で最も優れた方法である,と個人的に思っています.

その他にも,以前話題になった,うんこが「10分後に出ます」とか通知してくれるデバイス D Free なんかも,超音波技術で実現されています.超音波には,まだまだ多くの可能性があるように感じますね.


iOS で超音波通信を実現する

ここからは,iOS で超音波通信をおこなう方法についてざっくり書いていきます.基本的には,特定の音の送受信にすぎず,それがたまたま高周波である,というだけです.


超音波の送信

送信には,Core Audio の Audio Toolbox を利用します.以下の記事に詳しくまとめられています.

Objective-C - iOSで特定の周波数の音を鳴らす方法 - Qiita

ViewController.m_frequency を 20000 (20kHz) とかにすると,不可聴音になります.サンプリングレートやビットレートはそのままのクオリティで問題ありません.


超音波の受信

受信に関しては,aurioTouch という,Apple が Audio Unit の利用方法を示すために公開しているサンプルアプリが非常に参考になります.アプリを起動すると,以下のような波形グラフが表示されるので,下部の FFT ボタンを ON にします.

aurioTouch_screenshot.PNG

すると,横軸が周波数,縦軸が振幅のグラフになります.横軸の右にいくほど高周波で,どの周波数の音が出ているのかがリアルタイムに把握できます.これはまさに今回必要な機能であり,受信に関しては基本的にそのまま流用できます.例えば前節のコードで 20kHz の音を出してみると,グラフの右の方に 1 つの山が現れるのが分かると思います.

また,aurioTouch を Swift2.0 で書きなおしたものも公開されています (非公式).

ooper-shlab/aurioTouch2.0-Swift


超音波によるデータ送受信

最後に,上記の超音波送受信を利用して,情報を送受信する方法を検討してみます.

音は波なので,特定の周波数の音のみをうまく取得できるのか疑問に思うかもしれませんが,aurioTouch を利用しても分かるように,特定の周波数とその周囲では振幅に大きく差が出るため,しっかり区別することができます.なので,例えば 18k ~ 20kHz を 10分割して,それらに 0 ~ 9 を (200kHz ごとに) それぞれ割り当てるなどといったことが考えられます.

次に,上記の割り当てを用いて,123456 という情報を送信してみようと思います.初めの 0.5 秒間 1 に割り当てられている周波数,次の 0.5 秒間 2 に割り当てられている周波数… といった感じでしょうか.聞き逃したりした場合の誤り訂正ですが,超音波通信に関しては再送依頼は非常に難しいです (理由は考えてみるとすぐ分かります).なので,FEC などの自己訂正機能を利用する必要があります.

また,iPhone は左右のスピーカーで別の音を出すことができるので,例えば 1~4 を桁数情報,5~9 を内容情報として,それらを同時に送信するといったことも可能です.5678 という情報を送信したい場合,まず 15 を同時に送信 (1 桁目が 5), 次に 26 を同時に送信 (2 桁目が 6) … といった感じになります.このようにすると,6 を聞き逃してしまって 578 となってしまったような場合でも,2 桁目を聞き逃しているということが容易に分かりますね.1~4 を桁数情報として用いる分,内容情報として利用できる数字の数が減ってしまいますが,特に問題はありません.というのも,超音波通信ではペアリングさえおこなえればよく,ペアリングしてしまえばあとは websocket なり何なりでコネクションをはればいいからです.なので,多くの場合,超音波で大量の情報を送信するといったことは必要ないですし,そもそも超音波は大量の情報を送信するのに適していません.

以上,超音波通信に関してざっくりと書いてみました.興味を持たれた方は,ぜひ 1 度試してみて下さい.また,具体的なコードは載せていないので,質問がある方はコメント欄にてお願いいたします.