arrow-right hamburger logo-mark social-facebook social-github social-twitter
2018.07.23

【詳細解説】ステッピングモータの仕組みを理解しよう!解説とNefry BTでステッピングモータを使う方法

たくろーどん

駆動部品いろいろ
    このエントリーをはてなブックマークに追加  

モータの種類にはいろいろあります。前回は回転角度を調整できるサーボモータについて紹介しました。

今回は、ロボットアームや3Dプリンタの制御に使われるステッピングモータについて説明し、Nefry BTで制御に挑戦してみたいと思います。

ステッピングモータとは?

ステッピングモータは、DCモータ(Direct-current motor、直流電動機)とは異なり、電力信号を与えることで正確に回転を制御できます。

例えばステッピングモータの使われている3Dプリンタでは、正確に回転を制御できているからこそ3Dプリントが実現しているとも言えます。

各モータの特徴をまとめると下記のようになります。

ステッピングモータの種類〈1〉

ステッピングモータには3種類あります。

※回転子(ローター)…モーターとして回転する軸のこと。

ステッピングモータの仕組み

PM型のステッピングモータの仕組みを簡単に説明したいと思います。

まず、下記の図のようにPM型のステッピングモータは中心の永久磁石からなる回転子外側のコイルから構成されている固定子から構成されています。コイルに電流を流すことで磁力が発生し、この磁力を利用して回転子を回転させていきます。

1
  1. コイル1に電流を流すと固定子と回転子のN極とS極が引き合う。
  2. さらにコイル2に電流を流すと、両方の固定子が磁化して回転子を引きつける。つまり45°回転する。
  3. コイル1の電流を切ると、さらに45°回転する。
  4. コイル3にコイル1に流した電流と逆方向の電流を流すと、さらに45°回転する。
  5. コイル2の電流を切ると、さらに45°回転する。

上記と同様の動作を繰り返すと回転子が回転します。

また、動画にすると下記のようなイメージです。 制御信号(ステップと呼びます)を与えると回転するイメージです。また、1ステップあたりの回転角度を基本ステップ角度と呼びます。

ステッピングモータの種類〈2〉

先ほど述べたようにステッピングモータの種類には3種類あります。そして、さらに2種類あります。ただし、この2種類とはステッピングモータ内部にあるコイルへの電流の流し方の違いによるものです。

※ステッピングモータの仕組みで説明したように磁極を変えるため内部のコイルをスイッチングする必要がある。その磁極をどのように変更するかというイメージ。

3

励磁(れいじ)方式

励磁方式とは、簡単に言えば「どのようにコイルに電流を流し、ステッピングモータを回転させるか」です。つまり、どのコイル(どのピン)に電圧をどの順番で印加していくかということです。

これは、制御するときに方式を選ぶことができます(プログラムで書くことができます)。ライブラリを使って制御するとわかりにくい部分かもしれません。

大まかに3つの励磁方式があるので、それぞれ紹介したいと思います。

4


■ 1相励磁

A→B→A'→B'の順に電流を流します(つまり励磁します)。

5
このようにパルスを与えるたびに決められてステップ角だけ回転します。励磁の順をA'→B'→A→Bとすると逆回転します。

1相励磁は最も単純な方式ですが、トルクが弱く高速回転には向いていません。また、安定性が良くないため実用的ではありません。


■ 2相励磁

次の相と1パルスずつずらして同時に励磁する方式です。

6
パルス幅が1相励磁の2倍となり、1相励磁に比べて回転が安定して、大きなトルクが得られますが消費電力も2倍になります。


■ 1-2相励磁

1相励磁と2相励磁を交互に繰り返す方式です。

7
各相のパルス幅が3となり、次の相とは2パルスだけずらして励磁されます。1パルスごとに回転する角度が1相励磁と2相励磁に比べて半分になり、細かいモータ制御ができます。基本的にこの励磁方式で制御すれば間違いないでしょう。

Nefry BTでステッピングモータを制御しよう!

ステッピングモータを購入

今回は、Amazonでこちらのステッピングモータを購入して使いました。ステッピングモータとドライバが5セット入っており、それでいて価格が約1000円という激安です。ちょっと試してみるには良い商品かと思います。

■ 28BYJ-48 Stepper Motor

8


■ ULN2003 driver

9

それぞれの仕様

■ 28BYJ-48 Stepper Motor

概要 仕様
種類 ユニポーラ型
結線 5線式
電圧 5-12V(直流電圧)
周波数 100 Hz
ステップモード ハーフステップモード(推奨)(8ステップの信号で制御)
ステップ角 ハーフステップモード:64ステップで5.625°回転
ギア比 64:1

