Arduino と A4988 でステッピングモーターを制御する方法

ここでは Arduino UNO R3 (互換ボード) とステッピングモータードライバモジュール A4988 を用いて、ステッピングモーター (17HS2408) を制御する方法について、簡単に説明します。

また Arduino 向けの A4988 ライブラリを用いて、より簡単に制御用プログラムを書いてみます。

ステッピングモータードライバモジュール A4988

今回使うのは Arduino UNO R3、ステッピングモーター (NEMA17 17HS2408)、ステッピングモータードライバ A4988 です。

A4988

A4988 のピン配置

A4988 のピン配置は次の通りです。

A4988

ENABLE は LOW にすると出力が有効となり、HIGH にすると出力が無効 (ディスエーブル) になります。

MS1, MS2, MS3 はステップモードを設定します (下表)。プルダウン抵抗があり、何も接続しないと全て LOW になります。この場合フルステップです。

MS1MS2MS3マイクロステップ
LLLフルステップ
HLL\(1/2\)
LHL\(1/4\)
HHL\(1/8\)
HHH\(1/16\)

17HS2408 は二相ステッピングモーターで基本回転角は 1.8° です。フルステップ (1.8°) で 360 [deg] / 1.8 [deg/step] = 200 ステップで 1 回転します。

RESET は LOW のときトランスレータへの入力をリセットし、HIGH になるまで入力を無視します。(トランスレータへの入力とは STEP, DIR, MS1, MS2, MS3 です)

SLEEP は LOW で電力消費を最小限にするスリープモードにします。SLEEP と VDD の間にプルアップ抵抗があるので、接続しない状態で HIGH です。

STEP にパルス信号を入力して、モーターを回転させます。パルス信号の立ち上がりの時に、モーターの回転を一つ進めます。どのくらい、どちらの向きに進めるかは DIR、 MS1、MS2、MS3 の組み合わせで決まります。DIR の LOW と HIGH で進む向きが変わります。

STEP に入力するパルス信号の最小幅は HIGH/LOW ともに 1µs です。

VDD はロジック電源電圧 (3-5.5V) で 3.3V と 5V ともにサポートしています。

VMOT はモーター駆動用の電源電圧です。最大 35V です (8-35V)。

ドライバー保護のため、デカップリングコンデンサをモーター供給電源に繋ぎます。容量は 100 µF 程度 (最低でも 47µF) にします。

17HS2408 ステッピングモーターの定格電流は 0.6A です。DC 供給電源は Tacklife の MDC01 を使用しています。

A1, A2, B1, B2 はステッピングモーターとの接続です。モーターの仕様を確認してください。

今回使う 17HS2408 の付属のコネクタでは、次の写真の色のように指定されていました。

A4988

17HS2408 のコネクタは JST-PH コネクタです。私は JST-PH 6ピンコネクタに 22AWG のソリッドコアのワイヤをつけてブレッドボードで使えるようにしました。

A4988 の出力電流制限の設定

A4988 では出力電流の制限設定はポテンショメーターで設定できるようになっています。

モーターへの最大制限電流 \(I_{max}\) は次の式で計算できます。

\[ I_{max} = \frac{V_{ref}}{8 \cdot R_{cs}} \]

ここで \(R_{cs}\) は電流検出抵抗 (Current sense resistor) で、旧式のモデルの A4988 では 0.050Ω であり、 2017年1月以降のものであれば 0.068Ω です。

\(I = V_{ref} \cdot 2.5\) として電流の制限値を示している情報がたまにありますが、それは 0.050Ω での計算値です。新しい A4988 では 0.068Ω なので、 \(I = V_{ref} \cdot 1.84\) です。

ステッピングモーターのそれぞれのコイルに流れる電流はフルステップモードで、およそ制限電流の 70% になります。このためコイルに流れる電流を 0.6A に制限したい場合は、\(0.6 / 0.7 \approx 0.86\)[A] を最大電流になるよう設定します。

よって、次の計算から \(V_{ref}\) が決まります。

\[ \begin{aligned} V_{ref} &= I_{max} \cdot 8 \cdot 0.068\\ &= 0.86 \cdot 8 \cdot 0.068\\ &\approx 470 \text{[mV]} \end{aligned} \]

\(V_{ref}\) はポテンショメーターと GND 間で測定できます。調整はポテンショメーターを回して行います。

