ステッピングモーターを使ってみる(Arduino)

今回は、ステッピングモーターです。

DCモーターは、一般に電流を流すと軸が回転します。
サーボモーターは、信号によって0度~?度の角度を制御できます。
ステッピングモーターは、信号により回転範囲に制限なく回転制御できます。

今回、私が使用するステッピングモーター(28BYJ-48)と、
ステッピングモータドライブモジュール(ULN2003) です。

ステッピングモータとドライブモジュール
ステッピングモータとドライブモジュール

ユニポーラ ステッピングモーター 28BYJ-48
  ¥250- [28BYJ-48]
   秋月電子通商
   http://akizukidenshi.com/catalog/g/gP-13256/

ステッピングモータ
  ¥450- [28BYJ48]
   aitendo
   https://www.aitendo.com/product/10239

ステッピングモータドライブモジュール
  ¥395- [M2003-4P]
   aitendo
   https://www.aitendo.com/product/10238

ステッピングモータドライブキット
  ¥350- [K-2003A]
   aitendo
   https://www.aitendo.com/product/14589

ステッピングモータは、
回転子(軸)の種類で、
 PM(Permanent Magnet)型、
 VR(Variable Reluctance)型、
 HB(Hybrid)型
コイルへの電流供給方法で、
 ユニポーラ型(単極)、
 バイポーラ型(双極)
の各型に分類されます。

今回使用するステッピングモーター(28BYJ-48)の
仕様の確認をしておきます。
 ・ギア比:1/64(中心軸が64回転すると外軸が1回転)
 ・相数:2相ユニポーラ(相数:4)
 ・ステップ角:5.625°
 ・出力軸1回転のステップ数:2048(2相励磁)
  ※2相励磁で無負荷の最高回転数は4秒で1回転です。
 ・定格電圧:5V
 ・直流抵抗:約22Ω(?)
 ・周波数:100Hz
 ・結線:5線式

回転を制御する励磁方式には、
・1相励磁方式
・2相励磁方式
・1-2相励磁方式
の3つの方式があり、
それぞれ,
・1相励磁方式:(One Phase On)
  パルスを順番に与えていく方式
  ・動きにガタガタ感がありトルクは弱いが省電力
・2相励磁方式:(Two Phase On)
  2相ごとパルスを順番に与えていく方式
  ・動きがなめらかでトルクは強い
・1-2相励磁方式:(Half Stepping)
  3相ごとパルスを順番に与えていく、
  1相、2相の倍のフェーズを必要とする方式
  ・1相、2相励磁の動作角が半分となり、
   細かい回転制御が可能
などの特徴があります。

回転を制御する励磁方式
回転を制御する励磁方式

ステッピングモーターを反転1/2回転(180度)、
正転1/4回転(90度)を繰り返すスケッチをしてみます。

回路は図の通りです。
   この回路図の作図には fritzing を利用させて頂いております。
   https://fritzing.org/home/

回路図1
回路図1
ステッピングモーター(28BYJ-48)配線色
ステッピングモーター(28BYJ-48)配線色

このスケッチには、Stepper ライブラリを使用しますが、
このライブラリはインストールされていると思います。
ステッピングモータドライブモジュール(ULN2003) と、
このStepper ライブラリを使用すると、制御は2相励磁方式となります。

Stepper ライブラリの基本関数です。
・オブジェクト生成
  Stepper オブジェクト名( 1回転当たりのステップ数,
         IN4のピン番号, IN2のピン番号, IN3のピン番号, IN4のピン番号 )
  Stepper stepper1( 2048, 8, 10, 9, 11 )
・1分間当たりの回転数設定
  オブジェクト名.setSpeed( 毎分の回転数 )
  stepper1.setSpeed( 5 )
・回転処理
  オブジェクト名.step( 回転させるステップ数 )
  stepper1.step( 1024 )
  2048ステップで1回転の場合、1/2(180度)回転します。

スケッチです。

// ライブラリ使用宣言
#include <Stepper.h>

// オブジェクト生成
Stepper stepper1( 2048, 8, 10, 9, 11 );

void setup() {
  // put your setup code here, to run once:
  // 1分間当たりの回転数設定
  stepper1.setSpeed( 5 );
}

void loop() {
  // put your main code here, to run repeatedly:
  // 1/2(180度)反転させる
  stepper1.step( 1014 );
  // 出力停止
  digitalWrite(8,  LOW); 
  digitalWrite(10,  LOW); 
  digitalWrite(9, LOW); 
  digitalWrite(11, LOW);     
  delay(5000);    // 5000ms停止

  // 1/4(90度)正転させる
  stepper1.step( -512 );
  // 出力停止
  digitalWrite(8,  LOW); 
  digitalWrite(10,  LOW); 
  digitalWrite(9, LOW); 
  digitalWrite(11, LOW);     
  delay(5000);    // 5000ms停止
}
Arduino  IDE
Arduino IDE

Arduino に書き込んで実行します。

実際の配線と実行画面
実際の配線と実行画面


たいへんゆっくりとした動作で反転、正転を繰り返しています。
外軸に触れてみると、トルクは結構あります。

では、ライブラリを使わずにスケッチしてみます。
2相励磁方式(One Phase On)を使用して、
動作は同じ、1/2(180度)反転、1/4(90度)正転を繰り返すものです。

スケッチです。

