Genkanテックブログ

Arduino UNO と TB6612FNGでDVDドライブのステッピングモータを制御

初めまして。KOSKAのハードウェアエンジニアでインターン生の上原です。
第二回技術ブログでは,Arduino UNOとデュアルモータドライバTB6612FNGを用いたステッピングモータの制御について書きます。 PCからの入力により,ステッピングモータのステップ数と向き,速さの制御が可能です。

Genkanはこのようにハードウェア開発をしたい方、ジャンク品の制御に挑戦してみたい方を募集中です! 興味があれば是非ご連絡ください!

GenKan実験機問題

GenKanは工作機械にセンサーやカメラをつけることで自動でサイクルタイムを取得し、原価計算を自動化するサービスです。

弊社では様々な手法で工作機械のサイクルタイムを簡単に計測するアルゴリズムを開発しています。

そこで問題になるのが、工作機械の実験をどのようにするかということです。 巨大な工作機を買って実験するのは非常に難しいですし、似たような動きをする機械を自作する必要がありました。

実験機の要件は以下の3つです。

  • 直動の動きを制御できる機械
  • 手軽に入手できる
  • 小さくてどこでも実験しやすい

その実験機として採用されたものの一つが「DVDドライブ」です。

DVDドライブを利用したGenKanカメラ実験

DVDドライブを使ったGenKanカメラ実験の様子

DVDドライブが内蔵しているモーターを制御することで、様々なタイミングで動く機械を再現し、実験機とすることができました。

DVDドライブのステッピングモータを制御

・使用部品

1. ステッピングモータ
2. Arduino UNO
3. デュアルモータドライバ (TB6612FNG)


・ステッピングモータ

ステッピングモータは,DCモータと異なり,図1のように複数のコイルを組み合わせることで,細かいステップ角で回転します。 磁極数が増えるとより細かく回転します。

f:id:Genkan:20190406132322p:plain:w480
図1) ステッピングモータの原理
https://www.edaboard.com/showthread.php?217270-cd-rom-drive-stepper-motor

図1のように,Step1から,A,Bのコイルの電流の向きが切り替わることで,1ステップにつき90°回転し,これを4回切り替えることで1周します。
今回は,DVDドライブの中のステッピングモータを使用しました。
f:id:Genkan:20190406132513j:plain:w480
図2) 今回使用したステッピングモータ


・TB6612FNG

TB6612FNGは,モータを2個接続できるモータドライバモジュールです。 A,Bの各チャンネルに入力が3本あり,1チャンネルで1つのモータを制御することができます。VMにはモータ用の電源を接続します。STBYピンをhighにすることで,スタンバイモードから解除できます。
f:id:Genkan:20190406132632j:plain


通常,ステッピングモータを制御するには,ステッピングモータドライバを使って制御しますが,今回用いたステッピングモータは動作するのに高い電圧を必要としないため,低電圧で制御が可能なデュアルモータドライバを用いて制御を行いました。


・TB6612FNGのピン配置

VM:ステッピングモータ供給電源(2.5–13.5V)
Vcc : ボード電源(5V)
A1, B1, A2, B2 : ステッピングモータへ
AIN2 : Digital 4ピンへ
AIN1 : Digital 5ピンへ
BIN1 : Digital 6ピンへ
BIN2 : Digital 7ピンへ
PWMA, PWMB : Vccピンへ
STBY : Vccピンへ


f:id:Genkan:20190406132705p:plain

図4) Fritzingによる実態配線図


電池からTB6612FNG のVMに繋ぐことで電源を供給します。
今回,Arduinoでステッピングモータを制御するプログラム作成するにあたり,ArduinoのStepper Libraryを用いました。
https://www.arduino.cc/en/Reference/Stepper

ソースリスト
//ステッピングモータ1つを制御するようのプログラム
//ステッピング1は(STEPS, 4, 5, 6, 7)、aで正,bで負回転
//serial入力例 100aで100回回転,200bで-200回回転
//20cで回転速度が20になる

