ArduinoでHDDのモータをハックする

長らく使ってきたハードディスクドライブ(HDD)が読み書き不能に陥った. 中身はバックアップ済みのテスト環境だけで,特に重要なデータは入っていない. このまま捨てるのも惜しい気持ちになったので,学習がてらHDDを分解し中身を調べることにした. 面白半分でHDDのモータをArduinoで動かしてみたり,磁気ヘッドをスピーカ代わりに音楽を聴くまでを記す.

HDDについて

Western Digital製の"WD3200AAKS"というモデル. 容量は320GBで,データが収まっているディスク(プラッタ)は毎分7200回転(7200rpm)の速さで時計回りに回転する. HDDにはモータとボイスコイルという2つのアクチュエータ(駆動装置)が入っていて,モータはディスクを回転させ,ボイスコイルは磁気ヘッド(読み書きヘッド)を動かす. この2軸の動きにより2次元ディスク上の特定の位置へ自由にデータを読み書きできる仕組みである. 単純に考えればこの装置,1秒間に120回転する円盤からデータを読みだすほどの精密さを持っている. 時速100km超えの超高速回転寿司から1貫の大きさが30nm (0.00003mm) 以下のネタを200nm (0.0002mm) 以下の幅のレーン上で狙うことの出来る装置を想像して頂きたい. そんな驚くべき作業を,少しくらいの振動にも負けず,日々こなしているのがHDDなのだ.

HDDの分解

まずはHDD裏面の制御基板を取り外す. ネジはTorx T-8. 取り外した制御基板を裏返すと3つのICが目に飛び込んで来た. ひとつはメモリ(DDR SDRAM),ひとつはMCU(マイクロコントローラユニット),そしてモータドライバICだ(画像左から). メモリはハードディスクのキャッシュとして利用されている. モータドライバのすぐ上にある4つの接点(J6)がモータの端子と接触する. また,下部ネジ穴2つに挟まれた2行10列のパッド(J1)が磁気ヘッドの端子と接触する.
ネジを7箇所外して表のカバーを外す. ネジは1箇所ステッカーの裏に隠れている. カバー裏面にはフィルタ兼乾燥剤が小さな穴を塞ぐかたちに貼り付けられている. このカバーに空いた小さな穴により筐体内部と外部の気圧が等しくなる. 熱で筐体内部の空気が膨張してしまっても困るし,内部を真空にすると磁気ヘッドがディスクを擦ってしまうからか(詳細は後述).
磁気ヘッドを動かすボイスコイルを見るため,上にかぶさっている磁石を外したところが次の画像である. ボイスコイルとはローレンツ力を利用した一種のモータである. 磁石の近くで導線に電流を流すと導線が動き出す,これがローレンツ力. 主な用途がスピーカの駆動であるため,声(Voice)を発するコイルであることからVoice coilと呼ばれるようになったとか.
内部のネジは一部Torx T-7であった. 磁気ヘッドコネクタを固定しているネジと樹脂製ガイド,ディスクを固定する6本のネジを外すと磁気ヘッドを取り外すことが出来るようになった.
アームの先端にある小さな部品がデータの読み書きを行う磁気ヘッド本体である. この部分はディスクが回転する時に生じる空気の流れによりディスクからほんの少しだけ浮上するよう設計されているため,直接ディスクを擦るようなことは無い. この浮きは指紋の厚みよりもずっと低いというから驚きだ(指紋にも4μmほどの厚みがあるんです)! 読み取った信号を増幅するアンプもアームにくっついていた.
磁気ヘッドとディスクを外すと上のようになる. 画像上部,ディスク外周の溝に白いパックが挟まっているが,これはフィルタ兼乾燥剤である. ディスクが回転することで空気がこのフィルタに流れ込み,勝手に空気がキレイになり湿度も下がる仕組み. 賢いつくりである.

HDDのモータをハックする

