なんでも作っちゃう、かも。Arduino電子工作3DプリンタイベントスタバカップアンプDotsduinoソフトモデムすべての記事なんでも作っちゃう、かも。Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。iPhoneのオーディオ端子を使って通信をする(2)イントロダクションiPhoneのオーディオ端子を使ってArduinoと通信するライブラリ「SoftModem」を作ったよ。SoftModemはその名前のとおりソフトウェア・モデムのこと。ソフトウェアでデジタル信号と音声信号を相互に変換する。通常、iPhoneとマイコンを通信させたい場合、Wi-FiかBluetoothを使うことになる。Wi-FiやBluetoothを使うにはマイコン側に無線モジュールが必要で、コストがかかるし、電力的に厳しくなる。JailBreak(脱獄)すればDockコネクタのシリアル端子を使ったアプリケーションが作れるが、そうして作ったアプリケーションはAppStoreで配布できない。ソフトウェア・モデムなら追加の部品も数点、数百円のコストですむし、作ったアプリケーションはAppStoreで配布することもできる。今回、このSoftModemを使ってiPhoneと簡単なシリアル通信の仕方を紹介する。Hacks」という本の記事で、この本ではPSoCマイコンを使ったiPhone用のキーボードや赤外線リモコンの作り方を紹介している。PSoCのコードとiPhoneのコードが次のURLで公開されていて、自由にダウンロードできる。Hacksのコードを流用させてもらった。Keying)=周波数偏移変調を使ってデジタル信号を音声信号に変換する。データ'0'の時は低周波数の搬送波を、データ'1'の時は高周波数の搬送波を送る。次の図は1番目の波形がデジタル信号、3番目の波形が変調後の音声信号を表している。データが'1'の時は波形の間隔が短く、データが'0'の時は波形の間隔が長くなっているのがわかる。音声信号の受け側はこの周波数の違いをもとにデジタル信号を復元する。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を基準にボーレートと搬送周波数を決めている。7350HzSoftModemの受信SoftModemはATmega328内蔵のアナログコンパレータを使って音声信号の解析を行う。アナログコンパレータで音声信号の立ち下がりを検出する。立ち下がりから次の立ち下がりまでの時間をTimer2でカウントし、周波数を特定する。周波数が分かれば0か1か分かるので、あとはボーレートに合わせてデジタル信号を復元する。送信するデータビットに合わせて、デジタルポートから矩形波を出すだけだ。プリアンブルを1byte毎に送信していると転送レートが極端に悪くなってしまうので、しばらく送信していなかった場合のみ送るようにしている。回路図iPhoneからの音声信号はC1を通って、R1/R2で2.5Vのバイアスをかけて6番ピンに接続する。7番ピンにアナログコンパレータの閾値用の電圧をかける。ArduinoからiPhoneへの信号はR3/R4で分割し、C2を通ってiPhoneのマイク端子に接続する。R5はiPhoneにマイクが繋がっていることを認識させる為に必要な抵抗。R6はVCC/2から250mVぐらい下げた電圧になるように調節する。iPhoneのマイク端子iPhoneのオーディオ端子は4極で根元からマイク、グランド、右チャンネル、左チャンネルとなっている。Documents/Arduino/libraries)にコピーしてください。SoftModemhttp://code.google.com/p/arms22/downloads/list?can=2&q=SoftModem+label%3AFeaturedSoftModemはATmega328のハードウェア資源であるTimer2を使います。その為、11番ポートへのanalogWriteとtone関数が使えません(ごめんなさい)。SoftModemライブラリはアナログ信号を扱う部分が多いため、通信時にデータが壊れることがあります。SoftModemライブラリを使って通信を行う場合、データが壊れることを想定し、データが壊れても不具合がおきないよう注意してスケッチまたプログラムを作成してください。サンプルスケッチSoftModemライブラリを使ったシンプルなターミナルスケッチです。スケッチをアップロードしたら、シリアルモニタを開いて使います。シリアルモニタから文字列を送るとArduinoを通してiPhoneに文字列が送られます。iPhoneから送られてきた文字列はArduinoが受け取り、シリアルモニタに送ります。iPhoneSoftModemTerminalはソフトウェア・モデムを使ったシンプルなiPhone用のターミナルアプリです。iPhoneとArduinoを4極のケーブルで接続して使います。iPhoneのオーディオ端子に何も接続していないと内蔵スピーカーから大きな音がでるので注意してください。昔懐かしい「ピーヒョロローガーガーピー」を聞きたい人は別ですが。※iPhone側の音量は最大にして使用してください。しないとArduinoはうまくデータを受信できません。※このアプリはAppStoreで配布していないので、次のURLからソースコードをダウンロードし、ビルドして直接iPhoneにインストールしてください。このソースコードにはソフトウェアモデムのコードも含まれているので、これをベースにオリジナルのハードウェアとアプリを作って下さい。says..."はじめまして"いつも楽しく拝見しています。ためになり、勉強させてもらっています。今回の、SoftModemはとても気になっています。iPhoneは、sdkなりで、ビルドするということなのでしょうか?宜しくお教えください。現状ビルドして使っていただくことになります。AppStoreでの配布も検討中ですが、いつ頃になるかはまだわかりません。はじめまして"SoftModemTerminalではありませんが、ソースコードのオリジナルの作者さんがTinCanというアプリを公開されています。title"情報ありがとうございます。sdkのために、Mac買っちゃうかと悩んでいるところです。says..."TinCan"こんにちは。TincanをiPhone3Gで動かしてみましたが、最初は動きませんでした。これはiPhoneの言語を英語に変更することで動くようになったので、作者の方にメールしたのですが、アップデートはないようです。TinCan"nnishi@小樽さん情報ありがとうございます。says..."教えて下さい"miconoといいます。softmodemのことについて教えて下さい。appを作ってみました。応用を考えていて、ひとつはイヤホンジャックからでなく、DockコネクタのLineOUTからの出力をsoftmodemに繋いで動かしたい。ひとつは、BTヘッドフォンとsoftmodemを繋いで動かしたい。普段BTヘッドフォンを使って音楽を聴いているので、試しにsoftmodemのアプリを動かしてみたら、音楽は停止するんですが、BTヘッドフォンからは音が鳴らないようでした。この分だとDockコネクターを自作してもLineOutからは音が出てない様な気がして。コードの中身を全然追ってないので、根本的に無理なことなのか、それとも、それ用のコードを追加する必要があるのかわかっていないのですが、その辺、なんか情報を頂ければと思っています。これ用に、自作用のDockコネクターや、安いBTヘッドフォンを注文してしまいました。教えて下さい"こんにちは。MTM06のときにDockコネクタにつないでSoftmodemを使っているのを見かけました。DockコネクタのLineOutからの出力はボリュームの影響を受けないので安定していると。技術的には可能なはずです。こちらではソフトウェアのテストは行っていないので、なんらかの変更は必要かもしれません。iPhoneのオーディオのルーティング関連を調べてみると何かわかるかも。こちらのサイトが参考になります。教えて下さい"ありがとうございます。技術的には可能なはずですよね。softmodemのAudio関連のコードがどんな仕組みになっているか勉強しないといかんですね(汗)Lineout関連で何か進展があったら教えて下さい。はじめまして"こんばんは。時間をみてこちらでも確認してみます。ワーニング程度なら問題なく動作すると思いますよ。title"とりあえず次のことを確認してみてください。touch/Arduinoで合わせてあるか?オーディオケーブルの加工は必要ありません。