#include <Stepper.h>
#define STEPS 200  // 用意したモータのステップ数に変える
Stepper stepper(STEPS, 4, 5, 6, 7);  // モータのステップ数とピンを指定して、ステッパークラスのインスタンスを作成。
// グローバル変数の宣言
char input[5];  // inputに5つの文字を格納できるようにする
int i = 0;      // inputに格納されている文字数のカウンタ
int val = 0;    // 受信した数値
int steps = 60;    // ステッピングモータのステップ数
int motorSelect = 0;//0はなし、1は正回転,2は負回転
void setup()
{
  Serial.begin(9600); //シリアル通信のレートを9600に設定
  Serial.println("Stepper test!");
  stepper.setSpeed(40);  // モータの速度を40に設定
}

// シリアル通信で受信したデータを数値に変換
int serialNumVal(){
  // データを受信したときの処理
  // inputのi=0からa, b, cのどれかの文字を見つける。いずれかがある場合inputFlagが1になり次の処理へ
  // 無い場合はinputFlagが0になり処理が終了
  if (Serial.available()) {
    input[i] = Serial.read(); //シリアル通信で送信された値を読み取る
     // 末尾がa,b,cそれぞれの処理
    char inputFlag = 0;
    char select_char = input[i];
    inputFlag = 1;
    switch(select_char){
      case 'a':                  //末尾にaを入力した場合
        motorSelect = 1;
        break;
      case 'b':                  //末尾にbを入力した場合
        motorSelect = 2;
        break;
       case 'c':                 //末尾にcを入力した場合
        motorSelect = 3;
        break;
    default:
     inputFlag = 0;              // 無い場合は,処理が終了
    }
    // a, b, cのどれかがある場合は以下の処理。inputの文字列を送信
    if(inputFlag == 1){
      input[i] = '\0';      // 末尾に終端文字の挿入
      val = atoi(input);    // 文字列を数値に変換
      Serial.write(input); // 文字列を送信
      Serial.write("\n");  //改行
      i = 0;      // カウンタの初期化
     inputFlag = 0;
    }
    else { i++; }
  }
  return val;
}

void loop()
{
  steps = serialNumVal();
  if(motorSelect == 1)       //末尾がaのとき
  {  
  stepper.step(steps);    //入力した数値分のステップ数だけ正の方向にモータが動く
  Serial.println(steps);  //入力した数値を表示
  Serial.println("st1+");  //st1+を表示
   motorSelect=0;
  }
  else if(motorSelect == 2)  //末尾がbのとき
  {  
  stepper.step(-steps);   //入力した数値分のステップ数だけ負の方向にモータが動く
  Serial.println(steps);  //入力した数値を表示
  Serial.println("st1-");  //st1-を表示
   motorSelect=0;
  }
  else if(motorSelect == 3)  //末尾がcのとき
  {  
  stepper.setSpeed(steps);  //入力した数値の速さで動く
  Serial.println(steps);    //入力した数値を表示
  Serial.println("setSpeed");//setSpeedを表示
   motorSelect=0;
  }
}

Arduinoのシリアルモニタから「100a」や「200b」などを入力することでステップ数や向きを変えることができ,「40c」などを入力することで速度を変えることができますので,数値をいろいろ入力し試してみてください。


実行例


f:id:Genkan:20190406141104g:plain

図5) 実行例


まとめ

今回は,ステッピングモータの制御をステッピングモータドライバを用いずにデュアルモータドライバを用いて行いました。
制御できる項目としては,

・ステップ数
・回転方向
・速度

です。

参考URL

ステッピングモータの制御
https://learn.adafruit.com/adafruit-tb6612-h-bridge-dc-stepper-motor-driver-breakout/using-stepper-motors

ステッピングモータの説明
https://monoist.atmarkit.co.jp/mn/articles/1606/10/news011.html
https://www.edaboard.com/showthread.php?217270-CD-ROM-Drive-Stepper-motor

ステッピングモータドライバ(TB6612FNG)の説明
https://www.switch-science.com/catalog/3586/
http://doc.switch-science.com/datasheets/TB6612FNG_datasheet_ja_20141001.pdf