HDDの裏面にはモータへと続く端子が4つ覗いている. HDDはブラシレスDCモータを採用しているはずなので,4本中1本は共通端子(Common)で,残り3本はコイルに繋がっているはずである. 右にモータの固定子を簡略化した回路図を載せた. Aが共通端子である. コイルに電流を流すと磁力が生じるので,"B → C → D → B → C → D ..."と順番に電流を流してやれば各々のコイルが磁力を生じ,固定子の内側にある磁石(回転子)が各々のコイルへ順々に引き寄せられてゆくことで回転する. 簡単に言うとリニアモーターカーのレールが丸くなったようなものである(参考サイトの絵を見よう).
共通端子はテスタを使うことで簡単に見つけることができる. コイル1つの抵抗値を1Ωだとした時,共通端子以外の端子間(例えばB-C間)抵抗はコイルを2つ挟むため2Ωになる. 共通端子とコイル端子間(例えばA-C間)の抵抗値はコイルを1つしか挟まないため1Ωを示す. 測定する端子をひとつずつずらしながら抵抗値を見て行けば,小さな抵抗値を示す共通端子を見つけることができる. 今回はA-B間が0.9Ω,B-C間が1.8Ωであったため一番左の端子Aが共通端子だと判った.
さて,手元にArduinoがあるのでこれを使ってHDDのモータを回してみよう. B,C,Dの端子に順番に電流を流せるような回路をつくれば先に説明したリニアモーターカーの原理で回転運動を始める. 左の回路がそれである. 縦に3つ並んだ電源がArduinoに相当する. なお,コイルと並列に入ったダイオードでArduinoとトランジスタを保護できる. コイルは電流を"保存"する素子でもあるのでコイルに流す電流を切ってもコイル周りの電流はすぐには止まらない. ダイオードがこの電流を抑えてくれることを期待しよう.
今回使用したパーツはすべて手元にあったものばかりで,寄せ集め回路になる. トランジスタは2SC1815(Yランク),ダイオードは整流用のもので1N4001,抵抗器は1kΩを使用した.
実際に配線した様子が上の画像. 5VはArduinoから取っているが直流安定化電源を使ったほうが良かったかもしれない. ちなみに,モータに印加する電圧は5-12Vの範囲ならばどこでも良さそうだが,40Vを超えると焼き切れるという話を聞いた. ラジコン(RC)用のDCモータコントローラでも動かせるという報告も有るので,自信と勇気と好奇心に満ちあふれる方は挑戦してみても良いだろう. ついでなので今回使用したArduinoのスケッチも載せる.
const int phase1 = 2;
const int phase2 = 3;
const int phase3 = 4;

int delta = 200;

void setup()
{
  Serial.begin(9600);
  
  pinMode(phase1, OUTPUT);
  pinMode(phase2, OUTPUT);
  pinMode(phase3, OUTPUT);
}

void loop()
{
  // Phase 1
  Serial.print("Phase1: ");
  Serial.println(delta);

  digitalWrite(phase3, LOW);
  digitalWrite(phase2, LOW);
  digitalWrite(phase1, HIGH);

  delay(delta);

  // Phase 2
  Serial.print("Phase2: ");
  Serial.println(delta);

  digitalWrite(phase1, LOW);
  digitalWrite(phase3, LOW);
  digitalWrite(phase2, HIGH);

  delay(delta);

  // Phase 3
  Serial.print("Phase3: ");
  Serial.println(delta);

  digitalWrite(phase2, LOW);
  digitalWrite(phase1, LOW);
  digitalWrite(phase3, HIGH);

  delay(delta);
}
deltaはそれぞれのコイルに電圧を印加する秒数である. 単位はミリ秒. deltaの数値をどんどん小さくして行けばディスクはそれに従って高速に回転するようになる. いわゆるPWM制御というものである. delayMicroseconds()という函数もあるので必要に応じ切り替えると良い. 実際に回転している様子を下に載せた. それにしてもHDDのディスクはとても美しい鏡面だ.

HDDのボイスコイルをハックする

制御基板を取り外した時に2行10列のピンが現れた. これが磁気ヘッドへと続く端子である. テスタを使って調べたところ右上の2端子がボイスコイルへとつながっていた. 画像に示した極性に従って5Vの電圧を印加すると磁気ヘッドが勢い良く動くことを確認した.
アンプ内蔵ポータブルスピーカをバラし,アンプからスピーカへと繋がるケーブルを外してから上の端子へとハンダ付けし直す. これで磁気ヘッドをスピーカ代わりに利用出来る. 音源を繋げアンプの電源を入れたら音量を徐々に上げて行く. すると磁気ヘッドが細かく振動し始め音が聞こえて来る. 高音のキツイ音ではあるが確かに音楽が聞こえてきた. この日はDavid BowieのSpace Oddityを聴いた. スピーカのようにコーンの形をしていなくとも空気を揺らし音をつくることが出来るのだ!
7514486210577849968 http://www.storange.jp/2016/01/arduinohdd.html http://www.storange.jp/2016/01/arduinohdd.html ArduinoでHDDのモータをハックする 2016-01-13T20:30:00+09:00 http://www.storange.jp/2016/01/arduinohdd.html Hideyuki Tabata 200 200 72 72