// 使用デジタルピン番号
int pin_no[4] = { 8, 9, 10, 11 };

// 1相励磁方式(One Phase On)
int one_phase[4][4] = {
  { 1, 0, 0, 0 },
  { 0, 1, 0, 0 },
  { 0, 0, 1, 0 },
  { 0, 0, 0, 1 }
};
// 2相励磁方式(One Phase On)
int two_phase[4][4] = {
  { 1, 1, 0, 0 },
  { 0, 1, 1, 0 },
  { 0, 0, 1, 1 },
  { 1, 0, 0, 1 }
};
// 1-2相励磁方式(One Phase On)
int half_step[4][8] = {
  { 1, 1, 1, 0, 0, 0, 0, 0 },
  { 0, 0, 1, 1, 1, 0, 0, 0 },
  { 0, 0, 0, 0, 1, 1, 1, 0 },
  { 1, 0, 0, 0, 0, 0, 1, 1 }    
};

void setup() {
  // put your setup code here, to run once:
  // デジタルピンモード設定
  for ( int i = 0; i < 4; i++ ){
    pinMode( pin_no[i], OUTPUT );
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  // 2相励磁方式(One Phase On)にて
  // モーターを1/2反転させる
  for( int s = 0; s < 256; s++ ){ 
    for ( int i = 0; i < 4; i++ ){
      digitalWrite( pin_no[0], two_phase[i][0] );  
      digitalWrite( pin_no[1], two_phase[i][1] );  
      digitalWrite( pin_no[2], two_phase[i][2] );  
      digitalWrite( pin_no[3], two_phase[i][3] );
      delay( 5 );   // 5ms停止
    }
  }
  // 出力停止
  digitalWrite(pin_no[0], LOW); 
  digitalWrite(pin_no[1], LOW); 
  digitalWrite(pin_no[2], LOW); 
  digitalWrite(pin_no[3], LOW); 
  delay( 5000 );    // 5000ms停止

  // モーターを1/4(90度)正転させる
  for( int s = 0; s < 128; s++ ){ 
    for ( int i = 3; i >= 0; i-- ){
      digitalWrite( pin_no[0], two_phase[i][0] );  
      digitalWrite( pin_no[1], two_phase[i][1] );  
      digitalWrite( pin_no[2], two_phase[i][2] );  
      digitalWrite( pin_no[3], two_phase[i][3] );
      delay( 5 );   // 5ms停止
    }
  }
  // 出力停止
  digitalWrite(pin_no[0], LOW); 
  digitalWrite(pin_no[1], LOW); 
  digitalWrite(pin_no[2], LOW); 
  digitalWrite(pin_no[3], LOW); 
  delay( 5000 );    // 5000ms停止
}

回路は同じです。
Arduino に書き込んで実行します。

Arduino  IDE
Arduino IDE

前のスケッチと同じく反転、正転の動作を繰り返します。

ステッピングモーター(28BYJ-48)専用のライブラリもあります。
このライブラリはインストールが必要です。

ArduinoIDEにインストールする方法は、
1.メニュー「スケッチ」 → 「ライブラリをインクルード」
   → 「ライブラリを管理」 を選択します。

ライブラリはインストール1
ライブラリはインストール 1

2.ライブラリマネージャ画面の
 検索欄に、”STEPPER_28BYJ_48” と入力します。
 表示された一覧の中から、
 ”STEPPER_28BYJ_48”を選択し、〔インストール〕ボタンと押します。

ライブラリはインストール2
ライブラリはインストール 2

インストールした、STEPPER_28BYJ_48 ライブラリには、
サンプルスケッチがありますので、読み込んでみます。
1.メニュー「ファイル」 → 「スケッチ例」
   → 「Stepper_28BYJ_48」
      → 「Stepper_28BYJ_example」を選択します。

このサンプルスケッチは、
 ブレッドボード上に配置した二つのタクトスイッチを押すと、
 押している間だけ、それぞれ、正転・反転するものです。

回路は図の通りです。

回路図2
回路図2

スケッチを変更します。

// Stepper_28BYJ_48ライブラリ使用宣言
#include "Stepper_28BYJ_48.h"

// スイッチ用ピン番号設定
int switch_1_pin = 12;    // 反転
int switch_2_pin = 13;    // 正転

// オブジェクト生成(出力ピン設定)
Stepper_28BYJ_48 stepper(8,9,10,11);

void setup() {
  // put your setup code here, to run once:
  // スイッチ用ピン設定(プルアップ設定)
  pinMode(switch_1_pin,INPUT_PULLUP);
  pinMode(switch_2_pin,INPUT_PULLUP);

}

void loop() {
  // put your main code here, to run repeatedly:
  // switch_1_pin ON時 反転
  if ( digitalRead(switch_1_pin) == LOW ) {
      stepper.step(-1);
  }
  
  // switch_2_pin ON時 正転
  if ( digitalRead(switch_2_pin) == LOW ) {
      stepper.step(1);
  }
}

このスケッチでは、
デジタルピンの設定が変更されています。

Arduino に書き込んで実行します。

Arduino  IDE
Arduino IDE
実際の配線と実行画面
実際の配線と実行画面

タクトスイッチが1個しかありませんでしたので、
デジタルピン12番、13番は差し替えてのテストです。

※ページ内の記載で
 正転:時計回り、
 反転(逆転):反時計回り、
 の表現が、誤っているかもしれません。