格安モータドライバを使って、すごーくゆっくり静かに回すマイクロステッピングを実装するには?


こんにちは。PMの後藤です。

唐突ですが皆さんはステッピングモータが好きですか?僕は好きです!個人的な制作活動でも何度も使っていますが、 位置制御が非常に簡単に出来て便利です。ただし動作音は結構しますよね。巷では NEMA17タイプのステッピングモータがFDM系3Dプリンタや小型CNCに使われているのをよく見かけます。制御用モータドライバには色々なタイプがありますが、小型CNCなどにはAllegro社のA4988などがよく載っていますよね。(Pololuのこちらのモジュールなどが有名

これらのモータドライバは励磁電流が調整できたり、マイクロステッピング制御ができて非常に便利なのですが、マイクロステップ数があまり細かくなかったり、低速駆動すると振動が目立ったりする課題があります。

そこで今回、秋月電子で売っているシンプルかつ格安(200円!)の2chモータドライバTC78H653FTGを利用してマイクロステッピングを自前実装してみました。

モータドライバでマイクロステッピング実装

マイクロステッピングとは

マイクロステップと呼ばれる駆動方法で、細かいステップ角制御が可能となるものです。マイクロステッピングの説明については以下のWebページに詳しく記載されています。

ステッピングモータ:マイクロステップ動作原理 | TechWeb motor

ドライバ&ライブラリ仕様

モータドライバTC78H653FTGについて

モータドライバTC78H653FTGの特性上7.5V以下、2A以下で使用する必要があり、使えるモータをそれなりに選びます。一番入手の容易な12Vタイプステッピングモータは巻線抵抗が大きいため、一応駆動できますがあまりトルクが出せません。一方でAmazonなどでよく売っている5Vタイプのモータは巻線抵抗が2Ω程度で定格オーバーしてしまう可能性がありますのでご注意ください。

秋月電子で売っているこのステッピングモータは巻線抵抗が5.2Ωでちょうど良かったです。または小型ユニポーラタイプの28BYJ-48を改造してバイポーラモータとして駆動することも可能です。

モータは電圧制御のみで電流制御は出来ません。上述のAllegroA4988ではモータ駆動用に8V以上の電圧で供給する必要がありますがTC78H653FTGでは5Vで駆動可能です。逆に7.5V以上では駆動出来ません。

またフルステップで最大300rpm程度、1ステップ1msで駆動を確認しています。 5V駆動の場合、更に速く駆動しようとすると脱調し易くなります。これはモータ巻線のインダクタンス成分により十分に巻線に励磁電流が流せなくなるためで、更に高速で駆動するためには電流制御ができるドライバを使う必要があります。

極低速の場合ステップ間の動きが厳密に等間隔ではなくなります。
※理由は後述

公開ライブラリについて

Arduinoベースでライブラリを書いています。
公開しますのでみなさん使ってみてください。
TC78H653FTG_Stepper_Arduino

Arduinoでは標準PWM周波数がかなり低く(500Hz程度)、スムーズに駆動するためにステップを上げると制御するには都合が良くないため、ArduinoUNO用のサンプルプログラムではタイマレジスタTCCR1Bを書き換えて60kHz程度で駆動しています。

デバイスによりPWM周波数の変更方法が違うため、他のプラットフォームで動かすときにはPWM周波数設定に注意してください。今後気が向いたときに各プラットフォーム毎にサンプルを書こうと思います。

ステッピングモータを回すには

ドライバの仕様を確認

まず今回使うTC78H653FTGの仕様書を見てみましょう。

このデバイスではIN入力モードとPHASE入力モードがあります。IN入力モードではHブリッジアームの細かい制御ができ、正転、逆転、ブレーキ、ストップの4モードが扱える一方、PHASE入力モードは運転/停止と正転/逆転が入力の2ビットにそれぞれ対応しており直感的な制御がしやすくなっています。

今回は実装のしやすさを優先しPHASE入力モードを使用することにしました。下表はPHASE入力モードかつ内蔵の2chのHブリッジが別々に扱えるスモールモードの時の入出力対応表です。IN1とIN3は出力のON/OFF,IN2とIN4はそれぞれ出力方向の切り替えに対応していることがわかります。

TC78H653FTG入出力対応表

それではこのデバイスでどのようにステッピングモータを駆動すればいいでしょうか。

ステッピングモータでは下の原理図(VR型)に示すように巻き線の電流を順次切り替えることで固定子側に磁界を作り出し、回転子を駆動します。

下の図は一度に1巻き線しか励磁されないユニポーラタイプですが、今回使うバイポーラタイプのモータでは対向する巻き線同士が接続された2対の巻き線が接続されており、よりトルクが出せる構成になっています。

巻き線の結線構成 中間端子(Common Wire)をマイナス極に固定するとユニポーラ、
接続しない結線ではバイポーラ駆動となる

上図の2対の巻き線(それぞれ1-3, 2-4)を1-3 → 2-4 → 3-1 → 4-2の順に切り替えてやれば回転子が回ってくれるわけです。

さて、励磁する巻き線を切り替えることにより回転子がステップ状に回っていくのがステッピングモータなのですが、実際に低速でこのような一相駆動と呼ばれる制御をすると回転子はステップごとに回転、停止を繰り返しながらガタガタとかなり振動の多い回り方をします。

上記の駆動方式では固定子の作り出す磁界の方向が90度ずつ回転していくのですが、隣接する2つの巻き線を同時に励磁することで中間方向の磁界を作り出せます。このパターンを加えると45度刻みで回転磁界が作れることになりますね。

さらに励磁電流が調整できれば合成される磁界の方向を細かく制御できます。このように巻き線の切り替え遷移を制御して疑似的に回転磁界を作り出すのがマイクロステッピングです。分割されるステップ数で表し、1/16や1/32くらいまで制御できるドライバが一般的です。

ドライバに制御を実装

この制御をTC78H653FTGに実装してみましょう。先ほどの表を参照して入力と磁界方向を表に整理します。なおOUT1-OUT2間を励磁した時に磁界方向が12時の方向に向くと仮定しました。

下に示す表は1周を8ステップでコントロールする一・二相制御/ハーフステップと呼ばれる制御の場合ですが、なんとなく制御パターンが作れそうに見えます。

それではハーフステップよりさらに細かい1/4ステップではどうなるでしょうか。

上の表の各ステップ間に磁界方向がその中間に向くステップを補間してやればよいと考えられます。この時、IN1およびIN3が出力のON/OFF制御端子にあたりますのでここをPWM制御することを考えてみてみます。

磁極の励磁特性やベクトル方向はひとまず無視してIN1およびIN3を線形で補間してみた表が以下となります。

制御プログラムとしては上表のSTEPをループさせて、STEP番号に従った制御パターンを制御すればよさそうです。IN2, IN4もビット演算でうまくやれそうですがとりあえず以下のようなArduinoコードで動かしてみます。

#define PWM04 0.0f
#define PWM14 0.25f
#define PWM24 0.5f
#define PWM34 0.75f
#define PWM44 1.0f
float step_setting[16][4] = {
  {PWM44, 1, PWM04, 0},
  {PWM34, 1, PWM14, 0},
  {PWM24, 1, PWM24, 0},
  {PWM14, 1, PWM34, 0},
  {PWM04, 1, PWM44, 0},
  {PWM14, 0, PWM34, 0},
  {PWM24, 0, PWM24, 0},
  {PWM34, 0, PWM14, 0},
  {PWM44, 0, PWM04, 0},
  {PWM34, 0, PWM14, 1},
  {PWM24, 0, PWM24, 1},
  {PWM14, 0, PWM34, 1},
  {PWM04, 0, PWM44, 1},
  {PWM14, 1, PWM34, 1},
  {PWM24, 1, PWM24, 1},
  {PWM34, 1, PWM14, 1},
  {PWM44, 1, PWM04, 1},
  };   

void setup(){
    pinMode(STEPPER_PWM_PIN1, OUTPUT);
    pinMode(STEPPER_PIN2, OUTPUT);
    pinMode(STEPPER_PWM_PIN3, OUTPUT);
    pinMode(STEPPER_PIN4, OUTPUT);
}

void loop(){
    uint8_t counter = 0;

    analogWrite(STEPPER_PWM_PIN1, (int)(step_setting[counter][0] * 255.0));
    digitalWrite(STEPPER_PIN2, (int)step_setting[counter][1]);
    analogWrite(STEPPER_PWM_PIN3, (int)(step_setting[counter][2] * 255.0));
    digitalWrite(STEPPER_PIN4, (int)step_setting[counter][3]);

    counter = counter == 15 ? 0 : counter + 1;
    delay(20);
}

モータの動作確認

下図のように結線してプログラムを動かしてみるとちゃんとステッピングモータが回ってくれました。但しステップごとにカタカタと振動するのが気になります。

上側のモータをTC78H653FTG、下側をAllegro A4988で駆動しています

改良して静かに回す

先ほどのステップを改良してもう少し静かに回すことを考えてみましょう。

まずは磁界ベクトル方向の考慮です。先ほどの表ではステップ間の励磁電流の変化を線形で補完してしまいましたが実際は隣り合う2極の磁束どうしをベクトル合成してやる必要があります。

また、電気工学を学んだ方ならどなたでもご存じの鉄心の励磁特性は下図のようにヒステリシス特性を持っており、非線形性を考慮する必要がありそうです。特に鉄心は保磁力のため励磁電流がゼロになった後も磁化されており、励磁電流にオフセットを持たせる必要がありそうです。

鉄系素材のヒステリシスカーブの例:横軸は磁界の強さ、縦軸は磁束密度
実際の鉄心は上図よりヒステリシスカーブの幅が狭い、鉄損の低い素材が使われますね
出典:Wikipedia 鉄損

一応磁束ベクトルの合成も試してみたのですが、結論から言うと磁束ベクトルの方向より鉄心の非線形性が支配的なようで、結局脳筋的にオフセットを持たせたマスターパターンを手打ちし、ステップ数に応じて線形補間する方法が一番うまくいきました。オフセットは50%-60%程度としたときにステップ間のがたつきが非常に少なくなりました。

最後にマイクロステップのステップを1/4からさらに細かくしてやればスムーズに制御できると考えられます。以下の方針で実装し、商用のステッピングモータドライバではあり得ない1/512まで対応できるようにしてみました。

  • 励磁パターンを1/8マイクロステップで手打ちし、1/8より細かい場合は線形補間
  • ステップカウントを基準に、IN4は全ステップ数の半分まではH、それ以上はL
  • 同じくステップカウント基準でIN2は全ステップ数の1/4間隔でH、Lを切り替え、ただしIN4がLの時はビット反転

但し、よく考えてみるとPWMの解像度がさほど高くない(ArduinoUNOの場合256段階)のでマイクロステップ数をそんなに分割しても効果はほとんどなさそうです。現実的には1/64くらいまでが実用的だと思われます。

汎用ステッピングモータドライバに対抗して1/512ステップをやってみました。
意味あるの?なんて聞かないでくださいね!

実装してみての気づき

AllegroA4988のような既成のステッピングモータドライバ類は手軽に制御できて便利な一方、安価なものだとマイクロステップが1/16までしか使えず、10秒で1回転するぐらいゆっーくり動かすような使い方をするとするとかなり動作音が気になります。

そもそもステッピングモータは極低速で回すものではありません。ですが、今回書いたライブラリとTC78H653FTGを組み合わせた場合、モータの励磁特性をある程度考慮して制御でき、必要に応じてさらに細かいステップで制御できるので非常に静かにステッピングモータを回すことができます。

下の画像は同じステッピングモータをAllegroA4988とTC78H653FTGで、それぞれ1/16マイクロステップ、1ステップ20mSで回したときの比較です。下側のTC78H653FTGの波形では低周波でのクリックノイズがかなり落ちていることが分かります。

上がAllegro A4988, 下がTC78H653FTG、それぞれ1/16ステップ、ステップ間隔20mS
コンデンサマイクをモータに押し付けて録音、時間軸は上下で厳密には合っていない
ガタガタ動いているように見えるのはGIFのフレームレートを10FPSに落としているため。実際は1/16でも動きはかなり滑らかです

課題と今後の実装方針

現在以下の課題があります。今後ライブラリとして機能追加いきたいと思います。

逆回転時のステップがスムーズでない

現在逆回転時は上表の励磁パターンを繰り下げているのですが、そうすると微妙にがたつきが発生します。これは励磁パターンを改良して対応する予定です。

ステップ間の遷移が厳密に等間隔にならない

モータをゆっくり動かしたとき、よく見ているとステップ間でモータの速度が一定にならず微妙に加速したり、減速したりする現象が見られます。これは上にて議論した鉄心の励磁特性の非線形性のためと考えられます。励磁特性を完全に補償するのは困難なため、励磁パターンをもうすこし「いい感じ」に動くよう調整してみたいと思います。

ただし原理的に「ステップ」していくのがステッピングモータであり、ステップ間の遷移状態に正確さを求めるのは本来の使い方とは言えず、PWM制御の分解能からも限界がありそうです。

その他

MCU毎に割り込みやPWM設定が違うため個別にサンプルコードが必要です。現在ArduinoUNO用しか作成していませんが、順次ほかのMCU用のサンプルも書こうと思います。

現在定速度制御のみ実装しています。Arduinoライブラリとして使ってもらうために速度制御、位置制御も実装していきたいです。

ここまでマイクロステッピングを 1/4, 1/8など2のべき乗で表現していましたが、分割数を固定しておく必然性があるわけではありません。制御周波数を一定とした実装に切り替えたほうが速度制御時は都合がよさそうです。

現在は制御部分をクラス分けしただけですが、今後ArduinoIDEで読み込めるようにプロジェクトを整理したいと思います。

シングルタスクの場合は通信割り込みなどで速度が遅くなる可能性があるためESP32などでRTOSでタスク分けするとうまくいきそうです。

おわりに

ギヤボックスなどが無くてもほぼ無音かつ超低速制御でき、かつトルクも出せるので、ターンテーブルやカムなどゆっくり動く機構に応用できそうです。

個人的にはからくり機構や時計などの制御に使ってみたいなと思っています。また制御回路もMCUとHブリッジのみなので小型化出来そうです。もしなにか制作される際に使っていただけましたらその際は是非お知らせください。

感想やライブラリへのプルリクエストもお待ちしております!

公開ライブラリ
TC78H653FTG_Stepper_Arduino

エンジニア積極採用中

現在Cerevoでは各種エンジニアの採用、またハードウェア共同開発・受託開発を絶賛募集しております。それぞれご関心お持ちいただける方は、以下の専用お問い合わせフォームよりご連絡お待ちしております。

Back To Top
© Cerevo Inc.