※ギア比…2つの歯車(ギア)の歯数の比率のこと。自転車をイメージすると良い。
※ハーフステップモード…ステップ角が基本ステップ角度の1/2の角度で駆動する方式。


■ ULN2003 driver

ステッピングモータを使う際には、ステッピングモータ用のドライバを使用します。マイコンボードの信号だけでは制御できないので、制御を補助するためのものです。

1-2相励磁で制御する場合は、下記のような信号の組み合わせになります。

10
(参照:http://eeshop.unl.edu/pdf/Stepper+Driver.pdf

このステッピングモータでは8ステップで1つの動作を表しています。つまり、8ステップ×8ステップ=64ステップで5.625°回転します。よって1回転するには360°÷5.625°×64=4096ステップで1回転します。

回路

Nefry BTとステッピングモータの回路は下記のようになります。

11
今回、使用するステッピングモータは5~12Vの間で動作します。また、Nefry BTとステッピングモータの電源は分けて使います。

プログラム(ライブラリあり)

プログラムは下記の通りです。

Nefry BT上のスイッチを押すとステッピングモータが180°回転するというものです。今回は、ステッピングモータを回転させるため「Stepper.h」ライブラリを使いました。

// ステッピングモータとNefry BTを制御するためのライブラリをinclude
#include <Stepper.h>
#include <Nefry.h>

/*
・フルステップ方式で2相励磁の場合は1つの動作で4ステップ
・8回繰り返す(4×8 = 32ステップ)で11.25度回転
・つまり、360度回転しようとするとき360/11.25 = 32ステップ
・ギア比を考慮して32×64 = 2048ステップ
・よって、ハフルステップ方式で2相励磁の場合、2048ステップで1回転
*/

/*
・ハーフステップ方式で1-2相励磁の場合は1つの動作で8ステップ
・8回繰り返す(8×8 = 64ステップ)と5.625度回転
・つまり、360度回転しようとすると360/5.625 = 64ステップ
・ギア比を考慮して64×64 = 4096ステップ
・よって、ハーフステップ方式で1-2相励磁の場合、4096ステップで1回転
*/

#define MOTOR_1   D2   // blue
#define MOTOR_2   D3   // pink
#define MOTOR_3   D4   // yellow
#define MOTOR_4   D5   // orange

// ステッピングモータが1回転するのに必要なステップ数を定義
#define MOTOR_STEPS 2048

Stepper myStepper(MOTOR_STEPS, MOTOR_1, MOTOR_2, MOTOR_3, MOTOR_4);

void setup() {
    // setspeed()関数でrpm(1分あたりの回転数)を設定
    // 例:10rpm=10回転/分
    myStepper.setSpeed(10);//10回転/分
}

void loop() {
    if(Nefry.readSW()){
        // 1024ステップ回転、つまり180°回転
        myStepper.step(1024);
    }
    // 静止時の負荷がないので電流を止める
    stopMotor();
}

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

動かしてみると

実際に動かしてみると、180°回転していることがわかります。

プログラム(ライブラリなし)

ステッピングモータの仕組みを理解する場合、ライブラリなしの方がわかりやすいかと思います。

下記はライブラリを使わずに励磁方式を変えてステッピングモータを制御したプログラムです。先ほど示した励磁方式の図を見ながら理解すると、良くわかるかと思います。

今回、使用するドライバには各相に対応してLEDが点灯するので、どの相に電圧を印加したかわかりやすいですね。


■ 1相励磁

#include<Nefry.h>

// 任意のピンを設定してください。基本、デジタルピンでOKです。都合上A2,A3を使っています。
#define PIN1 A2
#define PIN2 A3
#define PIN3 D3
#define PIN4 D4

void setup()
{

  Serial.begin(115200);

  pinMode(PIN1, OUTPUT);      // PIN1を出力モードにする
  pinMode(PIN2, OUTPUT);      // PIN2を出力モードにする
  pinMode(PIN3, OUTPUT);      // PIN3を出力モードにする
  pinMode(PIN4, OUTPUT);      // PIN4を出力モードにする
}

void loop()
{
  int sleep_time = 300;       // スリープ時間[ms]、時間を短くすると回転速度上昇

  digitalWrite(PIN1, 1);    
  digitalWrite(PIN2, 0);
  digitalWrite(PIN3, 0);
  digitalWrite(PIN4, 0);
  delay(sleep_time);

  digitalWrite(PIN1, 0);
  digitalWrite(PIN2, 0);
  digitalWrite(PIN3, 1);
  digitalWrite(PIN4, 0);
  delay(sleep_time);    

  digitalWrite(PIN1, 0);
  digitalWrite(PIN2, 0);
  digitalWrite(PIN3, 0);
  digitalWrite(PIN4, 1);
  delay(sleep_time);

  // 電流を流し続けると発熱するのでいったん止める
  digitalWrite(PIN1, 0);
  digitalWrite(PIN2, 0);
  digitalWrite(PIN3, 0);
  digitalWrite(PIN4, 0);
  delay(sleep_time);
}


■ 2相励磁

#include<Nefry.h>

#define PIN1 A2
#define PIN2 A3
#define PIN3 D3
#define PIN4 D4

void setup()
{
  Serial.begin(115200);

  pinMode(PIN1, OUTPUT);
  pinMode(PIN2, OUTPUT);
  pinMode(PIN3, OUTPUT);
  pinMode(PIN4, OUTPUT);
}

void loop()
{

  int sleep_time = 5;

  digitalWrite(PIN1, 1);    
  digitalWrite(PIN2, 1);
  digitalWrite(PIN3, 0);
  digitalWrite(PIN4, 0);
  delay(sleep_time);

  digitalWrite(PIN1, 0);
  digitalWrite(PIN2, 1);
  digitalWrite(PIN3, 1);
  digitalWrite(PIN4, 0);
  delay(sleep_time);

  digitalWrite(PIN1, 0);
  digitalWrite(PIN2, 0);
  digitalWrite(PIN3, 1);
  digitalWrite(PIN4, 1);
  delay(sleep_time);

  digitalWrite(PIN1, 1);
  digitalWrite(PIN2, 0);
  digitalWrite(PIN3, 0);
  digitalWrite(PIN4, 1);
  delay(sleep_time);

  // 電流を流し続けると発熱するのでいったん止める
  digitalWrite(PIN1, 0);
  digitalWrite(PIN2, 0);
  digitalWrite(PIN3, 0);
  digitalWrite(PIN4, 0);
  delay(sleep_time);
}


■ 1-2相励磁

#include<Nefry.h>

#define PIN1 A2
#define PIN2 A3
#define PIN3 D3
#define PIN4 D4

void setup()
{
  Serial.begin(115200);

  pinMode(PIN1, OUTPUT);
  pinMode(PIN2, OUTPUT);
  pinMode(PIN3, OUTPUT);
  pinMode(PIN4, OUTPUT);
}

void loop()
{
  int sleep_time = 5;

  digitalWrite(PIN1, 1);    
  digitalWrite(PIN2, 0);
  digitalWrite(PIN3, 0);
  digitalWrite(PIN4, 0);
  delay(sleep_time);

  digitalWrite(PIN1, 1);
  digitalWrite(PIN2, 1);
  digitalWrite(PIN3, 0);
  digitalWrite(PIN4, 0);
  delay(sleep_time);

  digitalWrite(PIN1, 0);
  digitalWrite(PIN2, 1);
  digitalWrite(PIN3, 0);
  digitalWrite(PIN4, 0);
  delay(sleep_time);

  digitalWrite(PIN1, 0);
  digitalWrite(PIN2, 1);
  digitalWrite(PIN3, 1);
  digitalWrite(PIN4, 0);
  delay(sleep_time);

  digitalWrite(PIN1, 0);
  digitalWrite(PIN2, 0);
  digitalWrite(PIN3, 1);
  digitalWrite(PIN4, 0);
  delay(sleep_time);

  digitalWrite(PIN1, 0);
  digitalWrite(PIN2, 0);
  digitalWrite(PIN3, 1);
  digitalWrite(PIN4, 1);
  delay(sleep_time);

  digitalWrite(PIN1, 0);
  digitalWrite(PIN2, 0);
  digitalWrite(PIN3, 0);
  digitalWrite(PIN4, 1);
  delay(sleep_time);

  digitalWrite(PIN1, 1);
  digitalWrite(PIN2, 0);
  digitalWrite(PIN3, 0);
  digitalWrite(PIN4, 1);
  delay(sleep_time);

  //電流を流し続けると発熱するのでいったん止める
  digitalWrite(PIN1, 0);
  digitalWrite(PIN2, 0);
  digitalWrite(PIN3, 0);
  digitalWrite(PIN4, 0);
  delay(sleep_time);
}


作例: xy軸ステージ

ステッピングモータを使えば、3Dプリンタの軸に使われているような可動式のステージを自作することも可能です。

たとえば、下記が自作したxy軸の2軸ステージです。また、これはNode-REDで遠隔制御できるようにしています。

16

おわりに

モータの世界はまだまだ奥深いのですが、今回はここまでです。

ステッピングモータが使えれば、さらにモノづくりの幅が広がることでしょう。また、IoT向きの開発ボードNefry BTを使えば、遠隔制御できる「何か」を割と簡単に作ることができます。

参考サイト

    このエントリーをはてなブックマークに追加