ステッピングモータをまわす

3Dプリンタやレーザーカッターなどの軸の移動でも使わわれるステッピングモータ、与えるパルスの数だけ回転するので、回転角や移動距離を指定しての制御に便利です。

とはいえ、マブチモータのようなDCモータと違って、ただ電源をつなぐだけで使える（回る）わけではないので、ちょっと使い方が面倒です。

それでもいろいろ動かすためのボードやライブラリがあるので、それを使うとだいぶ楽になります。といいつつ、「ステッピングモータ界の常識」みたいなのがあって、それを知らないと、やっぱりうまく動かせなかったりすることもあって、しょんぼりすることもあります（＝今日の私）。

というわけで、「ステッグモータ界」の常識をふくめて、回すまでの記録です。

# ステッピングモータの原理と「相」

そもそものステッピングモータの原理と、「相」については、いろいろなWebページや文献があるので、それらを調べてください（たとえば[こちらの記事](https://www.denshi.club/pc/motor/1-5.html)）。「相」は、簡単にうと、モータの構造の違いで、巻線が何組あるか、です。ホビーユースだと2相（2組、それぞれA相・B相、と呼ぶ）のものが多いようです。

# ステッピングモータの駆動方式

ステッピングモータの駆動方式を調べていると、このモータの構造を表す「相」と間際らしい言葉として「2相駆動（2相励磁）」というのがあります。これは、例えば[Wikipedia](https://ja.m.wikipedia.org/wiki/%E3%82%B9%E3%83%86%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC)に説明があるように、モータのコイルにどのように電流を流す（励磁するか）か、を表す用語です。

例えばA相とB相の2組のコイルがある2相モータで、励磁の順序に次の3通りがあります。

- A相だけ励磁→B相だけ→A相だけ→・・・と1相だけ励磁する**1相励磁**
- A相だけ励磁→A相とB相→B層だけ→A相とB相→・・・と1相と2相を交互に励磁する**1-2相励磁**
- 常に2相を励磁する**2相励磁**（1相励磁よりトルクが2倍になる）

これとあわせて、駆動方式に関連する用語として「ユニポーラ駆動」と「バイポーラ駆動」というのがあります。詳しくは[このあたり](https://monoist.atmarkit.co.jp/mn/articles/1607/11/news011.html)にありますが、要するに、以下のようにモータの巻線の構造と駆動回路の方式で、両者が使い分けられますが、バイポーラ駆動しか使えないものもあることになります。

- ユニポーラ駆動：巻線A-C間に中間タップ(O)が出ているモータで、A-O間、C-O間にそれぞれ正の電圧を加えることで、逆方向の磁界を発生させられる。つまり駆動側は、どちらかのコイルに正の電圧を加えるかどうかを制御すればよい（負電圧は必要ない）ので、駆動回路が単純にできる。そのかわり中間タップがないモータでは使えず、またケーブル本数が中間タップの分、増える。
- バイポーラ駆動：中間タップがないモータで、巻線A-C間に、正の電圧と負の電圧を加える制御が必要なので、いわゆるフルブリッジのドライバが必要。ケーブル本数は中間タップがない分、減る。

モータの構造上、ユニポーラ駆動に対応しているモータでも、中間タップを使わずにバイポーラ駆動はできることになります。

# よくあるステッピングモータ

RepRapをはじめとして3Dプリンタの自作が流行った（？）ころに、「NEMA17」という規格のステッピングモータがよく使われていました。手元に、「JK42HS34-1334AC」というステッピングモータがありましたが、これもこの「NEMA17」規格（互換？）のものの一つです。[こちら](https://reprap.org/wiki/NEMA_17_Stepper_motor)のNEMA17互換品一覧にも載っています。[Amazonでも商品ページがあります（JK42HS34-1334AC自体は製造中止のようですが・・・）。](https://www.amazon.co.jp//dp/B01H05DVQ2)

ステッピグモータのコネクタの端子とコイルの対応関係が、なかなか情報がみつからず、またあっても「色」で書いてあります（さきほどの[Amazonで売っている製品](https://www.amazon.co.jp//dp/B01H05DVQ2)もそう）。

![connection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457605/39d72511-55eb-4d79-913b-ea6e21203b48.png)

手元にある「JK42HS34-1334AC」のコネクタ（JSTのPHコネクタ）には、6個の端子がありますが、それとの対応は、なかなかまとまって記載されているサイトがないようです（製品ページにも書いてない）。どうもこのあたりは、「ドライバボードの端子に、つなぐべきステッピングモータのケーブルの色」が書いてあることが多いので、あまり中の構造を意識せずに使う（使える）ためのようです。

ちなみに、NEMA17互換モータだと、この順序です（ちょっと直感と違うので注意）。※1-6番の順序が逆のものもあるようですが、結果として同じ配線になるので、あまり気にしないほうがよさそうです。
- 1:黒
- 3:赤
- 4:緑
- 6:青
つまり、1-4をドライバのA相、3-6をB相につなぐことになります。
![JST-PH.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457605/4edbd8b7-b898-350b-4b2f-9f86c0b9c7a6.png)

コネクタの端子が6個あるのは、ユニポーラ駆動用の中間タップがあるものでも使えるように、ということだと思いますが、中間タップの端子は未結線でユニポーラ駆動では使えないものもあるようです。

## ステッピングモータの駆動電圧

この手の製品紹介をみていて、前から不思議だったのが、「駆動電圧」が書かれていないことが多いことでした。「駆動電流（定格電流）」は書いてあります（このモータだと最大1.3A）。

これは、ステッピングモータの駆動回路は、一般的には定電流駆動回路（のドライバボード）を使うので、指定した電流（例えば1A）になるように駆動電圧が自動的に制御されます。そのため、モータの規格には駆動電圧が書かれていないのですね。ちなみに駆動電流が多いほど、モータの動作時や静止時のトルク（力）が大きくなります（がその分、発熱も増える）。

# Arduinoなどから使ってみる

ステッピングモータは、基本的にはA相とB相の2つのコイルに正負の電圧を、順序正しく加えることで回転するものなので、それを駆動するドライバボードとしては、要は「DCモータを正転／逆転できる駆動回路」が2つあればよいことになります。

これができるのはいろいろな製品があって、例えばこちらは、Groveコネクタ経由のI2Cでコマンドを送ると制御できる、ものです。

https://www.switch-science.com/catalog/827/

使い方は、普通のGroveボードと同じで、[Arduino用のライブラリ](https://github.com/Seeed-Studio/Grove_I2C_Motor_Driver_v1_3
)を入れて、サンプルスケッチを実行すれば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プリンタやレーザーカッターのようなものを作るときには、これを使うのも便利かと思います。