DVDのスピンドルモーターを低速回転させる-続編
◆まえがき
以前DVDのスピンドルモーターを低速回転させましたが、回転速度に少しムラがあるのが気になっていました。
セルシンを作った時も回転ムラの問題があったのですが、この時のモーターは3相(3ポール)のコイルに対して磁石は1対。つまり1回転の中で磁気的にロックされるポジションは1つしか無いので、まあ仕方ないかなという感じでした。
一方で、このDVDのモーターは1回転で磁気的にロックされる位置が6箇所あります。つまり、もっと滑らかに回転出来るはずなのに、目に見えるような回転ムラが発生するが残念でした。
回転ムラを減らすには、マスダンパーを付けるなどのメカニカルな対策が考えられますが、電気的な駆動条件の調節で対策出来ればそれに越したことはありません。
そんなことで、駆動力と回転速度を運転中に変更出来るようにして、その効果を確認してみました。
◆回路図
VR1とVR2でモーター電流と回転速度を運転中に変更出来るようにしました。
モーター電源は最大1.5Aくらい流れるので別ルートから供給しています。回路図に示していませんが、Arduino NANOの電源はUSB電源など別系統から供給する必要があります。パワーを上げないならモーター電源をNANOの+5Vから取る手もありますが、その場合はボードの電流供給能力に注意する必要があります。
・外観
◆プログラム
Arduino UNO/NANOで使うことを想定したスケッチです。
// DVDスピンドルモーターの3相アナログ駆動テスト // 可変抵抗で駆動パワー、回転速度を指定可能にした // 20230427_3PhaseMotorDrive int ax; // モーターの角度 void setup() { pinMode(8, OUTPUT); // 動作速度測定用 pinMode(7, INPUT_PULLUP); // 回転方向設定(HIGH or LOW) Serial.begin(115200); ax = 0; // 角度設定変数(0-360度で指定) angle(ax); // ホームポジションに移動 delay(1000); } void loop() { if (digitalRead(7) == HIGH) { // 回転方向スイッチがOFFなら ax ++; // CW if (ax > 360) { ax = 0; } } else { // OFFなら ax --; // CCW if (ax < 0) { ax = 360; } } angle(ax); // 指定角度に回転 } void angle(int a) { // 指定された位相でコイルを駆動.位相は度の値で指定 int r, s, t; float pow_r, pow_s, pow_t; float magPow; int rotInt; // インターバル magPow = 120.0 * analogRead(A0) / 1024.0; // 磁界の強さ設定 (130us) rotInt = 500 * (1.0 - analogRead(A1) / 1024.0) - 30; // 回転速度決定、値は0.1usステップ、-30はオフセット補正(130us) if (rotInt < 0) { // 負の値になった時の後始末 rotInt = 0; } pow_r = cos(PI * a / 180.0); // 位相に相当するパワーを設定(175us) pow_s = cos(PI * (a + 120 ) / 180.0); // 位相 +120度 (175us) pow_t = cos(PI * (a - 120 ) / 180.0); // 位相 -120度 (175us) r = (pow_r * magPow) + 125; // 振幅125±magPowでスイング(255近傍は怪しいので避ける) s = (pow_s * magPow) + 125; t = (pow_t * magPow) + 125; analogWrite( 9, r); // アナログ(PWM)出力 analogWrite(10, s); analogWrite(11, t); delay100us(rotInt); // 指定時間待機して回転速度を調整 Serial.print(magPow); Serial.print(", "); Serial.print(rotInt); Serial.print(", "); Serial.print(r); Serial.print(", "); Serial.print(s); Serial.print(", "); Serial.println(t); } void delay100us(int t) { // 引数*100μs 待機 // delayMicroseconds は16383us以上の値が設定出来ないのでこの関数を使う for (int i = 0; i < t; i++) { // 指定回数 delayMicroseconds(100); // 100us待機 } }
PWMで三相のパワーを調整してモーターを駆動するようになっています。
37, 38行目のAnalogReadで可変抵抗の値を読み、励磁パワーと回転速度を設定しています。
回転速度は1回転当たり4.7秒から1分45秒の範囲で変更可能になっています。
angle( ) の関数内でモーターのコイルの励磁条件を設定しており、コメント内に書き込んである(130us)などの数字はその行の実行時間です。cosの値を計算するのに175us掛かっているのがこの関数の実行時間の足を引っ張っています。ここをテーブル参照方式などに変更すれば、処理時間を短く出来て最高回転速度をもっと上げることが出来るはずです。
◆動作テスト
ターンテーブルに載せる物を変えたりしてテスト。
パワーを調節することで、(目で見る限りは)回転ムラを感じない駆動条件に設定することが出来ました。なお、パワーを下げ過ぎるとスリップして回転停止。パワーを必要以上に上げると回転ムラが発生し、またモーターが加熱します。
・動画(ツイッター)
以前やったDVDのスピンドルモーターを低速で回す回路をレベルアップ。回転速度とドライブパワーの調整機能を付けてみました。
— ラジオペンチ (@radiopench1) April 26, 2023
小物をディスプレイするのに使えるかもしれません。 pic.twitter.com/SKiDCX7gDK
回転数を調整している様子です。
◆HDDのスピンドルモーターを回す
面白いので、同じ回路を使って壊れたHDDのスピンドルモーターを回してみました。コイルはY結線になっていてピンは4本出ているので、中点以外の3ピンに接続します。(中点はピン間の抵抗を測定すれば判ります)
流軸のスピンドルを低速で廻したのでは本来の性能は出ませんが、それでもそのあたりに転がっている軸受けよりは精度が高いと思います。
◆まとめ
駆動パワーを調整することで回転ムラを目立たなくすることが出来ました。作品をデモする時などにあれば便利かも知れません。
こういうエレメカ物は対策の効果が目で見て判るので、いじっていて楽しいですね。