第十九項 ステッピングモーター制御とSPI通信

電子工作創作表現(2019/11/22)

スライドPDF

ステッピングモーター

  • 前回紹介したステッピングモーターの紹介
     
  • モータードライバを使った実例
前回はステッピングモーターとは何かという所まで話しましたが、今日は実際に動かすために必要な情報を説明していきます。ステッピングモーターは単体でArduinoと接続しただけでは制御できません。DCモーターと同様に大きな電流を必要としますので、モータードライバを使います。

ステッピングモーターの動作原理

  • A相とB相それぞれ2方向、4種類の信号パターン
     
  • 信号の切り替えが「1ステップ」となる
バイポーラステッピングモーターの場合、A相とB相の電流方向を交互に切り替えていって回転させます。電流方向が切り替えられれば良いので、DCモーターの時紹介したブリッジ回路が2ユニットあれば、原理的にはそれでステッピングモーターを動かす事が可能です。
参考:https://www.youtube.com/watch?v=jM09I8DGLZo

モータードライバ「L6470」

  • 表現用途に適したモータードライバ
     
  • 加減速やマイクロステップ機能がある
ステッピングモータードライバもやはり色々あるのですが、今回は作品用途に向いているであろう「L6470」モータードライバを紹介します。安くてシンプルなモータードライバの場合ArduinoのStepperというライブラリを使っても動かす事ができますが、単純な動作しかできないので自分は普段こちらのドライバを使っていますし、おススメです。役に立つ大きな機能として「マイクロステップ」と「加減速」というものがあります。

マイクロステップのメリット

  • フルステップの1.8度は意外と大きい
     
  • ステップ信号を連続的に変化させて、より細かな動作ができる
     
  • 静音性にもつながる
マイクロステップは、従来デジタル(HIGHかLOW)のステップ信号を連続的に変化させて、ステッピングモーター本来のステップ角(1.8度が一般的)よりも細かな制御をするというものです。フルステップで動作する1.8度という角度は意外と大きくて、動かすものが大きくなるほど目立ってきます。加えて音も激しくなるので、静かな環境を必要とするシーンではかなり気になってきます。マイクロステップはそういった懸念をクリアにしてくれるメリットがあります。

加減速のメリット

  • 自然な動きを作ることができる
     
  • 急発進では動かせないような物も動かせる
もう一つの加減速は、動き始めと動き終わりの速度にカーブを付ける機能です。アニメーションなどでも加減速は重要な要素で、加減速抜きで急加速・急減速をすると動かす対象に無理な力がかかりますし、ステッピングモーターの場合は脱調の要因となります。初速から最高速度で動かすのは余計なトルクが必要となるので、本来動かせる物も動かせなかったりということがあります。

入手方法

  • 秋月電子
     
  • ストロベリーリナックス
     
  • Sparkfun「Auto driver」
L6470というとIC単体の事を指しますが、これを使うためにはいくつか周辺部品が必要となり、それらをモジュール化された基板が販売されています。確認できているところだと秋月電子・ストロベリーリナックス・Sparkfunを扱っているスイッチサイエンスなどです。秋月が最も安く、ストロベリーリナックスはそれより少し高いですがとても小さく、42ミリ角のステッピングモーターの後ろに取り付けられるような仕様になっています。

サンプル

l670

  • ストロベリーリナックス製モジュール
     
  • モーター駆動電圧は8V~45Vまで対応
今回はストロベリーリナックス製のモジュールをサンプル基板として用意しました。
良く使われるステッピングモーターの電圧として9~24Vが多いので、これ一個あれば大概のステッピングモーターは動かすことができます。

制御方法

  • 「SPI通信」という方式でArduinoから制御
     
  • コマンド情報を送信する
制御方法ですが、SPI通信という通信方式を使います。これもArduinoやラズパイのようなマイコンの多くが搭載している通信方式で、決められたコマンドを送信してデバイスを操作するためのものです。

ボード間通信

  • 基板上のIC同士や、基板対基板など近距離での通信方式
     
  • USBのような数十㎝~数m単位での通信距離には適さない
     
  • SPI / I2C / UARTなど
以前6軸センサーを扱った時に説明したのがI2Cという通信方式ですが、SPI通信もそれに近い方式で、基板やIC間での通信によく用いられます。構造がシンプルゆえに、あまり長距離や大容量のデータ伝送には向いていません。
SPIとI2Cが使えれば、大抵のモジュール基板は扱えるようになります。

一般的なSPIの結線

spi_circuit

SPI通信はマスターとスレーブという主従関係に基づいて通信が行われます。プログラムを書くArduinoがマスターとなることが殆どですが、Arduinoがスレーブになって受信することも可能です。結線には電源ラインのVCC・GNDの他に3本または4本の線が必要になります。送信・受信とも同じ名前なのが送信の合図を出すSS/CSピン・信号のタイミングを知らせるSCKピンです。

