小ネタ 2008-010

iPod用のリモコンを使ってiPhoneのシリアル通信ができるか


1. iPhone/iPod touchのDockコネクタで、自作の周辺機器を制御するには

 Dockコネクタには以下の信号線が出ている。
 ・USB / FireWire
   USBとFireWireは、iPhoneを周辺機器として使うためのもので、逆にiPhoneに周辺機器を繋ぐのには使いづらい。
 ・Video-Out / Audio Line-In / Line-Out
   映像出力や音声入出力については、制御信号ではないので使えない。(マイク自作等の例は存在する)
 ・Serial TXD / RXD
  リモコン用のシリアル通信用の信号線が出ており、これは自作の周辺機器の制御に使えそうだ。

 リモコン用のシリアル信号を周辺機器の制御に使うには、自作ソフト(勝手アプリ)開発が必要である。
 iPhone/iPod touch以前のiPodでは、iPod Linux等をインストールしないと自作ソフトが動かせなかった。
 iPhone/iPod touchでは、MacOS Xの組み込み版がOSとして載っており、Macと同じようにBSD系のUNIXマシンのように使用できる下地がある。
 iPhoneのhackのおかげで、勝手アプリの開発が既に可能になっている。
 公式のiPhone SDKも開始されているが、こちらはDockコネクタを自由に使うことができないそうだ。

 既にいくつかシリアル通信機能を使った電子工作の実例が存在する。
 noviという方が、ウィルコムのデータ通信PHSモジュール"W-SIM"をiPod touchに接続する電子回路を自作されている。
 これを見て、自分でもやってみようと思った。



2. iPod用リモコンを分解してみる

 自分でも自作回路を作るために、参考のため、まず最初にリモコンの分解をしてみた。

 

 ケーブル部分の配線は以下のとおり。
 ・Audio-out L/R
 ・Audio GND
 ・電源+3.3V (iPod本体からリモコン用の電源を取ることができる)
 ・GND
 ・Serial RXD
 ・Accessory Indicator (周辺機器の判別用)

 リモコンのシリアル通信の配線は、リモコン側からiPod側へのRXDの配線のみで、逆方向のTXDの配線が無い。
 そのため、リモコンのケーブルを途中で切断してそのまま他の周辺機器用に使うことはできない。
 Dockコネクタの根本の部分を分解して信号線を取り出す必要がある。



3. USB-UARTキットを使ってPCと接続してみる

 実は、最初にnovi氏の方法を見て、自分でもW-SIMの接続回路を作ってみたのだが、うまく動かせなかった。
 W-SIMの代わりにUSB-UARTキットを使ってPCと接続してみた。

  

 使用したUSB-UARTは、FTDIのFT232RLというICを使用した電子工作キットをそのまま使った。ツール工房というところのキットである。
 iPhoneとの配線は、TXDとRXDとGNDのみ。
 上記の写真では間違って3.3V電源どうしを接続してしまっているが、これは間違い。

 iPhone/iPod touchには、VT-100ターミナルソフトと、jermというソフトをインストールした。
 VT-100は、iPhoneをコマンドラインで使用するための端末用ソフトである。Installer.appからインストールできる。
 jermは、通信ソフトである。novi氏の方法を参考にインストールした。
 一応、自分がビルドして使ったバイナリを置いておく。 [ jerm.zip ]
 jermの起動は、jerm /dev/tty.iapとコマンド入力した。
 /dev/tty.iapというのがリモコン等のアクセサリ用ポートである。

 PCには、TeraTermというターミナルソフトをインストールして使った。UTF-8 TeraTerm Proというやつを使った。
 ソフトの通信設定を以下のようにした。
 ・通信ポート番号を、USB-UARTを接続したCOMポートに設定
 ・通信速度は、9600bps
 ・受信改行コードは、LF
 ・送信改行コードは、CR+LF

 PC側から文字を送信したところ、iPod touchで受信できていることが確認できた。(画面写真でTESTという文字を受信している)
 逆方向も試して、Pod touch側のソフトウェアキーボードで入力した文字が、PC側で受信できていることも確認できた。


 iPod touchでは特に問題なくUSB-UARTでシリアル通信することができたが、iPhoneでは次のような問題が起きた。
 
 USB-UARTの回路を接続すると、iPhoneの画面に上記の警告画面が出る。(リモコンを接続しても同じように表示が出る)
 とりあえずNoと答えて、あとはiPod touchと同様にjermを起動すると、ちゃんと通信できた。



 一説によると、iPhoneでシリアル通信をするときには、接続時にpin11に何回か500msecのHi/Low信号を出力しないといけないらしい。
 しかし、これをしなくても双方向に通信することができた。(なぜ?)




