3Dプリンタやレーザーカッターなどの軸の移動でも使わわれるステッピングモータ、与えるパルスの数だけ回転するので、回転角や移動距離を指定しての制御に便利です。
とはいえ、マブチモータのようなDCモータと違って、ただ電源をつなぐだけで使える(回る)わけではないので、ちょっと使い方が面倒です。
それでもいろいろ動かすためのボードやライブラリがあるので、それを使うとだいぶ楽になります。といいつつ、「ステッピングモータ界の常識」みたいなのがあって、それを知らないと、やっぱりうまく動かせなかったりすることもあって、しょんぼりすることもあります(=今日の私)。
というわけで、「ステッグモータ界」の常識をふくめて、回すまでの記録です。
ステッピングモータの原理と「相」
そもそものステッピングモータの原理と、「相」については、いろいろなWebページや文献があるので、それらを調べてください(たとえばこちらの記事)。「相」は、簡単にうと、モータの構造の違いで、巻線が何組あるか、です。ホビーユースだと2相(2組、それぞれA相・B相、と呼ぶ)のものが多いようです。
ステッピングモータの駆動方式
ステッピングモータの駆動方式を調べていると、このモータの構造を表す「相」と間際らしい言葉として「2相駆動(2相励磁)」というのがあります。これは、例えばWikipediaに説明があるように、モータのコイルにどのように電流を流す(励磁するか)か、を表す用語です。
例えばA相とB相の2組のコイルがある2相モータで、励磁の順序に次の3通りがあります。
- A相だけ励磁→B相だけ→A相だけ→・・・と1相だけ励磁する1相励磁
- A相だけ励磁→A相とB相→B層だけ→A相とB相→・・・と1相と2相を交互に励磁する1-2相励磁
- 常に2相を励磁する2相励磁(1相励磁よりトルクが2倍になる)
これとあわせて、駆動方式に関連する用語として「ユニポーラ駆動」と「バイポーラ駆動」というのがあります。詳しくはこのあたりにありますが、要するに、以下のようにモータの巻線の構造と駆動回路の方式で、両者が使い分けられますが、バイポーラ駆動しか使えないものもあることになります。
- ユニポーラ駆動:巻線A-C間に中間タップ(O)が出ているモータで、A-O間、C-O間にそれぞれ正の電圧を加えることで、逆方向の磁界を発生させられる。つまり駆動側は、どちらかのコイルに正の電圧を加えるかどうかを制御すればよい(負電圧は必要ない)ので、駆動回路が単純にできる。そのかわり中間タップがないモータでは使えず、またケーブル本数が中間タップの分、増える。
- バイポーラ駆動:中間タップがないモータで、巻線A-C間に、正の電圧と負の電圧を加える制御が必要なので、いわゆるフルブリッジのドライバが必要。ケーブル本数は中間タップがない分、減る。
モータの構造上、ユニポーラ駆動に対応しているモータでも、中間タップを使わずにバイポーラ駆動はできることになります。
よくあるステッピングモータ
RepRapをはじめとして3Dプリンタの自作が流行った(?)ころに、「NEMA17」という規格のステッピングモータがよく使われていました。手元に、「JK42HS34-1334AC」というステッピングモータがありましたが、これもこの「NEMA17」規格(互換?)のものの一つです。こちらのNEMA17互換品一覧にも載っています。Amazonでも商品ページがあります(JK42HS34-1334AC自体は製造中止のようですが・・・)。
ステッピグモータのコネクタの端子とコイルの対応関係が、なかなか情報がみつからず、またあっても「色」で書いてあります(さきほどのAmazonで売っている製品もそう)。
手元にある「JK42HS34-1334AC」のコネクタ(JSTのPHコネクタ)には、6個の端子がありますが、それとの対応は、なかなかまとまって記載されているサイトがないようです(製品ページにも書いてない)。どうもこのあたりは、「ドライバボードの端子に、つなぐべきステッピングモータのケーブルの色」が書いてあることが多いので、あまり中の構造を意識せずに使う(使える)ためのようです。
ちなみに、NEMA17互換モータだと、この順序です(ちょっと直感と違うので注意)。※1-6番の順序が逆のものもあるようですが、結果として同じ配線になるので、あまり気にしないほうがよさそうです。
コネクタの端子が6個あるのは、ユニポーラ駆動用の中間タップがあるものでも使えるように、ということだと思いますが、中間タップの端子は未結線でユニポーラ駆動では使えないものもあるようです。
ステッピングモータの駆動電圧
この手の製品紹介をみていて、前から不思議だったのが、「駆動電圧」が書かれていないことが多いことでした。「駆動電流(定格電流)」は書いてあります(このモータだと最大1.3A)。
これは、ステッピングモータの駆動回路は、一般的には定電流駆動回路(のドライバボード)を使うので、指定した電流(例えば1A)になるように駆動電圧が自動的に制御されます。そのため、モータの規格には駆動電圧が書かれていないのですね。ちなみに駆動電流が多いほど、モータの動作時や静止時のトルク(力)が大きくなります(がその分、発熱も増える)。
Arduinoなどから使ってみる
ステッピングモータは、基本的にはA相とB相の2つのコイルに正負の電圧を、順序正しく加えることで回転するものなので、それを駆動するドライバボードとしては、要は「DCモータを正転/逆転できる駆動回路」が2つあればよいことになります。
これができるのはいろいろな製品があって、例えばこちらは、Groveコネクタ経由のI2Cでコマンドを送ると制御できる、ものです。
使い方は、普通のGroveボードと同じで、Arduino用のライブラリを入れて、サンプルスケッチを実行すればOK、なのですが、ちょっとクセがあって、うまく回らず(じーー、と言うだけ)、心が折れそうになります(=今日の私)。
実はこのボードのArduino用ライブラリは、当初かなり作りが雑で、4相専用で、1ステップ分動かそうとすると4パルス分動くようになっていました。さすがにそれだと、2相が使えないのと、細かい制御ができないので、ライブラリを自分で拡張し、PullRequestを送ってマージしてもらっています。ただ、サンプルにあるスケッチ"steppermotor_test"が、当初のライブラリ用のままで、モータがうまく回らない(4相モータ用の制御パルスを出してしまい、脱調している)のです。
そこで、StepperRun()のソースコードにあるように、StepperRun()に3個の引数を与えることで、第1引数のstep数の段階だけ、なめらかに回るようになります。
StepperRun(step, 1, 1);
- 1個めの引数:パルス数
- 2個めの引数:モータの相数(今回使っているNEMA17互換モータは2相なので、これを1にする)
- 3個めの引数:パルス駆動モード(これを1にすると、1個めの引数分のパルスが出る)
// ***************************Stepper Motor Function***************************
// Drive a stepper motor
// _step: -1024~1024, when _step>0, stepper motor runs clockwise; when _step<0,
// stepper motor runs anticlockwise; when _step is 512, the stepper motor will
// run a complete turn; if step is 1024, the stepper motor will run 2 turns.
// _type: 0 -> 4 phase stepper motor, default
// 1 -> 2 phase stepper motor
// _mode: 0 -> compatible mode (_step=1 corresponds 4 steps)
// 1 -> fine mode (_step1 corresponds 1 steps)
void I2CMotorDriver::StepperRun(int _step, int _type, int _mode)
もっと高度な制御
いわゆるgrbl互換ボードというのがあって、それだと、シリアル経由で制御用のGコードを送ると、XYZ軸のステッピングモータを動かせるので、3Dプリンタやレーザーカッターのようなものを作るときには、これを使うのも便利かと思います。