SoftModemインターフェースボード発売!
Posted by arms22 on 2010年07月27日

おまたせしました!iPhoneのオーディオ端子を使ってArduinoと通信するためのボード「SoftModemインターフェースボード」がスイッチサイエンスさんから発売です!
スイッチサイエンス/商品詳細 SoftModemインターフェースボード
このボードを使うとiPhoneからArduinoへ、ArduinoからiPhoneへデータを送ることができます。通信速度は1225bpsと少し(かなり)遅いですが、センサー情報やスイッチ入力など少量のデータ通信なら問題なく使えます。
iPhoneを自作デバイス・イミフガジェットのコントローラとして使いたいと思っている方に最適なソリューションでございます。
基板寸法は25 x 25mmと非常にコンパクトです。基板上のボリュームを調整することで、5V・3.3V両方の電源に対応することができます。
基板の詳しい使い方などをこちらのページで公開しております。
http://code.google.com/p/arms22/wiki/SoftModemBreakoutBoard
※Arduinoは付属しておりません。
※iPhoneとの接続には4極オス~オスケーブルをお使いください。
追加の情報
Arduinoで遊ぼう - iPhoneのオーディオ端子を使って通信をする
Arduinoで遊ぼう - iPhoneのオーディオ端子を使って通信をする(2)
Arduinoで遊ぼう - iPhoneのオーディオ端子を使って通信をする(2)
Posted by arms22 on 2010年07月13日

目次
- Arduinoで遊ぼう - iPhoneのオーディオ端子を使って通信をする
- Arduinoで遊ぼう - iPhoneのオーディオ端子を使って通信をする(2)
イントロダクション

前回、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側のボリュームは最大にしてください。

Arduinoとの接続用にコンパクトなSoftModem Breakoutボードを準備中です。うまくいけば来月ぐらいにスイッチサイエンスさんで買えるようになるかも。。
Arduinoで遊ぼう - iPhoneのオーディオ端子を使って通信をする
http://arms22.blog91.fc2.com/blog-entry-350.html
音系iPhoneアプリに興味があるかたにオススメです。これ1冊でiPhoneのオーディオ処理に関する情報がまとめて手に入ります。
iPhone Core Audioプログラミング
posted with amazlet at 10.07.13
永野 哲久
ソフトバンククリエイティブ
売り上げランキング: 15849
ソフトバンククリエイティブ
売り上げランキング: 15849
Arduinoで遊ぼう - iPhoneのオーディオ端子を使って通信をする
Posted by arms22 on 2010年06月19日

目次
- Arduinoで遊ぼう - iPhoneのオーディオ端子を使って通信をする
- Arduinoで遊ぼう - iPhoneのオーディオ端子を使って通信をする(2)
イントロダクション

iPhoneのオーディオ端子を使ってArduinoと通信するライブラリ「SoftModem」を作ったよ。SoftModemはその名前のとおりソフトウェア・モデムのこと。ソフトウェアでデジタル信号と音声信号を相互に変換する。
通常、iPhoneとマイコンを通信させたい場合、Wi-FiかBluetoothを使うことになる。Wi-FiやBluetoothを使うにはマイコン側に無線モジュールが必要で、コストがかかるし、電力的に厳しくなる。JailBreak(脱獄)すればDockコネクタのシリアル端子を使ったアプリケーションが作れるが、そうして作ったアプリケーションはAppStoreで配布できない。
ソフトウェア・モデムなら追加の部品も数点、数百円のコストですむし、作ったアプリケーションはAppStoreで配布することもできる。今回、このSoftModemを使ってiPhoneと簡単なシリアル通信の仕方を紹介する。
ソフトウェア・モデムの元ネタは「iPhone Hacks」という本の記事で、この本ではPSoCマイコンを使ったiPhone用のキーボードや赤外線リモコンの作り方を紹介している。PSoCのコードとiPhoneのコードが次のURLで公開されていて、自由にダウンロードできる。iPhone側のアプリケーションのコードはiPhone Hacksのコードを流用させてもらった。
Perceptive Development Labs
http://www.perceptdev.com/labs/
仕組み
SoftModemはFSK(Frequency Shift Keying)=周波数偏移変調を使ってデジタル信号を音声信号に変換する。データ'0'の時は低周波数の搬送波を、データ'1'の時は高周波数の搬送波を送る。
次の図は1番目の波形がデジタル信号、3番目の波形が変調後の音声信号を表している。データが'1'の時は波形の間隔が短く、データが'0'の時は波形の間隔が長くなっているのがわかる。音声信号の受け側はこの周波数の違いをもとにデジタル信号を復元する。