(後日加筆 2008-08-11)

iPhoneに接続した場合に上記の警告画面が出る原因を調べて、対策方法を考えてみた。


pin11に何回かHi/Low信号を出力すればよいという情報があり、試してみたのだが駄目だった。

推測なのだが、初期のファームウェアではこの方法で信号を出力しないと警告画面が出て、なおかつ受信動作をしないようにロックがされていたのだと思われる。しかし、この警告画面が予期しない場合に誤作動するケースがあったようで、動作が変更されたのではないだろうか。ファームウェアのいくつ以上のバージョンからなのかは分からないが。

実際、警告画面が出ても双方向に通信はできている。初期の古いファームウェアだとロックされるのではないかと思うのだが確認できていない。

pin11でリモコン系のハードウェアを接続したのかどうかを判定しているのはたぶん古いファームウェアでも一緒なのだが、新しいファームウェアだと、最初の数秒のみだけでなくずっとpin11の電圧を監視しているようにみえる。そのため、最初にHi/Lowを出力している間は警告画面が出ないのだが、それを止めると警告画面が出てしまう。


pin11の電圧がGND(0V)かどうかを監視しているようなので、pin11に0.6Vの電圧を加えるのを試したところ、警告画面が出なくなった。
テストした回路は以下の回路図のとおり。
 

この回路でiPhoneと双方向の通信をすることができた。
特に変な細工はしなくてよくなった。

実際には、抵抗値はありあわせの可変抵抗で実験した。この抵抗値や電圧0.6Vが最適なのかどうかはわからない。
ひょっとするとこれから先にファームウェアのバージョンが上がったときや後継機種では状況が変わって動かなくなるという可能性もある。

(後日加筆 19番ピンと20番ピンは未接続で試した。iPhone内部でたぶん接続されているので19番ピンと20番ピンを外部で接続してもあまり関係ないようだが、接続している場合が多いようだ。)
(後日加筆 21番ピンは未接続で試した。このピンに接続されている抵抗で周辺機器の種類を判別するらしいのだが、iPhoneの場合にはあまり関係ないのかもしれない。)


初代iPhoneでしかテストしていない。iPhone-3Gではどうなんだろうか?




(後日加筆 2008-09-07)

iPhone(2G)とかiPod touch用にシリアルポート接続のGPSを作っている途中で、いくつかのコネクタを試しているのだが、その過程でおかしな現象に気が付いた。
 
 左の安いタイプのコネクタで配線すると、3.3Vの電源が出ない。Dockコネクタ部品は多少の外観の差があっても基本的には全部同じもののはずなのに、同じに動作しないのは変だと思った。

もう一つ追加でコネクタ部品を入手して調べてみた。
 
 このケーブルを分解して取り出したコネクタは、配線して問題なく動作した。

これらのコネクタ部品を比較して詳しく調べたところ、動作しなかったタイプのコネクタ部品だけ他のものと異なっている点を見つけた。
コネクタのピンは基板に半田付けするために上下2列に分かれているのだが、奇数番目のピンが上側の列で偶数番目が下側という分け方が、逆になっていた。
基板への半田付けの部分が、表側のピンと裏側のピンが全部入れ替わっている状態となる。
シリアル通信の回路を自作するときには、こういう種類のDockコネクタ部品もあるということに気を付けないといけない。


(後日加筆 2011-07)
 RS-232Cケーブルが発売されるそうだ。
 Make!: $59 Cable Lets You Connect iPhone to Arduino - No Jailbreaking!


- See Also -

iPad/iPod touch用のGPSを試してみる
iPhone/iPod touch用のGPSの製作
iPod nano用のスピーカーDockをiPod touch用に改造
iPhoneの勝手アプリをインストールする方法
iPhoneでアプリを作ってみる - 開発環境準備
iPod Miniのコネクタ