■ハードディスクのモータをarduinoで制御

SeagateのHDDいらないのが出てきたので分解。
HDDのスピンドルモータを採取してみた。

HDDのモータは

から面白そうだなあ、と思っていたんだ。
というわけで、ハックに挑戦。
試行錯誤の上、モータ動かす事に成功したので。ハックの記録を書いておくよ。
arduinoと汎用トランジスタでサクサクと動かせまっす。

 

■ 目次

 

■HDDスピンドルモータの正体

HDDスピンドルモータの正体は一体なんなのか?データシートも無いのでとても悩んだ。
このモータには端子が3本しか出ていなくて。
最初はステッピングモータだと思っていたんだけど、どうも違うっぽい。
ネットで調べる事2時間。
どうやら3相モータが一般的に使われるらしい。
なので、同期モータの回転原理 を参考に3相モータを理解。
(ここからが色々大変だったんだけど略)
で、実際に動かす事に成功しました!やったねー!

■駆動用の回路図

2SC1815でハーフブリッジを構成。Hブリッジのちょうど半分なのでハーフブリッジと呼ばれる。
そしてUVWそれぞれのハーフブリッジを作り、それぞれの相を駆動する。
UVWと端子を宣言してるけどこのモータに端子は決められてない。どの端子も同じで三角形構造なので順番も無いから。
あくまで便宜上UVWと決めているけど、適当に繋いじゃってOK。

■ハーフブリッジの特徴

U相の駆動にはQ1Q2が使われて、

つまり、押し出しと吸い込みを行う事ができるのがハーフブリッジの特徴。
他にも、端子にかかる電圧をちゃんと定義できるっていうのもある。ノイズ対策に有効。
(ちなみに、D8D9同時にONするとQ1Q2で電流貫通。ショート状態で過電流。トランジスタが焼け飛ぶ)

■制御用のスケッチ(プログラムソース)

制御はArduinoでやったよ。
(ArduinoとはAVRベースの開発環境一体型のシステム。フィジカルコンピューティングデバイスとか言われる)
ソースプログラム・・じゃなくてスケッチは以下の通り。
長いようだけどかなりシンプルだよー。


// arduino でHDDスピンドルモータ制御
// 単純な矩形波制御
// DC三相モータになら大抵応用できると思います。


// クラス定義
// UVW各端子をコントロール
class TriCont {
  public:
    void PinDefine(int Hside,int Lside);    //使用ピンの定義
    void PinGive(int mode);	                //High側TrをONにするか。Low側TrをONにするか。
    int HpinNo;                             //割り当てられたピンの番号
    int LpinNo;
  private:
};

//使用ピンの定義
void TriCont::PinDefine(int Hside,int Lside)
{
   HpinNo = Hside;
   LpinNo = Lside;
   pinMode(HpinNo, OUTPUT);
   pinMode(LpinNo, OUTPUT);
   digitalWrite(HpinNo, LOW);        //貫通電流防止のためH/L両方LOWにしておく
   digitalWrite(LpinNo, LOW);
}

//High側をONにするか。Low側をONにするか。
void TriCont::PinGive(int mode)      //mode : 1=High  -1=Low 0=none(どこにも通電しない)
{
  digitalWrite(HpinNo, LOW);
  digitalWrite(LpinNo, LOW);
  delay(1);                         //貫通電流防止のためにデッドタイム作る。ここでは1msec
  
  switch(mode) 
  {
    case 0:
      digitalWrite(HpinNo, LOW);         // 0 の時は通電無し
      digitalWrite(LpinNo, LOW);
      break;
    case 1:
      digitalWrite(HpinNo, HIGH);        // 1 の時はHigh側Trを通電。端子に5Vを押し出す
      digitalWrite(LpinNo, LOW);
      break;
    case -1:
      digitalWrite(HpinNo, LOW);         // -1 の時はLow側Trを通電。端子から電流を引き込む
      digitalWrite(LpinNo, HIGH);
      break;
    default:
  }
}



// =======クラス関連終了。以下メイン============================


TriCont Ucont;                  //各端子ごとにクラスから生成
TriCont Vcont;
TriCont Wcont;

void setup()
{
  Ucont.PinDefine(8,9);         //使用するピンを作る
  Vcont.PinDefine(10,11);
  Wcont.PinDefine(12,13);
}

void loop()
{
	/*
	stage| 1| 2| 3| 4| 5| 6|
	------------------------
	    U| 1| 1| 0|-1|-1| 0|
	    V|-1| 0| 1| 1| 0|-1|
	    W| 0|-1|-1| 0| 1| 1|
	------------------------
	 1:Voltage push
	-1:Voltage pull
	 0:none
	stage1〜6を繰り返す事で回転していく
	*/

  Ucont.PinGive(1);      //stage1
  Vcont.PinGive(-1);
  Wcont.PinGive(0);
  delay(20);             //delayを少なくすれば高速回転。脱調に注意
  
  Ucont.PinGive(1);      //stage2
  Vcont.PinGive(0);
  Wcont.PinGive(-1);
  delay(20);


  Ucont.PinGive(0);      //stage3
  Vcont.PinGive(1);
  Wcont.PinGive(-1);
  delay(20);

  Ucont.PinGive(-1);    //stage4
  Vcont.PinGive(1);
  Wcont.PinGive(0);
  delay(20);

  Ucont.PinGive(-1);    //stage5
  Vcont.PinGive(0);
  Wcont.PinGive(1);
  delay(20);

  Ucont.PinGive(0);      //stage6
  Vcont.PinGive(-1);
  Wcont.PinGive(1);
  delay(20);
}

UVWそれぞれ同じ機能を持っているので、コードシンプル化のためにクラスで操作。 クラスを初めて使って困ったけど、Twitterで教えてくれたOuchさんありがとうございます!

■問題点・課題

色々あるけど今の所パス

■どのように使おう?

こういった特徴をうまく使いたいなあ。
使い道は今の所

程度しか思いついていない。

■あとがき


HDDとから採取できる物といったら強力なネオジウム磁石がある。これはもちろんGET!
この銀色のやつね。

あと、HDDのプラッタ円盤も魅力的。超精密な平面鏡鉄板だからね。色々な測定とかに使えそうだ!
HDDはテクノロジーの結晶だから捨てちゃうのってもったいないね!

 

[戻る]