モータを動かす その2 ライブラリを使って精密な動きに
ステッピング・モータはフィードバックなしで位置決めができるので、産業用ではよく使われます。1パルスで回転する角度が決まっているので、負荷が重すぎたりして脱調しない限り、同じ位置になるように回転するということが簡単にそして再現性が高いです。
X-NUCLEO-IHM01A1 で使われているL6474 はMOSFETのHブリッジも内蔵しているので、外付け部品がなくて利用できるので、電子工作には最適です。前回は、単に回転するという動作を確認しました。コントローラのL6474 は、リセットがかかった時点を原点として22ビットのカウンタを利用できるので、パルス数をセットし、一致したら割り込みを掛けるという使い方もできます。
●ライブラリの導入
LCDのライブラリと同じ手順でL6474 のライブラリを導入します。
①GitHubからL6474 のライブラリをzipファイルでダウンロードする
② New Sketchをクリックしたあと、Librariesをクリックする
③Customタブを選択し、uploaded as a .Zip files をクリックする
④Import画面が出るのでImportボタンをクリックする。エクスプローラが開くので、ダウンロード・フォルダから、さきほどダウンロードしたL6474-master.zipを選択する。Libraries Successfully Importted:L6474 が表示される
⑤Save AsでL6474_motorと名前を付けて保存する
⑥ダウンロードしたL6474-master.zipをダブルクリックし、その中にあるL6474SketchFor1MotorShieldフォルダのL6474SketchFor1MotorShield.inoを開き、全選択して、コピーし、スケッチL6474_motorの中に貼り込む。
チェックのアイコンをクリックして、コンパイルでエラーが出ないことを確認する。
ライブラリは、最初に、加速、減速、最小および最大速度を初期化します。
- 指定された数のステップを指定された方向に移動する
- 特定の位置に行く
- 新しい命令の受信まで実行する
目標位置が十分に遠い場合、モータは台形移動を行います。回転の始めと終わりで速度をゆっくりとすることで、トルクがかかっているときの脱調を避けることができます。
- シールド加速パラメータを用いた加速フェーズ
- モータが最大速度で回転する定常位相
- シールド減速パラメータを用いて減速位相
- ターゲット位置で停止ターゲット位置が最大速度に到達できない場合、モーターは三角移動を実行する
- シールド加速パラメータを用いた加速フェーズ
- シールド減速パラメータを用いて減速位相
- 目標位置で停止する
モータの配線が終わったArduino UNOをつなぎ、「→」をクリックして書き込みます。デモンストレーションが始まります。ライブラリで用意しているほとんどの関数が実行されます。
●スケッチを作成
スケッチL6474_motorの内容を、動作確認に必要な最小限の命令を残して削除します。原点(Home)は、リセットがかかった場所です。初期設定の状態で、Position=1600は180°にあたります。スケッチは、Positionまで回転し、homeへ戻るを繰り返します。
#include <l6474.h>
#include <SPI.h>
L6474 myL6474;
int Position =1600;
void setup()
{
Serial.begin (9600);
int32_t pos;
uint16_t mySpeed;
myL6474.Begin(1);
myL6474.AttachFlagInterrupt(MyFlagInterruptHandler);
}
void loop()
{
Serial.println(" speed = "+String(myL6474.GetCurrentSpeed(0)) );
myL6474.GoTo(0,Position);
Serial.println("goto "+String(Position));
myL6474.WaitWhileActive(0);
Serial.println(" Position = "+String( myL6474.GetPosition(0)) );
delay(2000);
Serial.println("go home ");
myL6474.GoHome(0);
myL6474.WaitWhileActive(0);
Serial.println(" Position = "+String( myL6474.GetPosition(0) ));
delay(2000);
}
void MyFlagInterruptHandler(void)
{
Serial.println("Error ");
}
実行中です。