Arduinoで遊ぼう - iPhoneのオーディオ端子を使って通信をする(2)

目次


イントロダクション


SoftModemTerminalクラス図

前回、SoftModemについてその仕組みや回路、Arduinoとの接続、ライブラリの使い方を解説しました。今回、iPhoneのソースコードの使い方について詳しく解説します。
※iPhoneアプリの開発にはXCodeとiPhone SDKが必要です。iPhone SDKは3.2以上をお使いください。


ソースコード


SoftModemTerminal
http://code.google.com/p/arms22/downloads/list?can=2&q=SoftModemTerminal+label%3AFeatured

現在、iPhoneのソースコードはフレームワーク化されておらず、SoftModemTerminalからSoftModemに関連するソースコードをコピーして使う必要があります。次のリストはSoftModemに関連するソースコードの一覧です。これらのソースコードをプロジェクトフォルダにコピーしてお使いください。
  • AudioQueueObject.h
  • AudioQueueObject.m
  • AudioSignalAnalyzer.h
  • AudioSignalAnalyzer.m
  • AudioSignalGenerator.h
  • AudioSignalGenerator.m
  • CharReceiver.h
  • FSKModemConfig.h
  • FSKRecognizer.h
  • FSKRecognizer.mm
  • FSKSerialGenerator.h
  • FSKSerialGenerator.m
  • lockfree.h
  • MultiDelegate.h
  • MultiDelegate.m
  • PatternRecognizer.h

SoftModemは音声の入出力に次の2つのフレームワークを使います。これらフレームワームもプロジェクトに追加してください。
  • AudioToolbox.framework
  • AVFoundation.framework


初期化


まず最初にAVAudioSessionクラス使って、アプリケーションのカテゴリを設定します。音声の録音と再生を行うので AVAudioSessionCategoryPlayAndRecord を設定します。
AVAudioSession *session = [AVAudioSession sharedInstance];
session.delegate = self;
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
[session setActive:YES error:nil];

次に音声解析用のAudioSignalAnalyzerクラス、FSKRecognizerクラスのインスタンスを生成します。AudioSignalAnalyzer はマイクから入力された波形を解析し、波形の上がり立ち下がりエッジを検出します。FSKRecognizer は AudioSignalAnalyzer が解析した結果を元にデータビットを復元します。
recognizer = [[FSKRecognizer alloc] init];
analyzer = [[AudioSignalAnalyzer alloc] init];
[analyzer addRecognizer:recognizer]; //analyzerにrecognizerを登録
[analyzer record]; //音声解析開始

次に音声出力用の FSKSerialGeneratorクラスのインスタンスを生成します。FSKSerialGenerator はデータビットを音声信号に変換し、出力します。
generator = [[FSKSerialGenerator alloc] init];
[generator play]; // 音声出力開始


受信


データの受信は CharReceiver プロトコルを実装したクラスを FSKRecognizer クラスに登録することで行います。
@interface MainViewController : UIViewController <CharReceiver>

初期化のタイミングで FSKRecognizer クラスに登録します。
MainViewController *mainViewController;
[recognizer addReceiver:mainViewController];

データを1バイト受信すると receivedChar: メソッドが呼ばれます。
- (void) receivedChar:(char)input
{
//受信処理
}


送信


送信は受信に比べてずっと簡単で、FSKSerialGenerator クラスの writeByte: メソッドで1バイト送信します。
[generator writeByte:0xff];


制限


  • レイテンシー
    音声の入出力にはAudioQueueを使用しており、20ms~100msのレイテンシーが存在します。
  • プリアンブル
    無信号状態が続いた場合、データ送信時に約40msのプリアンブル(高周波数搬送波)を送信します。
  • 音声出力レベル(ボリューム)
    S/N比を稼ぐ為にiPhone側のボリュームは最大にしてください。



SoftModem Breakout Board

Arduinoとの接続用にコンパクトなSoftModem Breakoutボードを準備中です。うまくいけば来月ぐらいにスイッチサイエンスさんで買えるようになるかも。。


Arduinoで遊ぼう - iPhoneのオーディオ端子を使って通信をする
http://arms22.blog91.fc2.com/blog-entry-350.html


