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

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を基準にボーレートと搬送周波数を決めている。
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が受け取り、シリアルモニタに送ります。
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/モデム
- 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



