ステッピングモーター(28BYJ-48)の動かし方 (ULN2003A使用)

投稿者: | 2018年5月19日

はじめに

ステッピングモーター(28BYJ-48)の概要を「ステッピングモーター(28BYJ-48)を分解して仕組みを調べてみた」で掴んだので、Arduinoを利用して動かし方を調べてまとめます。

利用するステッピングモーターは、Amazonで購入できるHiLetgo ステッピングモーター(28BYJ-48)とドライバボードがセットになったものを使用します(写真1)。

写真1

実際のモータとドライバボードは以下のような感じです。

写真2
写真3
写真4

概要

ステッピングモーター(28BYJ-48)の構造は「前回」で調べたので、駆動させる方法を中心に、ドライバーボードの必要性、回路図、配線時の注意、Arduinoの標準ライブラリを使って動かす方法を調べて検証します。

なぜドライバボードが必要なのか?

ステッピングモーターは、内部にあるコイルに電流を流すことで磁力を発生させ、磁力で引っ張る力を利用して、永久磁石が巻き付けられている軸を回転させます。コイルは流す電流の大きさにより磁場が強くなります。

軸を回転させるためには一定の大きさの電流が必要になりますが、マイコンの出力では力不足なのでトランジスタなどによる電流の増幅が必要になります。

ドライバーボードに使われているULN2003は、この電流を増幅するための回路を複数(7つ)まとめたICです。

ULN2003A datasheet

ドライバーボードの説明

写真5

動作検証

回路図

図1

配線

大きな電流を流すのでステッピングモーターを駆動させる電力は、Arduinoとは別の場所から得る必要があります。今回は「ブレッドボード用電源モジュール(MB102)の使い方」で使った電源モジュールに9V2Aのアダプタを接続して、5Vを得ています。

写真6

スケッチ

Arduinoの標準ライブラリにあるStepperライブラリを利用します。

ライブラリは2種類の配線に対応していますが、今回のドライバーボードは4つのピンを接続する方法なので、Circuits for Unipolar Stepper MotorsのFour Pinsの図のような接続になります。

しかし、この図ではステッピングモーターの1番から4番へ接続するように描かれているだけで内部の接続が分かりません。Githubでライブラリのソースコードを確認すると、4つのピンを接続した場合は、バイファイラ巻きのユニポーラ駆動となり以下のような2相励磁となることがコメントから分かります。

Github – Arduino/libraries/Stepper/src/Stepper.cpp

/*
 ...省略
 *
 * The sequence of control signals for 4 control wires is as follows:
 *
 * Step C0 C1 C2 C3
 *    1  1  0  1  0
 *    2  0  1  1  0
 *    3  0  1  0  1
 *    4  1  0  0  1
 *
 ...省略
 */

前回」で調べた2相励磁のパターンとは少し異なります。これは想定している配線の違いなので、配線で2番(C1)と3番(C2)を入れ替えるか、Stepperのインスタンスを生成する時、2番(C1)と3番(C2)の番号を入れ替えて渡します。

#include <Stepper.h>

#define MOTOR_1   (4)   // blue
#define MOTOR_2   (5)   // pink
#define MOTOR_3   (6)   // yellow
#define MOTOR_4   (7)   // orange

#define SW  (3)

#define MOTOR_STEPS (2048)

// ライブラリが想定している配線が異なるので2番、3番を入れ替える
Stepper myStepper(MOTOR_STEPS, MOTOR_1, MOTOR_3, MOTOR_2, MOTOR_4);

void setup() {
  pinMode(SW, INPUT);
  myStepper.setSpeed(10);
}

void loop() {
  // スイッチを押して離すとモーターを45°回転させる
  while (!digitalRead(SW)) { delay(50); }
  while (digitalRead(SW))  { delay(50); }
  myStepper.step(256);

  // 静止時の負荷が無く勿体無いので電流を止める
  stopMotor();
}

// モーターへの電流を止める
void stopMotor() {
  digitalWrite(MOTOR_1, LOW);
  digitalWrite(MOTOR_2, LOW);
  digitalWrite(MOTOR_3, LOW);
  digitalWrite(MOTOR_4, LOW);
}

実行結果

まとめ

駆動回路や駆動方法で電流を制御する必要がありますが、ステップ数により指定した角度の回転が出来るので面白い制御ができそうです。

標準ライブラリのStepperのコードを見る限りでは、2つのステッピングモーターを同時に駆動させるのには対応していなかったので(連続で指示を出せるけど駆動は1つずつ)、自作CNCのような同時制御は別途考えないと実現できません。次への課題です。

電子部品はアキバで仕入れてましたが、最近、Amazonプライムに対応していたのでHiLetgo jpから色々購入して試してます。モーターとドライバーボードまで付けて1つ220円なのは驚きで、分解しても痛く無いので遊びにはバッチリです。