My favorites | Sign in
Project Home Downloads Wiki Issues Source
Search
for
SoftModemBreakoutBoard  

SoftModemインターフェースボード

SoftModem BreakOut Board

iPhoneのオーディオ端子を使ってArduinoと通信するためのインターフェースボードです。

iPhoneからArduinoへ、ArduinoからiPhoneへデータを送ることができます。通信速度は1225bpsです(※実際のデータ転送レートはもう少し低いです)。センサー情報やスイッチ入力など少量のデータ通信に向いています。

半完成品です。ピンヘッダもしくはピンソケットをハンダづけして使います。

寸法:25 x 25mm

スイッチサイエンス/商品詳細:SoftModemインターフェースボード

応用例

AndroidでSoftModemを動かしています: AndroidでSoftModemを試してみた

Android用のSoftmodem Terminalアプリケーションです: Softmodem Terminal for Android

Androidで一眼レフカメラのシャッターを制御しています: Androidで一眼レフカメラのシャッターを制御する

JavaScriptで通信用の音声ファイルを作成、再生させてデータ通信を行っています: SoftModemインターフェースボードとJavaScriptで通信

RFID Tagリーダーを製作されています: iPhone RFID Tag Reader

制限

  • オーディオ端子を使った通信のため、時々データが壊れることがあります。チェックサムやリトライ処理など組み込むことを検討してください。
  • iPhoneの音量は最大にして使って下さい。

接続

iPhoneとの接続には4極オスオスケーブルをお使いください。ケーブルによってはクロストークが発生し、通信エラーの原因になります。金メッキ端子のシールドされたケーブルをお使いください。ケーブルの長さは短ければ短いほどよいです。

Arduinoとは次のように接続します(右側がArduinoの端子)。

  • FSKOUT→D3
  • GND→GND
  • VCC→VCC
  • FSKIN→D6
  • AIN1→D7

ボリューム調整

Arduinoの電源電圧に合わせて調整します。AIN1の電圧をテスターで計り、(VCC / 2) + 300mVになるよう調節します。

  • 5V電源の場合、2.7V
  • 3.3V電源の場合、1.95V

Arduinoライブラリ: SoftModem

SoftModem-004.zip

サンプルスケッチ

#include <SoftModem.h>
#include <ctype.h>

SoftModem modem;

void setup()
{
  Serial.begin(57600);
  delay(1000);
  modem.begin();
}

void loop()
{
  while(modem.available()){
    int c = modem.read();
    if(isprint(c)){
      Serial.println((char)c);
    }
    else{
      Serial.print("(");
      Serial.print(c,HEX);
      Serial.println(")");      
    }
  }
  if(Serial.available()){
    modem.write(0xff);
    while(Serial.available()){
      char c = Serial.read();
      modem.write(c);
    }
  }
}

注意事項

  • ライブラリ内でハードウェアタイマ2、アナログコンパレータを使用しています。その為、これら機能をアプリケーション側で使うことはできません。
  • tone関数は使えません。

iPhoneアプリ: SoftModemTerminal.app

SoftModemTerminal-004.zip

SoftModemTerminalはシンプルなiPhone用のターミナルアプリです。前項のサンプルスケッチを書き込んだArduinoと英数字の送受信が行えます。iPhoneのオーディオ端子に何も接続していないと内蔵スピーカーから大きな音がでるので注意してください。

現在、SoftModemTerminalはAppStoreで配布していません。ソースコードをダウンロードし、ご自身でビルドして使って下さい。

SoftModemTerminalのビルドにはXcodeとiPhone SDKが必要です。XcodeはMacOSXのインストールDVDに収録されています。またAppleの開発者ページでもダウンロードできます。

iPhone SDKはAppleの開発者ページで開発者登録を行うとダウンロードできます。アプリケーションをiPhone実機で動作させるには有償のiPhoneデベロッパプログラム(年間¥10,800)に参加する必要があります。

音響電文

SoftModemTerminal.appがAppStoreからダウンロードできるようになりました。iPhoneアプリケーションの開発環境をお持ちでないかたは次のURLからアプリケーションをダウンロードしてください。

http://itunes.apple.com/jp/app/id385096654?mt=8

iPhoneソースコードの使用方法

現在、iPhone側のSoftModemのソースコードはフレームワーク化されていません。あなたのプロジェクトでSoftModemを使いたい場合、SoftModemTerminalからSoftModemに関連するソースコードをコピーしてくる必要があります。次のリストはSoftModemに関連するソースコードの一覧です。これらのソースコードをプロジェクトフォルダにコピーしてください。

  • AudioQueueObject.h
  • AudioQueueObject.m
  • AudioSignalAnalyzer.h
  • AudioSignalAnalyzer.m
  • AudioSignalGenerator.h
  • AudioSignalGenerator.m
  • CharReceiver.h
  • FSKModemConfig.h
  • FSKByteQueue.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];

ドキュメント:

その他の情報


Arduinoをはじめようキット
スイッチサイエンス

売り上げランキング: 945

Prototyping Lab ―「作りながら考える」ためのArduino実践レシピ
小林 茂

オライリージャパン

売り上げランキング: 4572

iPhone Core Audioプログラミング
永野 哲久

ソフトバンククリエイティブ

売り上げランキング: 14085

Iphone Hacks
Iphone Hacks
posted with amazlet at 10.07.24
David Jurick Adam Stolarz Damien Stolarz

Make Books

売り上げランキング: 10806


Copyright © なんでも作っちゃう、かも。 All Rights Reserved.

Comment by project member arm...@gmail.com, Aug 2, 2010

コメントテスト。

Comment by lilac...@gmail.com, Sep 1, 2011

Softmodem2を購入させていただきました。PUT SOLDERを半田して、iPhoneアプリをXcodeからインストールし、Arduinoと通信を試みています。iPhoneからの送信ではArduinoのSerialMonitor?で文字化けします。逆にArduinoのSerialMonitor?からiPhoneへは反応がありません。 なにかヒントをいただければと思います。よろしくお願いします。

Comment by kjw3...@gmail.com, May 16, 2012

@lilac 1. iphone to serial monitor : arduino serial monitor must set (57600 baud) then work well 2. arduino serial monitor to iphone is not work to me

Comment by kjw3...@gmail.com, May 16, 2012

@lilac 2. if you use 3pole cable then use 4pole cable


Sign in to add a comment
Powered by Google Project Hosting