Make Local Happiness

自分の幸せは自分で作る!!!

Arduinoでステッピングモータの制御

Arduino Advent Calendar 2017の3日目の記事です。

よくArduinoや電子工作の記事でみるのはサーボモーターですが、 今回はステッピングモーターを使っていきます。

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

Wikipediaを参照すると、以下のような記述がでてきます。

パルス電力に同期して動作する同期電動機である。したがってパルスモーター(Pulse motor)とも言われる。簡単な回路構成で、正確な位置決め制御を実現できるので、装置の位置決めを行なう場合などによく使われる。略称ステッパ。

低回転でトルク(回転の力)をしっかりかけたい時にステッピングモーターサーボモータよりも向いています。サーボモーターは中回転から高速の回転の際にトルクがが一定になるようです。

必要機材・準備

※ モータドライバは不良品の場合や、はんだ付け等で壊れやすいため、2台ほど購入して置くことをオススメします。私は電源周りの問題が多く5台ほど検証で破壊しました。

配線

接続例がモータドライバの取扱説明書に記載があるので、それに合わせて配線していきます。 ※ 今回使用する秋月さんのモータドライバとストロベリー・リナックスさんの商品で配線は若干ことなるため、気をつけてください。

配線例

f:id:iwate_takayu:20171203195253p:plain

Arduinoとの配線例

f:id:iwate_takayu:20171203195526p:plain

プログラム

基本的な流れとしては以下の3つのステップになります。 今回作成したコードはgithubにアップしました。

  • ① ピンの定義をする
  • ② setupでモータードライバの初期設定を行う ※この設定を省くとモータの挙動がおかしくなります。この設定パラメータはモータドライバに準ずるところがあるため、最初は何を送っているかわからないかもしれないでのすが、取扱説明書をよく見てみましょう。
  • ③ モータを制御するためのコマンドを送信する

① ピンの定義をする

以下の設定ですが、 実はArduino側で元々決められているため、定義しなくても利用することができます。 ただ、わかりにくくなるため、設定しましょう。 UNOとMEGAでこのピンアサインは異なります。

UNO

#define PIN_SPI_MOSI 11
#define PIN_SPI_MISO 12
#define PIN_SPI_SCK 13
#define PIN_SPI_SS 10
#define PIN_BUSY 9

MEGA

#define PIN_SPI_MOSI 51
#define PIN_SPI_MISO 50
#define PIN_SPI_SCK 52
#define PIN_SPI_SS 53
#define PIN_BUSY 49

setupでモータドライバの初期設定を行う

SPIでモータドライバに信号を送信するため、SPIのモジュールを読み込みます。 その後、加速係数やら何やら設定していきます。

#include <SPI.h>  // SPI通信をするための読み込み

void setup()
{
  delay(1000);
  Serial.begin(9600);

  // ステッピングモーター用のピンの準備
  pinMode(PIN_SPI_MOSI, OUTPUT);
  pinMode(PIN_SPI_MISO, INPUT);
  pinMode(PIN_SPI_SCK, OUTPUT);
  pinMode(PIN_SPI_SS, OUTPUT);
  digitalWrite(PIN_SPI_SS, HIGH);
  pinMode(PIN_BUSY, INPUT);

  // SPI通信の開始宣言
  SPI.begin();
  SPI.setDataMode(SPI_MODE3);//SCKの立上りでテータを送受信、アイドル時はpinをHIGHに設定
  SPI.setBitOrder(MSBFIRST);//MSBから送信

  // L6470の利用設定
  L6470_setup();
}

//**********************************************
// SPI通信するための関数
//**********************************************
void L6470_send(unsigned char value){
  while(!digitalRead(PIN_BUSY)){} //BESYが解除されるまで待機

  digitalWrite(PIN_SPI_SS, LOW);
  SPI.transfer(0);  //制御信号をSPI通信で送る
  SPI.transfer(value);  //制御信号をSPI通信で送る
  digitalWrite(PIN_SPI_SS, HIGH);
}

//**********************************************
// L6470のセットアップ
//**********************************************
void L6470_setup(){
  //デバイス設定
  L6470_send(0x00);
  L6470_send(0x00);
  L6470_send(0x00);
  L6470_send(0x00);
  L6470_send(0xc0);

  //加速係数設定
  L6470_send(0x05);
  L6470_send(0x00);
  L6470_send(0x41);
  //減速係数設定
  L6470_send(0x06); //レジスタアドレス
  L6470_send(0x00);
  L6470_send(0x41); //値(10bit),デフォルト0x41
  //最大回転スピード設定
  L6470_send(0x07); //レジスタアドレス
  L6470_send(0x00);
  L6470_send(0x41);//値(10bit),デフォルト0x41
  //最低回転スピード設定
  L6470_send(0x08);//レジスタアドレス
  L6470_send(0x00);
  L6470_send(0x01);//値(10bit),デフォルト0x41
  //モータ停止中の電圧設定
  L6470_send(0x09);//レジスタアドレス
  L6470_send(0x20);//値(8bit),デフォルト0x29
  //フルステップ駆動
  L6470_send(0x15);
  L6470_send(0x00);
  L6470_send(0x3ff);//値(10bit),デフォルト0x41

  //モータ定速回転時の電圧設定
  L6470_send(0x0A);//レジスタアドレス
  L6470_send(0x20);//値(8bit),デフォルト0x29
  //加速中の電圧設定
  L6470_send(0x0B);//レジスタアドレス
  L6470_send(0x20);//値(8bit),デフォルト0x29
  //減速中の電圧設定
  L6470_send(0x0C);//レジスタアドレス
  L6470_send(0x20);//値(8bit),デフォルト0x29
  //フルステップ,ハーフステップ,1/4,1/8,…,1/128ステップの設定
  L6470_send(0x16);//レジスタアドレス
  L6470_send(0x03);//値(8bit)
}

③ モータを制御するためのコマンドを送信する

今回は1回転づつ回り続けるプログラムを書いてみます。

//**********************************************
// メイン処理 - loop()
//**********************************************
void loop(){
  //360度 - 1回転させる処理
  L6470_send(0x51);//Run(DIR,SPD),0x51:正転,0x50:逆転
  L6470_send(0x00);
  L6470_send(0x20);//回転スピードの設定
  L6470_send(0x00);

  delay(1604);//1604msで約1回転
  L6470_send(0xB8);
}

まとめ

サーボモーターだと専用の関数があるので、 わかりやすいのですが、ステッピングモーターはまずはどうやって動かすんだ? ところからスタートしたので先人の知恵にかなり助けられました。

今回は秒で制御していますが、本来であればステップ数で動かすこともできます。 最初のステッピングモーターを動かすサンプルとお考えください。

一番わかりづらいところは、配線かと思います。 私もですが、ソフトウェアの方はあまり回路や配線なんかは苦手な方が多いかと思います。 そのため、他のブログを見て、間違った配線で動かないなんてことがありました。 取扱説明書をよく見ればわかることだったので、 あらためてちゃんと読もうと思いました。

あと、モータドライバーは本当に壊れやすいです。 電圧を間違えなければ大丈夫と思いますが、DCコンバータなどがうまく動かず壊れるなんてこともあるので、 お気をつけください。

参考

L6470をArduinoで簡単に動かすスケッチ - 北の国から電子工作(仮)

ステッピングモーターの基本(前編)〜Arduinoでパーツやセンサーを使ってみよう | Device Plus - デバプラ

「ステッピングモーター」と「ACサーボモーター」の使い分けについて教えてください。|おしえて!照代さん |オリエンタルモーター株式会社

機械設計者用サーボモーターとステッピングモーターの違いと使い分け