(via http://en.wikipedia.org/wiki/Frequency-shift_keying)
標準的なシリアル通信プロトコルではデジタル信号はスタートビット'0'から始まって、データ8bit、偶数パリティ1bit、ストップビット'1'が送られる。SoftModemではこれを少し拡張し、送信の前には音声信号の安定用に8~16bitの"1"=プリアンブルを送り、ストップビットの後に”押し出し”用の'1'を送っている。
iPhone側のサンプリング周波数やマイコンの処理速度から、FSKを使ったSoftModemの最高ビットレートは1200bpsあたりが限界(っぽい)。SoftModemが対応するボーレートと周波数の組み合わせ次のとおり。iPhone側のサンプリング周波数、44.1kHzを基準にボーレートと搬送周波数を決めている。
ボーレート | 126bps | 315bps | 630bps | 1225bps | 低周波数 | 882Hz | 1575Hz | 3150Hz | 4900Hz | 高周波数 | 1764Hz | 3150Hz | 6300Hz | 7350Hz |
SoftModemの受信
SoftModemはATmega328内蔵のアナログコンパレータを使って音声信号の解析を行う。アナログコンパレータで音声信号の立ち下がりを検出する。立ち下がりから次の立ち下がりまでの時間をTimer2でカウントし、周波数を特定する。周波数が分かれば0か1か分かるので、あとはボーレートに合わせてデジタル信号を復元する。
SoftModemの送信
送信はいたって簡単。送信するデータビットに合わせて、デジタルポートから矩形波を出すだけだ。プリアンブルを1byte毎に送信していると転送レートが極端に悪くなってしまうので、しばらく送信していなかった場合のみ送るようにしている。
回路図

iPhoneからの音声信号はC1を通って、R1/R2で2.5Vのバイアスをかけて6番ピンに接続する。7番ピンにアナログコンパレータの閾値用の電圧をかける。ArduinoからiPhoneへの信号はR3/R4で分割し、C2を通ってiPhoneのマイク端子に接続する。R5はiPhoneにマイクが繋がっていることを認識させる為に必要な抵抗。R6はVCC/2から250mVぐらい下げた電圧になるように調節する。
iPhoneのマイク端子

iPhoneのオーディオ端子は4極で根元からマイク、グランド、右チャンネル、左チャンネルとなっている。ちょっと変則的?
ライブラリのインストール
次のURLからライブラリをダウンロードして、Arduinoのライブラリフォルダ(OSXの場合~/Documents/Arduino/libraries、Windowsの場合My Documents/Arduino/libraries)にコピーしてください。
SoftModem
http://code.google.com/p/arms22/downloads/list?can=2&q=SoftModem+label%3AFeatured
SoftModemはATmega328のハードウェア資源であるTimer2を使います。その為、11番ポートへのanalogWriteとtone関数が使えません(ごめんなさい)。またデータ受信時はアナログコンパレータの割り込みが繰り返し入るのでその区間割り込みを禁止しているとデータを取りこぼすことがあります。
※※※注意※※※
SoftModemライブラリはアナログ信号を扱う部分が多いため、通信時にデータが壊れることがあります。SoftModemライブラリを使って通信を行う場合、データが壊れることを想定し、データが壊れても不具合がおきないよう注意してスケッチまたプログラムを作成してください。
サンプルスケッチ
SoftModemライブラリを使ったシンプルなターミナルスケッチです。スケッチをアップロードしたら、シリアルモニタを開いて使います。シリアルモニタから文字列を送るとArduinoを通してiPhoneに文字列が送られます。またiPhoneから送られてきた文字列はArduinoが受け取り、シリアルモニタに送ります。
#include <SoftModem.h> //ライブラリをインクルード
#include <ctype.h>
SoftModem modem; //SoftModemのインスタンスを作る
void setup()
{
Serial.begin(57600);
modem.begin(); // setup()でbeginをコールする
}
void loop()
{
while(modem.available()){ //iPhoneからデータ受信しているか確認
int c = modem.read(); //1byteリード
if(isprint(c)){
Serial.print((char)c); //PCに送信
}
else{
Serial.print("("); //表示できない文字はHexで表示
Serial.print(c,HEX);
Serial.print(")");
}
}
while(Serial.available()){ //PCからデータを受信しているか確認
char c = Serial.read(); //1byteリード
modem.write(c); //iPhoneに送信
}
}
SoftModemTerminal for iPhone

SoftModemTerminalはソフトウェア・モデムを使ったシンプルなiPhone用のターミナルアプリです。iPhoneとArduinoを4極のケーブルで接続して使います。iPhoneのオーディオ端子に何も接続していないと内蔵スピーカーから大きな音がでるので注意してください。昔懐かしい「ピーヒョロローガーガーピー」を聞きたい人は別ですが。。
※iPhone側の音量は最大にして使用してください。そうしないとArduinoはうまくデータを受信できません。※
このアプリはAppStoreで配布していないので、次のURLからソースコードをダウンロードし、ビルドして直接iPhoneにインストールしてください。このソースコードにはソフトウェアモデムのコードも含まれているので、これをベースにオリジナルのハードウェアとアプリを作って下さい。
SoftModemTerminal
http://code.google.com/p/arms22/downloads/list?can=2&q=SoftModemTerminal+label%3AFeatured
関連URL
Reinforce Lab - iPhone ソフトウェアモデム
http://sites.google.com/a/reinforce-lab.com/www/projects/iphone-software-modem
Togetter - まとめ「iPhoneモデム開発」
http://togetter.com/li/30190
モデム - Wikipedia
http://ja.wikipedia.org/wiki/モデム
Iphone Hacks
posted with amazlet at 10.06.19
David Jurick Adam Stolarz Damien Stolarz
Make Books
売り上げランキング: 37863
Make Books
売り上げランキング: 37863
Prototyping Lab ―「作りながら考える」ためのArduino実践レシピ
posted with amazlet at 10.06.20
小林 茂
オライリージャパン
売り上げランキング: 8534
オライリージャパン
売り上げランキング: 8534
該当の記事は見つかりませんでした。