Arduinoの基礎 - ステッピングモータ
概要
ここでは、2相4ワイヤの小さなステッピングモータとを、Arduinoから制御する方法について記載する。
一般的なモータは連続回転するのを期待する時に使用するが、ステッピングモータは特定の角度だけ回って止まるような動作をしたい場合に使用する。
制御単位となるのはステップで、それぞれのステッピングモータ毎に1ステップでどのくらいの角度で回転するか決まっている。
L293D : ステッピングモータ(バイポーラ)
ここで使用する小さなステッピングモータは、1ステップで18[度]回転するモータで、20ステップで1回転する。
また、使用するステッピングモータの種類は、バイポーラステッピングモータといい、内部にコイルが2つあり、その極性を切り替えることでモータの回転角を操作する。
ステッピングモータドライバIC(トランスレータ)として、L293Dを使用する。
L293DはデュアルHブリッジICであり、以下のように接続する。
1 in、2 in、3 in、4 inと記載した箇所は、Arduinoに接続する。
また、L293Dはインターナルのフライバックダイオードを内蔵している。
他のステッピングモータドライバICを使用する場合(SN754410等)は、フライバックダイオードを付ける必要がある。
ブレッドボードに接続した様子は次の通り。
ここで使用するステッピングモータは、下図のようなペア(1 inと2 inまたは3 inと4 in)とする。
Arduinoのサンプルコードを以下に記述する。
ArduinoのStepper
ライブラリが使用できる。
Stepper
クラスのsetSpeed
メソッドでモータの回転速度をRPMで指定する。
RPMは1分間に回転する回転数である。例えば、60[rpm]なら1分間に60回転、すなわち、1秒で1回転する。
サンプルコードでは、180[rpm]を指定している。
step
メソッドでは、現在の位置から回転するステップ数を指定する。負の値を指定すると逆回転になる。
なお、step
メソッドは同期関数で、操作が終了するまでブロックする。したがって、モータが回転している際は他の動作が止まる。(割り込み制御は可能)
#include <Stepper.h>
const int stepsPerRevolution = 20;
Stepper stepper(stepsPerRevolution, 8, 9, 10, 11);
void setup()
{
stepper.setSpeed(180);
}
void loop()
{
stepper.step(10);
delay(1000);
stepper.step(-10);
delay(1000);
}
ステッピングモータ(ユニポーラ)の使用
このセクションでは、ユニポーラ型のステッピングモータである28BYJ-48を使用する。
ここでは、ステッピングモータドライバICとしてULN2003搭載ドライバボードを使用している。
このドライバボードの詳細が確認できなかったので少し曖昧な点がある。
そのため、実験的なスタンスで見ること。
ステッピングモータ28BYJ-48のデータシートは下図の通りである。
モータの出力軸は5[mm]径である。
また、配線図は下図の通りである。
ここでは、ULN2003搭載ドライバボードの電源電圧に9[V]電池を使用しているが、5[V]の方がよい可能性がある)
Arudinoのサンプルコードを以下に記述する。
ArduinoのStepper
ライブラリが使用できる。
ここでは、電動スライダとしては使用している。28BYJ-48は、内部で1/64のギア比があるため、小さいながらもトルクがあって使いやすい。
#include <Stepper.h>
const int number_of_steps = 32;
const int steps_output_rev = 32 * 64; // 2048
const int CW = 1;
const int CCW = -1;
Stepper stepper(number_of_steps, 8, 10, 9, 11);
void setup()
{
stepper.setSpeed(300);
}
void loop()
{
int steps;
steps = get_step_by_rev(CW, 1);
stepper.step(steps);
delay(3000);
steps = get_step_by_rev(CCW, 1);
stepper.step(steps);
delay(3000);
}
int get_step_by_rev(int dir, float rev)
{
return dir * (steps_output_rev * rev);
}