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

目次


イントロダクション


IMGP7601.jpg

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'の時は波形の間隔が長くなっているのがわかる。音声信号の受け側はこの周波数の違いをもとにデジタル信号を復元する。
FSK(周波数偏移変調)
(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を基準にボーレートと搬送周波数を決めている。

ボーレート126bps315bps630bps1225bps
低周波数882Hz1575Hz3150Hz4900Hz
高周波数1764Hz3150Hz6300Hz7350Hz



SoftModemの受信


SoftModemはATmega328内蔵のアナログコンパレータを使って音声信号の解析を行う。アナログコンパレータで音声信号の立ち下がりを検出する。立ち下がりから次の立ち下がりまでの時間をTimer2でカウントし、周波数を特定する。周波数が分かれば0か1か分かるので、あとはボーレートに合わせてデジタル信号を復元する。


SoftModemの送信


送信はいたって簡単。送信するデータビットに合わせて、デジタルポートから矩形波を出すだけだ。プリアンブルを1byte毎に送信していると転送レートが極端に悪くなってしまうので、しばらく送信していなかった場合のみ送るようにしている。


回路図


iPhoneソフトウェアモデム回路図

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


iPhoneのマイク端子


iphone-phone-plug.jpg

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 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 Uno SMD
Arduino Uno SMD
posted with amazlet at 11.02.02
スイッチサイエンス
売り上げランキング: 23827



Iphone Hacks
Iphone Hacks
posted with amazlet at 10.06.19
David Jurick Adam Stolarz Damien Stolarz
Make Books
売り上げランキング: 37863



Arduinoをはじめようキット
スイッチサイエンス
売り上げランキング: 1025



Prototyping Lab ―「作りながら考える」ためのArduino実践レシピ
小林 茂
オライリージャパン
売り上げランキング: 8534


Ads by Google

コメント

はじめまして

いつも楽しく拝見しています。
ためになり、勉強させてもらっています。
今回の、SoftModemはとても気になっています。
やはり、iPhone側のソフトSoftModemTerminal for iPhoneは、
sdkなりで、ビルドするということなのでしょうか?
宜しくお教えください。

Re: はじめまして

はい。
現状ビルドして使っていただくことになります。
AppStoreでの配布も検討中ですが、
いつ頃になるかはまだわかりません。

Re: はじめまして

SoftModemTerminalではありませんが、
ソースコードのオリジナルの作者さんがTinCanというアプリを公開されています。

No title

情報ありがとうございます。
早速調べてみます。
sdkのために、Mac買っちゃうかと悩んでいるところです。
またおじゃましまーす。

Re: No title

お?
ウェルカムですよ!

脱獄

>JailBreak(脱獄)
何気にプリズンブレイクと言ってほしかった…

TinCan

こんにちは。

TincanをiPhone3Gで動かしてみましたが、最初は
動きませんでした。これはiPhoneの言語を英語に
変更することで動くようになったので、作者の方に
メールしたのですが、アップデートはないようです。

TinCanでつまづいているかたがいたらご参考まで

Re: TinCan

nnishi@小樽さん

情報ありがとうございます。

教えて下さい

miconoといいます。
softmodemのことについて教えて下さい。SoftModemTerminal iPhoneのコードを利用させて頂いて、URLでリンクしたページにあるようなiPhone appを作ってみました。

で、少し応用を考えていて、

ひとつはイヤホンジャックからでなく、DockコネクタのLineOUTからの出力をsoftmodemに繋いで動かしたい。

もうひとつは、BTヘッドフォンとsoftmodemを繋いで動かしたい。ということです。

普段BTヘッドフォンを使って音楽を聴いているので、試しにsoftmodemのアプリを動かしてみたら、音楽は停止するんですが、BTヘッドフォンからは音が鳴らないようでした。たぶんこの分だとDockコネクターを自作してもLineOutからは音が出てない様な気がして。。。

コードの中身を全然追ってないので、根本的に無理なことなのか、それとも、それ用のコードを追加する必要があるのかわかっていないのですが、その辺、なんか情報を頂ければと思っています。

これ用に、自作用のDockコネクターや、安いBTヘッドフォンを注文してしまいました。よろしくお願い致します。

Re: 教えて下さい

こんにちは。

MTM06のときにDockコネクタにつないでSoftmodemを使っているのを見かけました。
DockコネクタのLineOutからの出力はボリュームの影響を受けないので安定していると。
技術的には可能なはずです。
ただこちらではソフトウェアのテストは行っていないので、なんらかの変更は必要かもしれません。
iPhoneのオーディオのルーティング関連を調べてみると何かわかるかも。
こちらのサイトが参考になります。

Objective-Audio - MacとiPhoneでオーディオプログラミング
http://objective-audio.jp/cat54/core-audio-iphone/

Re: 教えて下さい

ありがとうございます。

技術的には可能なはずですよね。まずはsoftmodemのAudio関連のコードがどんな仕組みになっているか勉強しないといかんですね(汗)

Lineout関連で何か進展があったら教えて下さい。

はじめまして

はじめまして.
softmodem,非常に興味深く読ませてもらっています.
ArduinoもsoftmodemのI/Fボードも入手し準備ができました.

iPhoneアプリの方をDLし,ビルドしたところ,
iOS4.2でワーニングが3つほど出てしまいました.

手元にあるiPodTouchが4.2なので,そちらで動かしたいのですが,
一度確認していただくことは可能でしょうか.

現在,developers Programへ登録申請中につき,まだ実機では
テストできていません.

Re: はじめまして

こんばんは。
時間をみてこちらでも確認してみます。
ワーニング程度なら問題なく動作すると思いますよ。

No title

こんにちは.

ようやくdevelopers Programへの登録が完了したので,
Arduino+Softmodem I/FボードとiPodtouchの実機で,
Arduinoのシリアルモニタから試してみました.
しかしながら,結果は残念なものになりました.

・iPodtouch→Arduino
 どんなデータを送っても,"y"の上に点が二つある文字しか出力されませんでした.

・Arduino→iPodtouch
 何を送っても何の反応もありませんでした.iPodtouchのボイスメモアプリを使って,Arduinoの音声出力が出ていることは確認できています.

何か原因のようなものは推定できますでしょうか?

もしかして

オーディオケーブルって何か加工をする必要があるのでしょうか?

Re: No title

とりあえず次のことを確認してみてください。
・4極ジャックを使っているか?
・ケーブル長は長すぎないか?
・iPod touchの音量は最大になっているか?
・ボーレートの設定はiPod touch/Arduinoで合わせてあるか?

オーディオケーブルの加工は必要ありません。
iPod touchは新しいやつですか?

ボード違い?

こんにちは.色々とありがとうございます.
以下の点,確認してみました.

・4極ジャックを使っているか?
 →OKです.4極のものを使っています.
・ケーブル長は長すぎないか?
 →OKです.他の皆さんが使っている1.5mです.
・iPod touchの音量は最大になっているか?
 →マイクのボリュームは見当たらないので不明ですが,
  ヘッドホンのボリュームは最大にしています.
・ボーレートの設定はiPod touch/Arduinoで合わせてあるか?
 →サンプルプログラムのまま使ってます.
  一応コードを確認したところ,どちらも1225bpsになっていました.

iPod touchは第4世代で一番新しいやつです.

一つ考えられるのでいうと,Arduino本体です.
今はUNOを使っています.UNOはFTDIのシリアルコンバータをつかっていないとか.
もしかするとここかなと思ってますが.
Duemilanoveも入手してトライしてみます.

Re: ボード違い?

んー。なんだろう。あとはiOSのverぐらいかな。。
UNOとDuemilanoveは確かにUSBシリアルのチップは違うけど、特に問題はなさそう。
PC<->Arduino間のボーレートが間違ってる?
あとはIDEのverかな。試しに0021を使ってみてください。

Re: ボード違い?

こちらでもUNOで確認してみました。
シリアルモニタから送った文字が化けることがありました。
もしかしたらですが、PCとArduino間のボーレートを下げるとうまくいくかもしれません。
サンプルでは57600bpsになっていると思いますが、9600bpsまで下げて試してみてください。

Re: Re: ボード違い?

Arduino IDE側の問題かもしれません。
0022で以下のような修正が行われたようです。
0022+UNOで57600bpsでうまく行くことを確認できました。

* Modification of serial baud rate calculation to match bootloader and 8U2
firmware at 57600 baud.
http://code.google.com/p/arduino/issues/detail?id=394

http://arduino.cc/en/Main/ReleaseNotes

あとは受信だけ

色々と調査してくださって、ありがとうございます。
こちらでも0022+UNO&57600bpsで、
iPodtpuch->Arduino
の通信は確認できました。

しかしながら
Arduino->iPodtpuch
が全くもって無反応な状態です。
ボイスメモでの確認はどうも間違っていたようで、
反応していたのはオーディオケーブルによるマイク接続を認識しておらず(?)
外に出ているマイクが音を拾って反応していただけのようです。
Arduinoから送信する際、softmodemにヘッドフォン等を
繋いでいれば、音は確認できるものでしょうか。
今のところ、softmodemにヘッドフォンを繋いでも、
何の音も聞こえない状態です。
(もちろんArduinoのRxは反応するので、
PCからArduinoには通信ができているようです。

通信できました

おかげさまで、
Arduino<-->iPodtouch#4
で、無事通信することができました。

根本的な原因は不明ですが、オーディオケーブルが
ちょっと悪さをしていたようです。
いつも以上に、しっかりとイヤフォンジャックに差し込んで、
通信できるようになりました。

ようやく本題のiOSアプリの開発に着手できます。
色々とありがとうございました。

Re: 通信できました

うまくいったようでよかったです。
面白いアプリができたら教えてくださいね。

タブ化による受信不能について

再び失礼します。
iPhoneアプリ開発の際、Softmodemをタブ化したところ、
Arduinoへの送信はできるのですが、受信ができません。
何か/どこかの参照漏れのような気がするのですが、
いろいろ試してみるものの原因が分かりません。

ちなみにタブ化は下記サイトを参照にして、
http://blog.livedoor.jp/second_flush/archives/51136450.html
元々のサンプルプログラムのMainWindow.xibをタブコントローラにして、
MainViewContorollerをタブの1つにしています。

何か気付く点がありましたらご教授願います。

Re: タブ化による受信不能について

受信できないということですが、
恐らくreceivedChar:が呼ばれていないのではないかと予想しています。

SoftModemTerminalAppDelegate.mのdidFinishLaunchingWithOptions:でレシーバを登録していますが、
登録しているコントローラにreceivedChar:が正しく実装されているか確認してみてください。

あとレシーバを正しく登録しているか、確認してみてください。

No title

早速の回答,ありがとうございます.
『receivedChar:が呼ばれていない』というのを想定して,
MainViewController.hでグローバル変数(char input_data)を宣言して,
MainViewController.mでreceivedChar:内のinputの値をtextReceived.textに格納している行の下に,
input_data = input;
として,デバッガで確認したところ,正しくinputの値がinput_dataに
格納されている(更新されている)ことが確認できました.

となると,receivedChar:は呼ばれているのではないかと思うのですが.

ただ,値は更新されているものの,やはり画面には出てきません.
connectionsの設定ミスでしょうか?

Re: No title

receivedChar:が呼ばれているということは、
ソフトモデム側の処理としては正しく動作しているということですね。
そうするとあとはアプリケーションソフト側の問題だと思います。
receivedChar:にブレークポイントをはって、
ステップ実行してみてはどうでしょう?
1ステップずつ実行すれば問題はすぐ見つかると思いますよ。

No title

やはりアプリケーションソフト側の問題ですよね.
ブレークポイントを張ってやってはみたものの,
やはりなぜ画面に出ないのか,分かりませんでした.
このやり方はあきらめざるを得ない状況です.

度々のご助言,ありがとうございました.

Re: No title

UIを変更しているということなので、
恐らくIBOutletのリンクが切れているだけだと思います。
その辺を重点的に確認してみてはいかがでしょう?

No title

アドバイスありがとうございます.
もう少し調査してみます.

No title

ご無沙汰しております.
その後の調査の結果,やはりIBOutletが怪しいと言うところまでは
たどり着けました(と言うわけで未だ未解決).

確認方法として,MainViewController.mに,
ボタンを押すと数字が1つずつ加算されるIBActionを追加しました.
実行してみたところ,ボタンは反応するものの,
カウントアップするはずの数字が初期値(0)のままになってます.
おそらく受信データが表示されないのと同じ原因ではないかと思っています.
ちなみにアウトレットとアクションの宣言はMainViewController.hで宣言しています.

とりあえずこの例題の解決を目指してしばらく頑張ってみます.

No title

解決しましたっ!
結局,アウトレットの問題ではなかったようです.
receivedCharで受信データの表示までするとNGでした.
そこで新たにタイマー起動する関数を作って,
そちらで表示をさせることにすると無事表示できました.

実は受信したデータを数値として読み取り,計算をして出力したいんですが,どうしても文字として見てしまいます.
("1"と入力すると"49"と出力される.)

receivedChardeで行っている受信処理が何が行われているかわからないのですが,空白検出以外のところは何をやっているのでしょうか?



Re: No title

receivedCharはメインスレッドで呼ばれるので、
特に問題なさそうですけど、、なぜでしょうね。
とりあえず解決してよかったです。

receivedCharではUTF8文字コードかどうか判定しています。
UTF8は日本語など3バイトで表されるので、
3バイトたまるまで表示しないようにしています。

No title

receivedCharのtextRecived.txetへのデータ格納が終わったあと,

int data = [textRecived.txet intValue];
で数値化し,
data_value = data;
で値を入れ替えて,
タイマー起動の関数で
data.text = [NSString stringWithFormat:@"%d", data_value;]
でiPhoneに画面出力をさせてみました.

すると,Arduinoから入力した値が結合されて表示されてしまいます.

"1"と入力すると"1"が出力される.
"2"と入力すると"12"が出力される.
"3"と入力すると"123"が出力される.

何か解決方法はありますでしょうか?

Re: No title

textRecived.txetには連結された文字が入っているから当然の結果ですね。
単純に数値をArduinoから送信、iPhoneで受信したい場合は、
数字で送らず、数値で送れば良いと思いますよ。

int value = 100;
modem.print(value, BIN);

この場合、数値は0~255(1byte)の範囲でしかおくれません。

No title

なるほど.
でも,Softmodemでは,
"1+(send)"と入力すると"1"が出力される.
"123+(send)"と入力すると"123"が出力される.
という処理が実現できているかと.

そのデータの切り分けは,receivedCharのif文で判断していると思っていたので,
そのif文の外であればreceivedCharの中でも大丈夫だと思ったのですが.

送信するデータは1byteで十分なので問題ありません.
教えていただいた方法でトライしてみます.

No title

度々すいません.

modem.print(value, BIN);

という関数が見当たらないんですが,
どこにあるのでしょうか.

Re: No title

SoftModemクラスはprintクラスを継承しているので、
Serialクラスと同じようにprint関数が使えます。

No title

よく考えたら,今はテスト段階なので数値でも良いんですが,
ある程度まとまった文字列を送信して,
受信したiPhoneで文字列分解,解析(変換),表示というのをやりたいので,
modem.printではダメですよね.
となるやはり今トライしている方法で何とかしないといけないですね.

1桁だと表示できるんですが,2桁だと1の位しか表示されません.
もう少し試行錯誤してみます.

Re: No title

送りたいデータを構造化し、iPhoneで解析するようにすればうまくいくと思いますよ。
文字で送るなら改行でデータを区切るとわかり易いと思います。
数値で送るなら開始マーク+固定長データバイトが簡単かと思います。

複数台に拡張

はじめまして.
SoftModemを利用させてもらおうと思っています.
現状ではArduino1台とiPhone1台の通信ですが,拡張してArduino1台とiPhone複数台の通信をしたいのですが,arms22さんのArduino側のライブラリに少し手を加えることでそういったことは可能でしょうか?(例えばiPhoneからの信号を受信する端子を変えるだけなど)
それともあまり現実的ではないでしょうか・・・

Re: 複数台に拡張

kyonさん

softmodemはArduinoに搭載されているAVRマイコンの
ハードウェアの機能(アナログコンパレータ)を利用しています。
その為、同時に2つの信号を受信することはできません。

Arduinoを複数台用意して1台をマスターに、残りをスレーブにして
iPhoneと通信させるなどできないでしょうか?

またケーブルを束ねて複数のiPhoneから時分割でデータを送って
やればそれぞれ受信できると思います。
送信はすべてのiPhoneに届いてしまいますが。

Bluetoothって使えるんですか?

役立つ情報ありがとうございます。
ところで、

> 通常、iPhoneとマイコンを通信させたい場合、Wi-FiかBluetoothを使うことになる。

と書かれていますね。Wi-Fiならできるのは分かりますが、Bluetoothでマイコンと通信できるとは初耳です。
できれば実際に通信可能なマイコン製品名をお教えいただけませんでしょうか。
本題からそれてしまって申し訳ありません。

Re: Bluetoothって使えるんですか?

こういった無線モジュールを使えばどんなマイコンでも通信できます。

BluetoothモジュールRBT-001
http://www.switch-science.com/products/detail.php?product_id=575

Re: Bluetoothって使えるんですか?

> こういった無線モジュールを使えばどんなマイコンでも通信できます。

> BluetoothモジュールRBT-001

お答えくださり、ありがとうございます。

リンク先を見てみましたが単なるSPPのモジュールのようです。
私もSPPモジュールは使ったことがあるのですが、iPhoneとは通信できませんでした(Android, Windows, Macでは可能)。
標準状態のiPhoneではSPPをあつかうAPIが公開されてないので使えないと思うのですが、実例が掲載されたホームページなどがあれば教えていただけませんか。
(Googleで探しても見つけ出せませんでした。)

Re: Re: Bluetoothって使えるんですか?

あら?SPPは使えないんですね。残念。
それならHIDデバイスのフリをするというのはどうでしょう。

Re: Bluetoothって使えるんですか?

> あら?SPPは使えないんですね。残念。
> それならHIDデバイスのフリをするというのはどうでしょう。

HIDにしても、アプリから汎用の入出力としては使えないですね。
結論、Bluetoothは(簡単には)使えないので、SoftModemを使いましょう。て、ことで。

ありがとうございました。

Re: Re: Bluetoothって使えるんですか?

ヤマハのMIDIアダプタを使うという手もあるみたいですよ。
少々値ははりますが。

上手く動かなくなりました

miconoといいます
以前質問させて頂いたことがありますが、
現在環境は
初代のsoftmodem
Arduino 0022
Mac OS X 10.6.8
iPhone 3GS (iOS5beta2)
コモンの1.5m 4極プラグ
です。
以前は上手く受送信できていたのですが、久しぶりに動かしてみたら、Mac(Arduino)からsendしたデータはiPhone(音響電文)で受け取れるのですが、iPhone(音響電文)からsendしたデータが無反応です。
このような状況の場合、どこをチェックすると原因がわかるでしょうか?よろしくお願い致します。

Re: 上手く動かなくなりました

とりあえずiPhoneのボリュームを確認してみてください。
それとArduino側とiPhone側の通信速度の設定があっているか確認してみてください。

あとはMacのマイクに音声端子をつないで、録音してみて、
音声波形がちゃんとでているか確認してみてください。

Re: 上手く動かなくなりました

お返事遅くなりました。
まだうまくいってません。
何か進展したらまた書かさせて頂きます。

Androidはうまくいくのに

miconoです。androidを入手したのでまた久々にやってみました。
現在環境は
softmodemインターフェイス2
Arduino 0022
Mac OS X 10.7.1
iPhone 3GS (iOS5beta7) or iPad 2 (iOS4.x) or GALAPAGOS A01SH
コモンの1.5m 4極プラグ
です。
配線して、音響電文を起動させて、マックからiPhoneに受信できることは確認できますが、iPhoneからマックには送信できませんでした。そのままプラグを外して、Androidマシンに繋ぎ変えて
http://side2.jp/apps/softmodem-terminal/
のアプリでAndroidからマックに送信すると送信できました。
あとiPad2でもiPhoneと同様に送信はできませんでした。

マックに送信できない原因は
 iPhone/iPadに問題がある?
 音響電文に問題がある?
 その他?
何か知恵を下さい。

Re: Androidはうまくいくのに

Mac側のマイクの入力感度を変えてみてください。
システムパネルのサウンドの入力にあったはず。
あ、あとサウンドの入力がマイク入力になっているかも
合わせて確認してみてください。

それとMacBookの場合、マイク入力の端子がiPhoneと同じ4極なので
その辺で何か問題があるのかも。

Re: Androidはうまくいくのに

ありがとうございます。

iPhone<->Softmodem<->Arduinoボード<->Arduinoアプリ(シリアルモニター)と繋がっていて、

iPhoneからマックに送って反応しないのは、マックのサウンド入力が関係するのでしょうか?

スケッチでいうと読み込み(int c = modem.read();)
がiPhoneから送信したデータを読込んでくれませんが、Androidから送信したデータは読込んでくれます。

いちおうiPhoneのボリュームは目一杯に上げてあります。

Re: Re: Androidはうまくいくのに

iPhoneからマックにとありましたので、エミュレータで動かしているのか思いました。
iPhone⇔Arduinoの場合、マックのサウンド入力は関係ありません。

AndroidでうまくうごいてiPhoneだめとのことで、
以下の点をもう1度確認してみてください。

・iPhoneとArduinoの通信レートは一致しているか?
・AndroidとiPhoneの音声出力レベルをマックで確認

あとはiOS5になって音声出力がでてないのかも。

Re: Re: Androidはうまくいくのに

早々ありがとうございます。

>iPhoneとArduinoの通信レートは一致しているか?
これはデフォルトのままです。
音響電文は確か1225でしたっけ?
Softmodem.hも
#define SOFT_MODEM_BAUD_RATE (1225)
です。

>AndroidとiPhoneの音声出力レベルをマックで確認
これは単純に4極プラグ付けないで音を聞くのではダメでしょうか?

>iOS5になって音声出力がでてないのかも。
iOS5でも4極プラグ挿さないで音は聞こえます。
iPad2 iOS4の最新のものでも上手くいってません。

少しリクエストで、
softmodem.cppで受信と送信の速度を別々の設定にできないか?ということと、音響電文でも受信と送信の速度の設定ができるようにならないか?
可能でしたら対応して頂けると便利になります。

Re: Re: Re: Androidはうまくいくのに

プラグを接続した状態で音が出ていない可能性がありますので、
プラグを挿した状態を確認してみたいですね。
iPhoneから出力される音声波形に問題があるかもしれませんし。

> 少しリクエストで、
> softmodem.cppで受信と送信の速度を別々の設定にできないか?ということと、音響電文でも受信と送信の速度の設定ができるようにならないか?
> 可能でしたら対応して頂けると便利になります。

そうですね、送受信で速度は変更したいところですね~。
ただデベロッパライセンスが切れちゃったので、
しばらくアプリ作れない。。

Re: Re: Re: Androidはうまくいくのに

>音が出ていない可能性
>iPhoneから出力される音声波形に問題

分かりました。また少しあれこれやってみます。

>ただデベロッパライセンスが切れちゃったので、
あら残念。気長に待ってます。
どうしても必要にかられたら自分でやってみます。

スケッチの方のSoftmodem.cpp/h だけでも、受送信それぞれ速度設定できるようになっていると嬉しいです。Androidの方が送信は1225で可能だけど、受信が315でしかできないので。。。

SoftModemTerminalアプリ

なんだかたびたび申し訳ありません。
Xcode 4.2 GM seed (Lion)版で、
SoftModemTerminalをコンパイルしてみたら、
lockfree.hにエラーが起きて、ダメでした。
どこがいけないのか分かったら教えて下さい。

教えてください。

Arduino で GPSデータを 音声出力として 市販の トランスミッタ
の オーディオ端子に 入れ ワイヤレス送信できるのでしょうか。
受信機の オーディオ出力端子から スマホなどでデータを読み取ること
できるのでしょうか。

Re: 教えてください。

可能だと思いますが、試したことはありません。

はじめまして

はじめまして!
以下実装環境でSoftModemTerminalを動かしてみたのですが、
Arduino->iPhoneがうまくいきませんでした。
(iPhone->Arduinoはうまくいきます)

・Arduino 1.0.5
・Xcode 5.0.2
・iPhone5s
・iOS 7

あやしいなと思う点は、

①FSKRecognizerにて、CharReceiverをdelegateしたMultiDelegateがインスタンス化されていない
 →receivers = [[MultiDelegate alloc] init];でIncompatible pointerのwarningが出ています

②SoftModemがインプットをハンドルできていない
 →コードを深く理解していおらず申し訳ないのですが、イヤホンジャックからのインプットはAudioSignalAnalyzer.mのrecordingCallbackでハンドルして[analyzer edge:]をフックにFSKRecognizerクラスで解析処理をしているように思うのですが、この分岐に入らないみたいです....これがポーレートの問題なのか、SoftModem自体の問題(はんだジャンパーがミスしてる等)なのか判断できない状況です。

お手数ですが、ご教授いただけると幸いです。

はじめまして

↑追記

実験していて気づいたのですが、4極オスオスケーブルを差し込んだままでも、iPhone5S本体にあるマイクから音が取れているようなのですが、これだとケーブルからは音声データとれませんよね....

ちなみにiPhone4でも同じ現象でしたmm
(ボイスメモアプリをつかって確認)

No title

マイク入力が認識されていないっぽいね。マイク入力の負荷抵抗の値を変えて、うまく認識する値を探してみてー。

No title

ご返信ありがとうございます。
iPhone->Arduinoは、とくに回路を意識せずにうまくいったので、抵抗をしっかり組んでいませんでした。

http://blog-imgs-43-origin.fc2.com/a/r/m/arms22/iPhoneSoftModem2.png
こちらを参考に、マイク入力は組んでみたいと思います。

ついでに回路初心者で申し訳ないのですが、SoftModemインターフェースボード2を使っておりますが、ボリューム(?SoftModem1の水色の部分。回路図ではAIN1に接続)がないとマイク入力はとれないのでしょうか?


No title

ボリュームはArduino側の入力レベルを調整するための部品なんだけど、現在の実装だと抵抗は固定値になってるよ。FSKINとAIN1の電位差が100mVぐらいになるような値を選んで実装するればOK。

http://e-skett.co.jp/nyumon/20130611

↑の記事だとマイク入力用の抵抗(R1)は6Kになってるね。

No title

ありがとうございます!
もし現在の実装verの回路図がありましたら、頂けると助かります!

外部資料もわかりやすいものを頂きまして、ありがとうございます。
抵抗やコンデンサ等諸々部品が足りないようなので、土日に取り組んでみます!

No title

インターフェース2013年8月号に詳しい解説が載っています。
ここに回路図もあったはず。。

iPhoneもOK! 1kbpsていどならFSKでできる
実験研究! オーディオ・ジャックでスマホとI/O

http://www.kumikomi.net/interface/contents/201308.php

No title

いろいろ試してみましたが、Softmoemインターフェースボード2 (http://www.switch-science.com/catalog/600/) × iPhone 5sはMicがとれないという結果に終わってしまいました。。

原因としては、マイク認識用の抵抗が15Kとhttp://e-skett.co.jp/nyumon/20130611 に比べてかなり大きいことだと思います。

(http://www.kumikomi.net/interface/contents/201308.phpでは10Kでしたが、実測値では15Kでした)

マイク認識抵抗はSoftmoemインターフェースボード2上だと、イヤホンジャックをの接続直後の抵抗(R3)なのですが、ここの抵抗の値だけ小さくするって可能なのでしょうか...?

No title

R3抵抗と並列に抵抗をつければ抵抗値が下がって認識するかも。

No title

それは、Softmoemインターフェースボード2上の切れ目(はんだジャンパ箇所)のすぐ横のMICにはんだをもって抵抗をつける的なイメージですか??

No title

すいません、聞き方が悪かったです。
Softmodemインターフェイスボード2上で実装したいのですが、R3抵抗は基盤上にあるため、どのようにすれば並列接続できるかイメージできてないです。。
(Arduinoはじめたばかりで、ブレッドボード以外で簡単に実装するほうほうがわかってないです)

お手数おかけしますが、よろしくお願いします。

No title

1/6wとか小さい抵抗を買ってきて、チップ抵抗の両端に買ってきた抵抗の足をはんだづけすればいいんじゃないかな?

No title

mic端子とgndでもいいかも。

なるほど!チップ抵抗というのがあるんですね。。ブレッドボードに縛られ過ぎてました。
micとgndならブレッドボードでもチップじゃない抵抗でもいけそうな気がしてきたので、やってみます

Secret

Ads by Google
最近の記事
カテゴリ
Arduino (114)
電子工作 (114)
スタバッテルミン (5)
スタバカップアンプ (18)
電光掲示板 (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プリンタ (36)
Amazon.co.jp
最近のコメント
arms22:Arduinoで遊ぼう - SDメモリカードを読み書きする(廃止) (09/09)
nisi:Arduinoで遊ぼう - SDメモリカードを読み書きする(廃止) (09/04)
三ツ星トラフィック: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)
リンク
Ads by Google
以前の記事
プライバシーポリシー
当サイトでは、第三者配信による広告サービスを利用しています。このような広告配信事業者は、ユーザーの興味に応じた商品やサービスの広告を表示するため、当サイトや他サイトへのアクセスに関する情報 (氏名、住所、メール アドレス、電話番号は含まれません) を使用することがあります。このプロセスの詳細やこのような情報が広告配信事業者に使用されないようにする方法については、ここをクリックしてください。