音系iPhoneアプリに興味があるかたにオススメです。これ1冊でiPhoneのオーディオ処理に関する情報がまとめて手に入ります。

iPhone Core Audioプログラミング
永野 哲久
ソフトバンククリエイティブ
売り上げランキング: 15849



Ads by Google

コメント

プログラムについて

初期化

まず最初にAVAudioSessionクラス使って、アプリケーションのカテゴリを設定します。音声の録音と再生を行うので AVAudioSessionCategoryPlayAndRecord を設定します。
AVAudioSession *session = [AVAudioSession sharedInstance];session.delegate = self;[session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];[session setActive:YES error:nil];
次に音声解析用のAudioSignalAnalyzerクラス、FSKRecognizerクラスのインスタンスを生成します。AudioSignalAnalyzer はマイクから入力された波形を解析し、波形の上がり立ち下がりエッジを検出します。FSKRecognizer は AudioSignalAnalyzer が解析した結果を元にデータビットを復元します。
recognizer = [[FSKRecognizer alloc] init];analyzer = [[AudioSignalAnalyzer alloc] init];[analyzer addRecognizer:recognizer]; //analyzerにrecognizerを登録[analyzer record]; //音声解析開始
次に音声出力用の FSKSerialGeneratorクラスのインスタンスを生成します。FSKSerialGenerator はデータビットを音声信号に変換し、出力します。
generator = [[FSKSerialGenerator alloc] init];[generator play]; // 音声出力開始
受信

データの受信は CharReceiver プロトコルを実装したクラスを FSKRecognizer クラスに登録することで行います。
@interface MainViewController : UIViewController <CharReceiver>
初期化のタイミングで FSKRecognizer クラスに登録します。
MainViewController *mainViewController;[recognizer addReceiver:mainViewController];
データを1バイト受信すると receivedChar: メソッドが呼ばれます。
- (void) receivedChar:(char)input{ //受信処理}
送信

送信は受信に比べてずっと簡単で、FSKSerialGenerator クラスの writeByte: メソッドで1バイト送信します。
[generator writeByte:0xff];

と書かれていますが、初心者なのでよくわからない点があります。
もしも手順を教えてくださるなら教えてください。
誠に勝手ながらすいません。
Secret

Ads by Google
最近の記事
カテゴリ
Arduino (114)
電子工作 (114)
スタバッテルミン (5)
スタバカップアンプ (17)
電光掲示板 (7)
イベント (59)
太陽電池 (12)
ニキシー管 (19)
ARM (8)
PIC (20)
USBデバイス (7)
V850 (17)
Xfind (6)
プログラミング (5)
Android (3)
未分類 (25)
カメラ (6)
本 (18)
mbed (2)
SoftModem (0)
3Dプリンタ (35)
Amazon.co.jp
最近のコメント
三ツ星トラフィック:MPPT太陽電池充電(7) (08/29)
nameless911:Ogaki Mini Maker Faire 2014に行ってきたよ。 (08/28)
claynets:オープンソースのPCBCAD「KiCad」。 (08/26)
arms22:Arduinoで遊ぼう-AVRライタを使わないBootloaderの書き込み (08/11)
Sekine:Arduinoで遊ぼう-AVRライタを使わないBootloaderの書き込み (08/10)
arms22:ArduinoでSDメモリカードを読み書きする (08/05)
arms22:ArduinoでSDメモリカードを読み書きする (07/24)
arms22:Arduinoで遊ぼう-AVRライタを使わないBootloaderの書き込み (07/22)
Sekine:Arduinoで遊ぼう-AVRライタを使わないBootloaderの書き込み (07/20)
arms22:Arduinoで遊ぼう - OAuthを使って安全につぶやくライブラリ「Stewitter」 (07/11)
リンク
Ads by Google
以前の記事
プライバシーポリシー
当サイトでは、第三者配信による広告サービスを利用しています。このような広告配信事業者は、ユーザーの興味に応じた商品やサービスの広告を表示するため、当サイトや他サイトへのアクセスに関する情報 (氏名、住所、メール アドレス、電話番号は含まれません) を使用することがあります。このプロセスの詳細やこのような情報が広告配信事業者に使用されないようにする方法については、ここをクリックしてください。