モータを動かす その1 重ねるだけで使えるシールド

ステッピング・モータはコントローラとともに使う

 電子工作で使われるモータには何種類かあります。その中で、電源をつないだだけでは回らないのがステッピング・モータです。モータの中には巻き線が二組あって、電流を流すタイミングを少しずらして駆動します。電流を流す制御のためにMOS FETが使われます。回転方向を自由にコントロールしたいので、4個使ったHブリッジという回路が使われます。

 市販品のステッピング・モータ用コントローラは、

  • Hブリッジのみ
  • 二つの電流の流すタイミングを作るのみ

というIC以外に、それら二つを合体し過熱防止回路などを含んだICもあります。こちらでは東芝の古典的なIC TB6600を使っています。ここでは、STMicroelectronicsのL6474 を搭載したX-NUCLEO-IHM01A1 ボードを利用します。Digi-keyで購入(約1600円)しました。

 ボード(シールド)はArduinoのピンヘッダに合わせているので、Arduino UNOの上に挿し込むだけで利用できます。同社の解説ページにはmbedのプログラムへのリンクがあります。検索するとGitHubにArduino用のライブラリがありました。

 ArduinoのライブラリにあるStepperは、電流を増幅するドライバ経由でステッピング・モータをコントロールします。電流のON/OFFタイミングはソフトウェアで作っています。ここでは使いません。

X-NUCLEO-IHM01A1ボードのスペック

  • 1相あたり最大3Armsの電流を供給
  • モータ用電源8~45V
  • インターフェースの電源は3.3/5Vに対応
  • インターフェース SPI(最大5MHz)
  • 駆動パルスの最大値2MHz

 このボードは、3枚重ねて三つのモータを制御できるように作られているので、ジャンパ類が複雑です。1枚だけの利用であれば、デフォルトのまま制御できます。

 ロジックの電源Vddは、Arduino UNOのIOREF端子からとっているので5Vです。

利用したモータは約1500円

 自作3Dプリンタ用にアマゾンで販売されているNEMA17です。名称は同じでもいろいろなバリエーションがあります。厚みのあるのはトルクが大きいです。2相駆動なので内部のコイルは二組です。コネクタは6ピンが使われている場合もありますが、必要なのは4本です。ケーブルの色は様々で、色分けは3系統ほどあるようです。

最初はライブラリを使わずに回転

 TB6600を利用したときは、

  • 回転方向の指定
  • イネーブル
  • 駆動パルス

の三つを制御するだけで利用できました。L6474 は、加えて次の2点を制御します。

  • パワーオン・リセットだけではICのSPIバスが動かないので、リセットを10us以上かける
  • デバイスの電源をONするEnableを単独で実行

接続

 ターミナルCN1に、モータ用電源をつなぎます。実験用電源Model PA-B 32-2で12~15V、電流制限を約1Aに設定しました。

 同CN1には「A+黒色、A-緑色、B+赤色、B-青色」をつなぎました。モータによっては、「A+緑、A-灰、B+黄、B-赤」や「A+黒、A-橙、B+赤、B-黄」もあるようです。

スケッチ

 高速にCW(時計回り)、少しスピードを落としてCCW(反時計回り)を繰り返します。長時間動かすとモータは熱くなります。SPIバスは電力ユニットをONにするためだけに利用していますが、各種レジスタの設定や位置情報の読み出しにも使えます。

#include <SPI.h>
#define DIR1Pin 7 // High=CW,Low=CCW
#define RST 8 // Hight=Enable
#define PWM1Pin 9 // clock
#define SS 10 // Chip Select
#define MOSI 11
#define MISO 12
#define SCK 13
#define ENABLE 0xb8

void setup() {
Serial.begin (9600);
pinMode(DIR1Pin, OUTPUT);
pinMode(PWM1Pin, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SS,OUTPUT);
digitalWrite(RST,0); //reset
delay(1);
digitalWrite(RST,1);
SPI.begin();
digitalWrite(SS,0);
SPI.transfer(ENABLE); //L6474 Power on
digitalWrite(SS,1);
}

void loop() {
Serial.println("start loop");

digitalWrite(DIR1Pin,1);
digitalWrite(RST,1);
Serial.println("forward ");
for (int i=0;i<30000;i++){
digitalWrite(PWM1Pin, LOW);
delayMicroseconds(30);
digitalWrite(PWM1Pin, HIGH);
delayMicroseconds(30);
}

Serial.println("backwards ");
digitalWrite(DIR1Pin,0);
digitalWrite(RST,1);
for (int i=0;i<20000;i++){
digitalWrite(PWM1Pin, LOW);
delayMicroseconds(200);
digitalWrite(PWM1Pin, HIGH);
delayMicroseconds(200);
}
}

前へ

温度を測る その6 0.1℃まで測りたい

次へ

モータを動かす その2 ライブラリを使って精密な動きに