工作してみた(みる)
iPod Dock を作る(nano用)
table of contents
ということで(なにがだ)、学研真空管アンプを「変形」してみるなどということをやっていてそこに手持ちのiPod nano 第一世代と第五世代のdockを載せたくなったので、まずは単体でdockを作ってみようというページ。この無駄な時間を楽しみたい。アクリル加工の経験も積めるかもしれない。
上のページにも書いたんですが、あれこれやった結果、下のような結線をすれば、第一世代と第五世代のnanoを共通dockで動かすのは出来そうであります。
| Pin(Dock側) | 信号 | 第一世代 | 第五世代 |
|---|---|---|---|
| 2 | GND | n/a | n/a |
| 3 | Line Out右 | n/a | n/a |
| 4 | Line Out左 | n/a | n/a |
| 11 | GND(Serial GND) | n/a | n/a |
| 13 | Serial RxD | n/a | n/a |
| 16 | GND(USB) | n/a | n/a |
| 21 | シリアル通信時500KOhmをGNDへ | n/a | n/a |
| 23 | 5VDC(USB) | 充電時結線 | 同左 |
| 25 | Data(-) | 充電時33KOhm/20KOhmで分圧し2V | 同左でOK |
| 27 | Data(+) | 充電時33KOhm/49KOhmで分圧し3V | 同左でOK |
スペック
- 充電が可能。
- Line Out出力を(1)auxと(2)トライステート Web Radioを「加工」してみるでやったようにFMトランスミッタ(好きだなあ)で切り替え出来ること。ひょっとしたらアンプを組み込むかもしれないのでそのばあい、3出力の切り替えとなる。
- シリアルでのコントロールをつける。Apple Accessory Protocolでいうところの、Mode 2の機能。
コントロールテスト
テストはArduinoでやるのが簡単。racotanaさんのライブラリを御借りして添付exampleでやってみました。
racotanaさんライブラリexampleの結線
Arduino iPod
GND+---------------+2pin---GND
+11pin--GND
+21pin--560KOhm--GND
TX(2pin) +---------+13pin(RX)
15-17pin(アナログ1-3) +-------スイッチ:GNDへ
結線はシンプル。で、OKOKうまくいった。手持ちの関係でpin21の抵抗は560KOhm。これも問題なし。
davidfindlay.orgさんのiPod Remoteでは、3.3Vレベルシフターを使ってるようだが、Arduinoの5VのままのTXで問題を感じられなかった(ホントのことは分からんけど)。なお、そのブログではmode 4のライブラリも公開しているようなので、必要になったらそちらも使わせてもらおうと思う。
回路
回路というほどでもないが、シリアルのMode 2 リモートコントロールには沢山の機能があって、どれをどれくらい使うか不明なので、スイッチ入力をアナログ制御にして、後からソフト的に機能の付加/削除を考える(<=「人生行き当たりばったりだ」という家訓)ことにしたい。
電子部品福袋(3kg詰め合わせ)を開けるmyblogで保存していたジャンクの中にアナログスティックスイッチが20個ばかしあって、電脳網で調べるとALPSのRKJXP1224002。Bカーブ10KOhmのものが2個+タクトスイッチ一個で構成されている。これをAVRに接続予定。
20091115:ケースを考える
TAKACHIのMX型丸型モバイルケースと称されるアルミケースを使うことにした(864円也)。型番は、MX3-11-12GSgoogle 。
両端が半円になっているので、右図のグレー面をアクリルで作り、パネルとする。上面四角の部分と前面半円の部分をうまく直角に折ってあわせられるかどうかが鍵。
なお、中央部にdockコネクタを配置していないのは、第一世代と第五世代ではコネクタ位置がそれぞれ(底面からみて)左/右に寄っており、差した時に両方を満足させるようなシンメトリーな位置を得るのが可能じゃないからです。
20091115:dockコネクタ用のL字ホルダを作る
aitendoのコネクタ基板は大きすぎて、このままではケースに入らないんですね。コネクタ側の2mmピッチホールを生かすかたちで切断し、アップルマークの部分は捨てました。3mmのアクリル板をL字(よりも、心持ち角度は鋭角)に折り曲げて右のようにホルダを作ります。
20091115:おもむろに配線をはじめてみる
dockホルダを作ったので、ここからは一端、基板、配線作業に入ります。ケース加工は基板作ってから考え直すという、泥縄にて
。
20091120:スティックを除き、大体配線終わり
と、泥縄を綯って数日。
結局下のような感じになった。手持ち部品の寄せ集めです。ベークの基板が反ってるんだもん、嫌になる
。
写真に即して言えば、次のような基板配置になっている。
iPod Dock基板構成(途中)
< 大型の柿> +=========充電ライン============5v | MOSFETスイッチ--------+ +----(アナログスティック/予定) | | | iPod -------シリアル---mega168====5v | | LINEOUT 2wire | | バッファ(op-amp) ---+NS73M=======3v | | | +====================12v(or 9v) + (AUX端子/予定)
一応ここまでは、動作チェック済み。電源は、9V以上のACアダプタで供給。レギュレーターで5vと3vを作る。
充電は、2SJ194とRN1204の組み合わせでスイッチをつくりAtmega168でON/OFFを切り替える。
FMトランスミッタは、金太郎飴のようにNS73M。トライステート Web Radioを「加工」してみるでも使ってる。2wireで作ったので、spark funのレベルコンバーター基板を間に入れている。Spark Funのサイト、今見たら1.95ドルか。こんなに高かったっけ。
ラインアウトを抵抗で減衰しただけだとNS73Mの音が酷くてこもる。で、汎用両電源オペアンプでバッファをつけたら、かなり改善されてOKOKになった。バッファの回路はelmさんのパソコン用オーディオアンプを参照してそのまま移した。
電源から直接分圧で+-4V以上とれればいいか、という適当な作り。差し替えが出来るようにDIPソケットをつけているがとりたてて意味はない。NJM4580Dでいいじゃないか、という感じ。
さて、これから、写真の柿を食ったのち、アナログスティック周りの製作に立ち向かってみる。コレガ結構厄介だと思うんだ。
なお、充電モードにすると5Vレギュレーターがかなり熱をもつので、ケースに入れる時には、対策を講じる必要がありっぽい。
20091129:ようやく配線終了
数日、あれこれ野暮な人生を歩んでおり、iPod Dockとは仲良くなれなかったんですが、なんとか、だいたいの配線が終了。
こんなに時間がかかったのは、直前の項で書いた「なお、充電モードにすると5Vレギュレーターがかなり熱をもつので、ケースに入れる時には、対策を講じる必要がありっぽい」が実際のネックになったからで、充電放置するにはあまりにもレギュレーターの熱が酷すぎなのがわかった。結局、ケースを放熱に使うしかなく、配線を一からやりなおしたのであります。結果が上の写真。
部品配置も全体的に変更しました。めだったものとしては、FMトランスミッタを後部に移動し、省スペース化のために(実は180円もするので勿体ないと思った)spark fun のレベルシフターは外し、秋月の1.27ピッチの<キットカット基板>で同じ回路を作って配線しました(BSS138二個と1005タイプの10KOhm四個)。
とはいっても配線が全部終った訳ではなくて、電源スイッチ(前面右につける予定)といくつかのLEDが残っている。これはケース加工を実際しながら配置を考えてみる予定です。
20091130:ケースを考える revisited
11月15日の項で考えてたケース案を破棄することにした。
次のような方向でトライしてみたい。
- 上部にiPodコネクタとアナログスティック穴をあけ、穴と同じサイズのアクリル板を切削してはめ込む。
- 前面パネルは、ケースに付属のABS樹脂パネルを破棄し、同形のアクリル板を切削してパネルとする。
どちらもかなりの精度が要求されるが、CNCのお勉強ということで試みてみる。まずは前面パネルの加工から。
MX3-11-12GSパネルの各部位サイズはタカチのカタログサイトで得る事ができる。・・・・・どうも実測データとずれる・・・。
カタログでは1.5mm厚のアルミなのだが、実測では1.2mmしかないのである。試しに二、三枚削るしかないですね
。
と、いいつつ、すでに一週間が経過したが、この間何をやってたかというと安定化電源の作成みたいなことに現を抜かしていたのであります。終わったので、こちらに戻ってきます(20091209)。
20091214:ケース加工。中間報告
遅々と進みませんが、とりあえず、アクリルのポケット加工の練習をかねてdockコネクタのカバーとケース前面のパネルを加工しました。
上面後部のコネクタカバーは2mmの黒アクリル(右の一番大きい四角)。小さい四角はコネクタ穴です。カバーにポケット加工(二番目の四角)しました。1.1mm分ポケットで掘り下げてます。これに同型の2mmの透明アクリルをはめ込みました。
今のところの全体図は右の写真。コネクタカバーの部分に充電とFMトランスミッタ/AUX切り替え用のタクトスイッチと表示LEDをつけてます。右の丸穴はアナログスティック用で、近々カバーを作りつけようと思いますが、テキトウなスティック材を探している最中です。
前面パネルは2mmの白アクリル。AUX用ジャックと出力ボリュームの穴を開けました。右の空白のところには電源スイッチをつける予定です。
20091228:(一応)完成
間があきましたが、一応完成したことにします。
間があいた理由は2つで、一つはクリスマスだったから。二つ目として、基板を再度作り直したから。
一つ目の理由は別にぼくがサンタクロースだとかそういうことではなくて、クリスマス用の鶏の丸焼きを仕込んだり焼いたり後片付けをしたりで忙しかったからであります。今年は5羽焼きました。丸焼きをオーブンでひたすら焼いて知り合いに配りまくるというのが、電気工作以上の趣味なんですね。詳しい記録は鶏の丸焼きを焼いてみるにあげておきました。
で、今ひとつの理由。基板を三度目作りなおしたのであります。懲りないやつです。iPodのラインアウトからFMとAUXをの2出力を取る場合、ちゃんと切り替えるのが安全だと考え直して、アナログスイッチをつけました。
スイッチはアナデバのADG411BNdatasheet です。ボリュームの真後ろに入れました。ここから、電解コンデンサを挟んでケース後部のFMトランスミッタ行きはシールド線、前部左のステレオジャックへはそのまま錫めっきで配線しています。ジャック周辺はまだスペースがあるので、ホントは、アンプも組み込もうという欲望がもたげたのですが、ここはぐっと我慢して素直にジャック出力してあります。
ついでにaitendoのiPod基板からの信号コネクタ部分も作りなおしました。前よりは整理された感じ。
FMトランスミッタはユニット化しました。ピン並びはSparkFunで売っているNS73Mユニット基板(国内だとストロベリーリナクスで買えるようです)と同一。必然的にその並びになる感じです。基板に半田付けしている鉄ビス(2.5mm)はアンテナ端子。後述するように真鍮棒+ネジで作ったアンテナ用です。
基板の配線は下の写真。電源が3系列(12V,5V,3.3V)なので結構ジャンパがあります。例外もありますが、大方、赤と白の線材が電源系、黄色と青がAVRの信号系。
ケース右前のアナログスティックのカバーは未制作。スティック素材を模索中なので、今のところ2mmX15mmのネジをスティックの代わりに使ってます。なによりスティックの用途がまだ定まってません。いまのところスティックをクリックするとPLAY-PAUSEトグル。右・左に倒すと曲送り。これだけ
。頁末尾にArduinoの現行スケッチを載せます。
後部の棒はアンテナです。3mmの真鍮棒を20cmぐらいに切り、その先にL字に2.5mmのネジをハンダ付けしてトランスミッタ基板のビスにねじ込んでます。強度を心配しましたが、意外と強そうです。
後部の様子。左の長穴はmega168のisp用です。
iPodのコネクタ部カバーは右のごとし。汚いので、CNCにもう少し習熟したら作り直す予定です。タクトスイッチ2つとLEDが二つ並びます。右側のタクトスイッチでFM/AUXを切り替え。左側は充電のON/OFFです。
ISPを除けば、ほぼmega168のピンを使い切った感じで、どのピンがどの機能なのか忘れないうちに、回路図を書いておいた方がいいなと思ってます。書いたらこの頁にアップします。
アナログスティック部の半熟度はさておいて、年を越すのもなんですし、日常使用しはじめることにします。心配していた充電時のレギュレーター発熱もアルミケースが吸収してくれているようですし。
ともあれ、長い道草ですね。というわけで、、、、学研真空管アンプを「変形」してみるに戻ろう。あ、そのまえに。台所でおせちを作りながらFMラジオでiPodを楽しむことにします。今から黒豆買ってこないと、水で戻すの間に合いませんね。では。
付録:iPod nano dock制御用Arduinoスケッチ
20091229 version1.0
/*
*iPod nano dock control with arduino
* ver.1.0
* hejira@river.tc
* 20091229
*/
#include <Wire.h>; //NS73M制御用
#include <ipodcontrol.h>//recotana(http://recotana.com), feb 22, 2009.
#define SW_CHARGE 2 //充電スイッチ
#define LED_CHARGE 3 //充電LED
#define SW_FM 4 //FM AUX切り替えスイッチ
#define LED_FM 5 //FM AUX LED(FM時に点灯)
#define OUT_AUX 6 //アナログスイッチ AUX
#define OUT_FM 7 //アナログスイッチ FM
#define PIN_CHARGE 9 //充電ONの場合 トランジスタスイッチに通電
#define LED_TOGGLE 14 //アナログスティックスイッチ切り替えLED
#define SW_TOGGLE 15 //アナログスティックスイッチ
boolean FM_MODE = false;//FMモード trueでFM
boolean CHARGE_MODE = false;//充電モード true で充電
int N73MAddress = 0xCC;//latchピンGNDの場合のNS73Mスレーブ
int slaveAddress;
IPodControl ipod;//ipodcontrol.hのインスタンス
void setup()
{
delay(10);
//ピン定義
pinMode(SW_FM,INPUT);
pinMode(SW_CHARGE,INPUT);
pinMode(SW_TOGGLE,INPUT);
pinMode(LED_FM,OUTPUT);
pinMode(LED_CHARGE,OUTPUT);
pinMode(LED_TOGGLE,OUTPUT);
pinMode(OUT_FM,OUTPUT);
pinMode(OUT_AUX,OUTPUT);
pinMode(PIN_CHARGE,OUTPUT);
//プルアップ
digitalWrite(SW_FM,HIGH);
digitalWrite(SW_CHARGE,HIGH);
digitalWrite(SW_TOGGLE,HIGH);
//初期出力値
digitalWrite(PIN_CHARGE,LOW);
digitalWrite(LED_FM,LOW);
digitalWrite(LED_CHARGE,LOW);
digitalWrite(LED_TOGGLE,HIGH);
//スイッチON時はAUXに出力
digitalWrite(OUT_FM,HIGH);
digitalWrite(OUT_AUX,LOW);
//ipod control インスタンス
ipod = IPodControl();
delay(10);
//FMトランスミッタ制御準備
slaveAddress = N73MAddress >> 1;
Wire.begin();
}
//まだ、アドホック
int pre_next_val;//アナログスティック 選曲送り、戻し用変数
void loop()
{
//アナログスティック 送り戻し
pre_next_val = analogRead(3);//アナログ3ピン(ADC3)
if(pre_next_val < 200) {//左に倒すと
ipod.sirCommand(SMP_SKIP_PREV);
delay(200);
}else if(pre_next_val > 800) {//右に倒すと
ipod.sirCommand(SMP_SKIP_NEXT);
delay(200);
}
//タクトスイッチ系
if(digitalRead(SW_TOGGLE) == 0){//アナログスティックタクトスイッチ
ipod.sirCommand(SMP_PLAY_PAUSE);
delay(200);
while(digitalRead(SW_TOGGLE)==0){};
}else if(digitalRead(SW_FM) == 0){//FMかAUXか
FM_MODE =!FM_MODE;
//アナログスイッチはLOWでONとなる
if(FM_MODE == true) {
digitalWrite(OUT_AUX,HIGH);
delay(5);
fmTransmitter();
digitalWrite(OUT_FM,LOW);
digitalWrite(LED_FM,HIGH);
} else {
fmTransmitter_off();
delay(5);
digitalWrite(OUT_FM,HIGH);
digitalWrite(LED_FM,LOW);
digitalWrite(OUT_AUX,LOW);
}
//チャタリング防止
delay(200);
while(digitalRead(SW_FM)==0){}
}else if(digitalRead(SW_CHARGE) == 0){//充電モード
CHARGE_MODE = !CHARGE_MODE;
digitalWrite(PIN_CHARGE,CHARGE_MODE);
digitalWrite(LED_CHARGE,CHARGE_MODE);
delay(200);
while(digitalRead(SW_CHARGE)==0){}
}
}
//NS73M用I2C
void I2Csend(byte reg, byte data)
{
Wire.beginTransmission(slaveAddress);
Wire.send(reg);
Wire.send(data);
Wire.endTransmission();
Wire.requestFrom(slaveAddress, 1);
}
void fmTransmitter_off()
{
I2Csend(0x00,B00000000);
}
//cf. http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1193336744/0
void fmTransmitter()
{
I2Csend(0x0E,0x5); //Software Reset
I2Csend(0x00,0xA0); //Register 0: 200mV audio input, 75us pre-emphasis on
//crystal off, power off
I2Csend(0x01,0xB4); //Register 1: forced subcarrier, pilot tone on
I2Csend(0x02,0x01); //Register 2: Unlock detect off, 2mW Tx Power
I2Csend(0x03,B00001111); //Register 3: Set broadcast freq to 90, lower byte
I2Csend(0x04,B00101011); //Register 4: Set broadcast freq to 90, upper byte
I2Csend(0x08,0x1A);//Register 8: set Osc on band 2
I2Csend(0x0E,0x5); //Software Reset
I2Csend(0x06, 0x1E); //Register 6: charge pumps at 320uA and 80 uA
I2Csend(0x00,B00000001);
}