memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

Arduinoでステッピングモーターを動かしてみた

ステッピングモーターを扱ったことがなかったので、かほパーツセンターに行って材料買ってきてちょっとやってみました。

ステッピングモーターの原理はそれなりに理解していたつもりですが、ネットに参考情報があるとはいえ、実際に作るとなるとなかなかわからないことがあるものでした。

買ってきたモーターはこれです。ユニポーラ。12Vのつもりで買ったのですが6Vでした。。。

www.datasheetspdf.com

Arduinoと駆動回路は以下のサイトを参考にしました。

www.petitmonte.com

TA7291PはDCモーターの制御でもよく使っていたので、特に迷うところはないはずだったのですが。。。困ったのがステッピングモーターの線の意味。。。上記のデータシートにはないんですね。。。ぐぐってもこのモーターを使った作品例がほとんどない。なんでこんなモーターを置いているのはよくわかりませんが。。。

1時間くらいあれこれ探しました。そのうちにいろいろと基本的な知識が得られたので見えてきました。結局、ミスミのサイトにありました。それぞれの製品のデータシートに結線方法を載せてくれればいいのになぁ。。。と思いましたが、たくさん商品を扱っているから、共通部はまとめちゃえというのはわからなくもないです。そもそも、こういうのやる人にとっては当然のことなのでしょう。ちなみに、この資料にはない線の色もありますが。。。想像でなんとかしました。

http://www.mitsumi.co.jp/latest/Catalog/pdf/motor_misc_prodinfo.pdf

とりあえず線がわかったところで、マイコンを使わずに動作を試すサイトがあったので、それに倣ってやってみました。これはいい理解でした。あとは手動スイッチを、arduinoのスイッチングをTA7291Pで増幅したスイッチに置き換えればいいわけです。といっても順次スイッチングするライブラリStepperがArduinoにはあらかじめ用意されているのでそれを使うだけです。簡単。

monoist.atmarkit.co.jp

最初、Stepperの使い方がいまひとつわかりませんでした。

setSpeed(int rpm)で速度を指定するのに、step(int step)でさらにステップ数を指定するのって。。。よくわからん。Arduinoのリファレンスを見て、以下の赤字のところの例でわかりました。

Turns the motor a specific number of steps, at a speed determined by the most recent call to setSpeed(). This function is blocking; that is, it will wait until the motor has finished moving to pass control to the next line in your sketch. For example, if you set the speed to, say, 1 RPM and called step(100) on a 100-step motor, this function would take a full minute to run. For better control, keep the speed high and only go a few steps with each call to step().

例えば、setSpeed(1)とすると1RPM(回転/分)なので1回転するのに1分かかる速度で動かすということになります。

上記のモーターは1ステップあたり7.5度回転すると仕様に書かれていました。つまり、1回転するのに48ステップ必要です。つまり、setSpeed(1)としてstep(48)と指定するとすると、1分間で1回転する速度でモーターが回転するということになります。たぶんですね。

ちなみに、上記のリファレンスにも書かれていますが、stepはブロッキング処理になります。回転するまでプログラムが次に進みません。これは結構盲点かと思います。例えば、実際に私は間違えたのですが、モーターを止めたいな。。。というときにsetSpeed(0)として、step(1)とすると、永遠に回転しないのでstep(1)のところでプログラムが待ち状態になります。。。つまり、RPMに0を指定したときにはstep()は実行しちゃいけない。。。ということです。同様にsetSpeedにマイナスの値も指定できません。逆回転したいときにはstep()の引数をマイナスにします。

とりあえず、ここまでわかったところで、サンプルを少し修正して動かしてみました。シリアルモニターで回転速度と回転方向を変えるようにしてみました。

#include <Stepper.h>

#define STEPS 48

Stepper Motor(STEPS, 8, 9, 10, 11);
int rpm = 0;
int sign = 1;

void setup() {
  Serial.begin(9600);
  Motor.setSpeed(100);
  Serial.println("start");
}

void loop() {
  if (Serial.available()) {
    int v = Serial.read();
    if (v == '-') { //逆転
      sign = - sign;
      return;
    }

    v = v - '0';
    if (v < 0 || v > 9) return; //数字以外

    rpm = v * 20;
    Motor.setSpeed(rpm);
    Serial.print("speed : ");
    Serial.println(rpm);
  }

  if (rpm > 0) Motor.step(sign * 1);
}

動かした様子が以下です。

youtu.be

ちなみにこのモーターはスキャナなどの制御に用いられるようです。6Vで駆動できますし、これで簡単な制御とかできたら面白そうですね。