最終更新日
記事公開日

[Arduino]Stepper.hライブラリを使わずにステッピングモーターを制御する

ステッピングモーターを制御しているArduinoと自作回路

今回は[Stepper.h]のようなArduinoライブラリを使わずに、自力でステッピングモーターを動かすためのプログラムを紹介します。

「もっと細かくステッピングモーターの動作をカスタマイズしたい」

「違う種類の励磁方式でステッピングモーターを動かしてみたい」

という方、ぜひ参考にしてみて下さい。

目次

励磁方式の違い

  • 1相励磁方式 ・・・ 消費電力が低いが、その分、トルクも小さい。高速回転には不向きで振動が発生しやすい。
  • 1-2相励磁方式 ・・・ ステップ角が細かく、最も滑らかに動く。
  • 2相励磁方式 ・・・ 消費電力が大きいが、その分、トルクも大きい。回転が安定しており、動きも滑らか。

回路図

ステッピングモーターを制御するための回路図
Arduinoとモータードライバを繋ぐ自作回路(部品実装面)
Arduinoとモータードライバを繋ぐ自作回路(配線面)

使用するもの

  • マイコン(Arduino Uno R3)
  • モータードライバ(DRV8835)
  • ステッピングモーター(ST-42BYH1004)
  • スイッチ
  • 抵抗(1kΩ)×2
  • 外部電源(コンセント - USB ACアダプタ - 自作ケーブルで供給)
コンセント - USB ACアダプタ - 自作ケーブル

※PCとのUSB接続だけでは電流不足ですぐにモーターが停止してしまいます。PCと繋いでいるときも、必ず外部電源を用意してVINラインに接続して下さい。

プログラム

#define BIN2 8   // 青
#define BIN1 9   // 赤
#define AIN2 10  // 緑
#define AIN1 11  // 黒

// [1] 1相励磁方式   / 右回転
// [2] 1相励磁方式   / 左回転
// [3] 1-2相励磁方式 / 右回転
// [4] 1-2相励磁方式 / 左回転
// [5] 2相励磁方式   / 右回転
// [6] 2相励磁方式   / 左回転
int mode = 6;

// 停止間隔(大きくするほどスピードが遅くてトルクが大きい)
int speed = 30;

// スイッチの入力Pin
int sw_pin = 12;   

// SWの状態
volatile int sw;  

void sw_on(void);

void setup() {

   pinMode(BIN2, OUTPUT);  // デジタルピンを出力に設定
   pinMode(BIN1, OUTPUT);
   pinMode(AIN2, OUTPUT);
   pinMode(AIN1, OUTPUT);
   
  pinMode(sw_pin,INPUT);

  // 立ち上がりで割り込み処理開始
  attachInterrupt(1,sw_on, RISING);
  
}

void loop() {

  // スイッチを長押し中かどうか
  sw = digitalRead(sw_pin);

  // スイッチがONのときのみモーターを回転
  if(sw == 1) {

    // 励磁方式
    switch (mode) {

      // 1相励磁方式(右回転)
      case 1:

        // STEP1
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, HIGH);
        delay(speed);

        // STEP2
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, HIGH);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, LOW);
        delay(speed);

        // STEP3
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, HIGH);
        digitalWrite(AIN1, LOW);
        delay(speed);
      
        // STEP4
        digitalWrite(BIN2, HIGH);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, LOW);
        delay(speed);
      
        break;

      // 1相励磁方式(左回転)
      case 2:
      
        // STEP1
        digitalWrite(BIN2, HIGH);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, LOW);
        delay(speed);
          
        // STEP2
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, HIGH);
        digitalWrite(AIN1, LOW);
        delay(speed);
          
        // STEP3
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, HIGH);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, LOW);
        delay(speed);
          
        // STEP4
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, HIGH);
        delay(speed);      
              
        break;

      // 1-2相励磁方式(右回転)
      case 3:

        // STEP1
        digitalWrite(BIN2, HIGH);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, HIGH);
        delay(speed);

        // STEP2
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, HIGH);
        delay(speed);

        // STEP3
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, HIGH);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, HIGH);
        delay(speed);

        // STEP4
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, HIGH);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, LOW);
        delay(speed);

        // STEP5
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, HIGH);
        digitalWrite(AIN2, HIGH);
        digitalWrite(AIN1, LOW);
        delay(speed);

         // STEP6
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, HIGH);
        digitalWrite(AIN1, LOW);
        delay(speed);

        // STEP7
        digitalWrite(BIN2, HIGH);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, HIGH);
        digitalWrite(AIN1, LOW);
        delay(speed);
          
        // STEP8
        digitalWrite(BIN2, HIGH);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, LOW);
        delay(speed);

        break;
      
      // 1-2相励磁方式(左回転)
      case 4:
      
        // STEP1
        digitalWrite(BIN2, HIGH);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, LOW);
        delay(speed);
        
        // STEP2
        digitalWrite(BIN2, HIGH);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, HIGH);
        digitalWrite(AIN1, LOW);
        delay(speed);
        
        // STEP3
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, HIGH);
        digitalWrite(AIN1, LOW);
        delay(speed);
        
        // STEP4
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, HIGH);
        digitalWrite(AIN2, HIGH);
        digitalWrite(AIN1, LOW);
        delay(speed);
        
        // STEP5
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, HIGH);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, LOW);
        delay(speed);
        
        // STEP6
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, HIGH);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, HIGH);
        delay(speed);
        
        // STEP7
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, HIGH);
        delay(speed);
        
        // STEP8
        digitalWrite(BIN2, HIGH);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, HIGH);
        delay(speed);

        break;

      // 2相励磁(右回転)
      case 5:

        // STEP1
        digitalWrite(BIN2, HIGH);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, HIGH);
        delay(speed);

        // STEP2
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, HIGH);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, HIGH);
        delay(speed);
        
        // STEP3
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, HIGH);
        digitalWrite(AIN2, HIGH);
        digitalWrite(AIN1, LOW);
        delay(speed);
        
        // STEP4
        digitalWrite(BIN2, HIGH);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, HIGH);
        digitalWrite(AIN1, LOW);
        delay(speed);
                
        break;
        
      // 2相励磁(左回転)
      case 6:
      
        // STEP1
        digitalWrite(BIN2, HIGH);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, HIGH);
        digitalWrite(AIN1, LOW);
        delay(speed);
        
        // STEP2
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, HIGH);
        digitalWrite(AIN2, HIGH);
        digitalWrite(AIN1, LOW);
        delay(speed);
        
        // STEP3
        digitalWrite(BIN2, LOW);
        digitalWrite(BIN1, HIGH);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, HIGH);
        delay(speed);
        
        // STEP4
        digitalWrite(BIN2, HIGH);
        digitalWrite(BIN1, LOW);
        digitalWrite(AIN2, LOW);
        digitalWrite(AIN1, HIGH);
        delay(speed);
        
        break;
        
    }

  }
 
}

// スイッチが押されたときの割り込み処理
void sw_on(void) {
  sw = 1;
}

「mode」の値を書き換えることで、励磁方式が変更されます。

ボタンを押しっぱなしにしている間、ステッピングモーターが回転します。

実際の使用例

この記事のURLをコピー

メールアドレスは公開されませんのでご安心ください。また、* が付いている欄は必須項目となります。

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。

関連情報

運営者プロフィール
コダマ

職業はIT系フリーランス。過去、電子配線業務の経験が10年ある為、はんだづけも得意です。宮崎県在住、30代・2児の父親。

プロが教える!イチからわかるハンダ付けのコツ(工学社)の著者です。

カテゴリー