なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

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

Posted by arms22 on 2010年07月13日 1  0

目次



イントロダクション


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

1 Comments

ライジング says..."プログラムについて"
初期化

まず最初に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];

と書かれていますが、初心者なのでよくわからない点があります。
もしも手順を教えてくださるなら教えてください。
誠に勝手ながらすいません。
2012.11.27 10:30 | URL | #- [edit]

Leave a reply






管理者にだけ表示を許可する

該当の記事は見つかりませんでした。