もう2本、データを送信するSDOとデータを受信するSDIというピンがありますが、これは自分(Arduino)の送信は相手の受信につながなくてはいけないので、SDIとSDO・またSDOとSDI同士をつなげる必要があります。どちらにとってのIN/OUTか分かりにくい場合はMISO(Master In Salve Out)やその逆MOSIと言う表記がされている場合もあります。指示を送るなどMasterからの送信のみできれば良い場合は、MISOを繋ぐ必要はないので3本線になります。

ボード上の結線

board_line

L6470モジュールにもこのSPI端子が出ているので、説明書の掲載部分(https://strawberry-linux.com/pub/l6470-manual.pdf)に従って接続します。SPI通信に必要なものはここの3番~8番までの6本で通信できるようになっています。

電圧選択の注意

voltage

ちなみに、秋月とストロベリーリナックスのモジュールはジャンパーピンというピンでICを動作させる電圧を選択します。(モーターを動かす電圧ではなく、L6470本体を動作させる電圧。ロジック電圧とも)
Arduinoから供給する5Vを使うので5Vを今回選択していますが、例えばラズパイのロジック電圧は3.3vになっているので、3.3Vを選ぶ必要があります。ここを間違えて3.3Vモードの時にうっかり5Vを流したりすると結構簡単に死んでしまうので注意してください。

SPI通信のプロトコル

  • 通信する上での仕様を「プロトコル」と呼ぶ
     
  • どんなコマンドを送れば良いかはL6470データシートに記載
結線をして、モーター用の電源を供給すれば、これでArduinoから必要なコマンドを送れば制御できます。どんな信号を送るかというのはデータシートに記載されていますが、便利な分かなり色々なパラメータがあり実装は大変です

L6470用のライブラリ

https://github.com/loveandsheep/l6470duino
 
他にも自分用のライブラリを作っている人が多数

なので今回は、簡単に制御できるよう情報をまとめて実装しておいたライブラリを使用します。
こちらもArduinoのメニューからインストールできるようになっているので、インストールしてみてください。
日本だと「北の国から電子工作」(http://spinelify.blog.fc2.com/blog-entry-41.html)というWebサイトでサンプルを配布されていたりもします。自分が使いやすいと思ったライブラリを見つけて使うというのもテクニックの一つです。

動かす

  • 初期値を設定してから動作させる
     
  • Driver.Run()で速度を指定して動作
以下、動かすためのサンプルです。driverクラスを作り、initで初期化します。初期化した後に、駆動時に使う電圧の設定などを行い、最後にRunというコマンドで回転を指示しています。デフォルトでマイクロステップと加減速が働いているので、とてもスムーズに動作します。
#include "l6470duino.h"

l6470duino::driver Driver;

void setup() {
  // put your setup code here, to run once:
  Driver.init(1);
  Driver.voltage_acc (0xDF);
  Driver.voltage_dec (0xDF);
  Driver.voltage_run (0xDF);
  Driver.voltage_hold(0x30);

}

//動いては止まってを繰り返す
void loop() {
  Driver.Run(20000, false);
  delay(2000);
  Driver.SoftStop();
  delay(2000);
}

フルステップを再現

  • 加減速を高めに設定する
     
  • マイクロステップを切る
マイクロステップと加減速がこのドライバの売りと言いましたが、ここであえてその機能をオフにしてみます。
stepmodeは2のn乗で指定するようになっているので、最大が2の7乗、128分の1ステップになっています。
机に置いて動作させると、その違いがかなり顕著です。機械にとって振動というのは、はんだのクラックやネジのゆるみなど、ただうるさいだけでない色々なトラブルの元にもなります。
#include "l6470duino.h"

l6470duino::driver Driver;

void setup() {
  // put your setup code here, to run once:
  Driver.init(1);
  Driver.voltage_acc (0xDF);
  Driver.voltage_dec (0xDF);
  Driver.voltage_run (0xDF);
  Driver.voltage_hold(0x30);

//フルステップ動作
  Driver.setAcc(300);
  Driver.setDec(300);
  Driver.setStepMode(0);

}

void loop() {
  Driver.Run(20000, false);
  delay(2000);
  Driver.SoftStop();
  delay(2000);
}

指定の位置に送る

  • 指定の位置へ送るのはGoto
     
  • マイクロステップ分を加味する
Runは指定の速度でずっと動き続けるコマンドですが、Gotoコマンドを使うとPWMサーボのように特定の座標まで移動させることができます。角度ではなくステップ数で指示する必要があり、マイクロステップが有効な場合はその分倍にしてあげる必要があります。例えば1/128マイクロステップの時に1週=200ステップ進みたい場合は、200*128=25600ステップ進める必要があります。
#include "l6470duino.h"

l6470duino::driver Driver;

void setup() {
  // put your setup code here, to run once:
  Driver.init(1);
  Driver.voltage_acc (0xDF);
  Driver.voltage_dec (0xDF);
  Driver.voltage_run (0xDF);
  Driver.voltage_hold(0x30);

  Driver.setMaxSpeed(10); //Goto移動時の最高速度は前もって設定
}

void loop() {
  Driver.Goto(200 * 128); //200ステップxマイクロステップ分
  delay(2000);
  Driver.Goto(0); //元の位置へ
  delay(2000);
}