SeagateのHDDいらないのが出てきたので分解。
HDDのスピンドルモータを採取してみた。HDDのモータは
- めっちゃ静かで
- 高速回転できる
から面白そうだなあ、と思っていたんだ。
というわけで、ハックに挑戦。
試行錯誤の上、モータ動かす事に成功したので。ハックの記録を書いておくよ。
arduinoと汎用トランジスタでサクサクと動かせまっす。
HDDスピンドルモータの正体は一体なんなのか?データシートも無いのでとても悩んだ。
このモータには端子が3本しか出ていなくて。
最初はステッピングモータだと思っていたんだけど、どうも違うっぽい。
ネットで調べる事2時間。
どうやら3相モータが一般的に使われるらしい。
なので、同期モータの回転原理 を参考に3相モータを理解。
(ここからが色々大変だったんだけど略)
で、実際に動かす事に成功しました!やったねー!
2SC1815でハーフブリッジを構成。Hブリッジのちょうど半分なのでハーフブリッジと呼ばれる。
そしてUVWそれぞれのハーフブリッジを作り、それぞれの相を駆動する。
UVWと端子を宣言してるけどこのモータに端子は決められてない。どの端子も同じで三角形構造なので順番も無いから。
あくまで便宜上UVWと決めているけど、適当に繋いじゃってOK。■ハーフブリッジの特徴
U相の駆動にはQ1Q2が使われて、
- D8をHigh/D9をLowにするとQ1が導通になる
→U相端子に5Vを押し出す- D8をLow/D9をHighにするとQ1がO2が導通になる
→U相端子に電気が吸い込まれるつまり、押し出しと吸い込みを行う事ができるのがハーフブリッジの特徴。
他にも、端子にかかる電圧をちゃんと定義できるっていうのもある。ノイズ対策に有効。
(ちなみに、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はテクノロジーの結晶だから捨てちゃうのってもったいないね!