A4988 Vref の測定

調整するときは、マルチメータのマイナス端子を GND にして、プラス端子にはクリップで金属製の精密ドライバーを繋いだ上で、ポテンショメータを回すと調整しやすいです。

私はおよそ 470[mV] となるように設定しました。

Arduino から A4988 を使う

さて、Arduino とステッピングモータードライバモジュール A4988 を使って、ステッピングモーターを制御してみましょう。

配線図は次の通りです。

A4988

Arduino との接続はロジック電源の 5V の他は、電源 DIR の D8、STEP の D9 だけです。

Arduino のスケッチは次の通りです。

const int DIR  = 8;
const int STEP = 9;

void setup() {
  pinMode(DIR, OUTPUT);
  pinMode(STEP, OUTPUT);
  digitalWrite(DIR, LOW);
  digitalWrite(STEP, LOW);
}

void loop() {
  
  digitalWrite(DIR, HIGH);

  for (int i=0; i<200; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(2000);
    digitalWrite(STEP, LOW);
    delayMicroseconds(2000);
  }

  delay(1000);

  digitalWrite(DIR, LOW);
  
  for (int i=0; i<200; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(2000);
    digitalWrite(STEP, LOW);
    delayMicroseconds(2000);
  }

  delay(1000);

}

1ステップ 1.8° なので、 200 ステップで 360°、つまり1回転します。

これを Arduino にアップロードして試すと、次のビデオのように動作しました。

Arduino の A4988 ライブラリ 【StepperDriver】の利用

上の例では、ステップのパルス信号を作るところからプログラムで書きました。

しかし、ソフトウェア内ではもう少しステッピングモーターの動作を抽象化し、例えば「60度回転」という風にハイレベルな指示が出せるほうが扱いやすいでしょう。

そこで、StepperDriver ライブラリを使います。

これまで StepperDriver ライブラリを使ったことがない場合は、まずライブラリをインストールする必要があります。

Sketch メニューから Include LibraryManage Library... を選択して、表示されたライブラリマネージャからライブラリをインストールしてください。

ライブラリがインストールできたら、Sketch メニューから Include LibraryStepperDriver を選択します。

StepperDriver ライブラリを使った、基本的なコードは次のようになります。

#include <A4988.h>

const int MOTOR_STEPS = 200;
const int DIR  =  8;
const int STEP =  9;

float rpm      = 10;
int microsteps = 30;

A4988 stepper(MOTOR_STEPS, DIR, STEP);

void setup() {
  stepper.begin(rpm, microsteps);
}

void loop() {
  stepper.rotate(360);
  delay(1000);

  stepper.rotate(-360);
  delay(1000);
}

モーターの回転は rotate() に回転角度を度数で渡すことで行います。 回転の速さは setRPM() 関数で設定できます。

現在、どのような設定で動作しているか LCD に表示しながら動かしてみました。

LCD の利用については「Arduino を用いて LCD ディスプレイに文字を表示する」や「1602A I2C アダプターの利用」を参考にしてください。

#include <LiquidCrystal_I2C.h>
#include <A4988.h>

const int MOTOR_STEPS = 200;
const int DIR  =  8;
const int STEP =  9;

float rpm      = 10;
int microsteps =  1;

A4988 stepper(MOTOR_STEPS, DIR, STEP);
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  // LCD
  lcd.init();
  lcd.backlight();
  lcd.print("");

  // ステッピングモーター
  stepper.begin(rpm, microsteps);
}

void loop() {
  // RPM
  rpm = rpm == 20 ? 10 : 20;
  stepper.setRPM(rpm);

  printStatus(90);  
  stepper.rotate(90);
  delay(1000);

  printStatus(-180);
  stepper.rotate(-180);
  delay(1000);
  
}

// 状態を LCD に表示
void printStatus(long deg) {
  lcd.clear();
  
  String s = String("RPM ");
  s += String(rpm);
  lcd.setCursor(0,0);
  lcd.print(s);

  s = String("Degree ");
  s += String(deg);
  lcd.setCursor(0,1);
  lcd.print(s);
}

Arduino にこのスケッチをアップロードして動作を確認すると、次のビデオのようになりました。

以上、ここでは Arduino UNO とステッピングモータードライバー A4988 を用いて、ステッピングモーター 17HS2408 を制御する方法について説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 基礎からの IoT 入門