Program Resource

開発者向け各種コード、アルゴリズム、リソース情報ライブラリ もしくはねふぁの覚え書き

Arduinoでステッピングモーターを制御するには、A4988ステッピングモータードライバーかEasyDriverの制御モジュールを使うと簡単に制御する事が出来る。

DSC03328

配線も簡単で、A4988とEasyDriverはほぼ同じ配線で制御出来る。各モジュールの違いは物理サイズや電解コンデンサの有無、対応電圧、最大マイクロステップで細かい差異があるが、基本はあまり変わらない。

EasyDriverの配線は以下の通り。図面上はStep / Directionがクロスしているが、ブレッドボードシールド上に配置して配線した場合隣に来るためこのピンアサインにしている。

Pin7はOutput / LowでMS2を接続する事でハーフステップ設定にしている(EasyDriverはデフォルト1/8ステップ)

easydriver

A4988の配線。ほぼ同じだが、A4988は基板駆動用の電源が必要、Sleep/Resetピンのショートが必要な事と、Pin8をOutput / Highに設定しMS1を接続する事でハーフステップ設定にしている違いがある(A4988はデフォルトでフルステップ)。
また、A4988を使う場合、必要に応じモーター駆動用外部電源入力の所に100uF程度の電解コンデンサを配置。

a4988

基板上の電流調整つまみを回すことでモーターへの電流を調整するが、ぐるぐる適当に回すとモーターを焼く可能性があるので注意。テスターを使って調整するのが確実だが、筆者はとりあえず中央あたりから始め、モーターを制御しつつ低め(左方向)に回していって、モーターが止まる所より少しだけ高めに調整する適当調整でやっている(適当調整をやる場合は自己責任で)。

ArduinoのコードはAccelStepperライブラリが簡単で使いやすい。

http://www.airspayce.com/mikem/arduino/AccelStepper/

クラスの初期化は

AccelStepper stepper1(1,5,6);

引数最初の1が制御ドライバ使用、5,6がステップ/方向ピン番号。マイクロステップの設定はモジュールによりMS1、MS2、MS3(A4988)をLow/Highに設定する事で切り替え出来る。
EasyDriverの場合MS2をLowにする事でハーフステップに、A4988はMS1をHighにする事でハーフステップになる。

安価な28byj-48/ULN2003のステッピングモーター/基板セットも、ULN2003の4線を例えば3,4,5,6ピンに接続し、

AccelStepper stepper1(8,3,4,5,6);

と指定するだけでハーフステップ制御が出来る(8が4線ハーフステップ指定、4指定でフルステップになる)。

以下は筆者がステッピングモーターのテスト用に作ったサンプルコード。上記配線でEasyDriver/A4988どちらでも動作する。

シリアルモニタから「s###」で速度設定、「m###」でステップ移動、「d###」でcm指定移動(cyclelenとstepsを適切に設定しておく事)出来る。
12番pinにスイッチをつけてGNDと繋げるとスイッチを押すたび1m動く様にもしている。

移動距離マイナス数値指定で逆回転。速度が速すぎても脱調して動かないので、上手く動作しない場合電流調整と速度100~400あたりを試してみると動くかもしれない。EasyDriverとA4988で最低電圧が6v/8v必要なので、モーターが無反応(静止トルクもかからない)場合は外部電源もチェックする事。

cyclelenは2mmピッチの歯でプーリーが一周20歯の場合400(2*20)、stepsはモーターの一周のステップ数(m50と入力して90度回転すれば200。ステップ角1.8度であればハーフステップ時は1ステップ0.9度になるので一周は400)。

たったこれだけのコードでステッピングモーターが思いのままに動作する。

#include <AccelStepper.h>

AccelStepper stepper1(1,5,6);
int stepperspeed = 700;
int movetopos;
char cmd;
float cyclelen = 400;//2*20 one cycle length
float steps = 192; //steps for 360 degree (3.75degree = 360/3.75*2 (halfstep))
#define switchpin 12;

void setup(){
  pinMode(12,INPUT);
  digitalWrite(12, HIGH);

  delay(1000);
  pinMode(7, OUTPUT);
  digitalWrite(7,HIGH); //for microstepping high output
  pinMode(8, OUTPUT);
  digitalWrite(8,LOW);  //for microstepping low output

  stepper1.setMaxSpeed(stepperspeed*100);
  stepper1.setAcceleration(1000.0);
  stepper1.move(1);
  stepper1.setSpeed(stepperspeed);

  Serial.begin(9600);
  Serial.println("Ready [s###]/[m###]/[d##(cm)]");
}

void loop(){
  if (Serial.available()){
    cmd = Serial.read();
    movetopos = Serial.parseInt();
    if (cmd == 's'){
      stepperspeed = movetopos;
      Serial.print("speed ");
      Serial.println(movetopos);
    }else if (cmd == 'm'){
      Serial.print("move ");
      Serial.println(movetopos);
      stepper1.move(movetopos);
      stepper1.setSpeed(stepperspeed);
    }else if (cmd == 'd'){
      Serial.print("move ");
      Serial.print(movetopos);
      Serial.print("cm : ");
      int movesteps = (int)((((float)movetopos*100)/cyclelen)*steps);
      Serial.println(movesteps);
      stepper1.move(movesteps);
      stepper1.setSpeed(stepperspeed);
    }
  }
  if (digitalRead(12) == LOW){
    Serial.println("100cm feed");
    int movesteps = (int)((((float)10000)/cyclelen)*steps);
    stepper1.move(movesteps);
    stepper1.setSpeed(stepperspeed);
    while (stepper1.distanceToGo() != 0)
      stepper1.runSpeedToPosition();
    stepper1.move(0);
  }

  stepper1.runSpeedToPosition();
}

[GPG] A4988 ステッピングモーター ドライバー 3個セット Arduino等の電子工作用
[GPG] A4988 ステッピングモーター ドライバー 3個セット Arduino等の電子工作用

[GPG] EasyDriver V44 A3967 ステッピングモーター ドライバー3個セット Arduino等の電子工作用
[GPG] EasyDriver V44 A3967 ステッピングモーター ドライバー3個セット Arduino等の電子工作用


ArduinoでA4988やEasyDriverを使ってステッピングモーターを動かす」 に3件のコメント

  1. suzurann_suisenn より:

    こんにちは。
    初めてまして。

    ステッピングモーターに最近ハマっています。
    質問があるのですが。

    本文中の「2mmピッチの歯のプーリーが一周20歯」はどちらで購入されました?
    タイミングベルトを加工(紐を輪にする)方法も分かればとても助かります。
    おすすめがあればご教授下さい。

    よろしくお願いいたします。

  2. suzurann_suisenn より:

    プーリー及びベルトの件は解決しました。

    A4988の方向ピンとステップピンの結線が逆ではないでしょうか?

    • NeFa より:

      すみません、コメント気付いていませんでした。
      A4988は確かに逆になっていますね。修正します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*