Arduinoを使ってステッピングモータを回してみたい方へ
とりあえずステッピングモータを回すことを目標にモータドライバの回路とプログラムを書きました。
工夫次第では他にも流用できると思います。
活用していただけると幸いです。
- ステッピングモータの特徴
- 使用部品
- ステッピングモーターの回し方
- モータドライバの回路図
- プログラム
ステッピングモータの特徴
一定の角度で回転
時計の秒針のように、一定の角度ずつ回転するモータです。構造によって,2相,3相,等があり、数字が大きくなると1信号で動く角度(基準ステップ角)が小さくなります。基準ステップ角が小さいほど,滑らかで精度の高い動きができます。
小型で高トルクを発生
小型で高トルクを発生します。そのため、加速性・応答性に優れ、頻繁な起動・停止する動きに強い力を発揮できます。
停止位置を自己保持
電気を流し続けることで、停止しているときにも保持力を発生させられます。機械的なブレーキがなくても停止位置を保つことができます。
使用部品
ステッピングモータ
2相でバイポーラタイプのステッピングモータを回してみたいと思います。
- 定格電圧:DC5V
- 定格電流:1.5A
- 基準ステップ角:1.8度
2相のステッピングモータには他にユニポーラタイプのものもあります。バイポーラタイプはモータドライバ回路が少し複雑になりますが、電気的な効率やトルクの強さなどが、ユニポーラタイプより優れているようです。
トランジスタ 2SC3422
家に余っていたトランジスタになります。モータドライバとなる回路に使用します。
- コレクタ· エミッタ間電圧:40V
- エミッタ· ベース間電圧:5V
- コレクタ電流:3A
- ベース電流:1A
抵抗器
- 330Ω(8個):Arduinoの出力電流を抑え、故障を防ぐための抵抗に使用
- 10KΩ(4個):プルダウン抵抗に使用
Arduino UNO
プログラミングでステッピングモータの回転方向や回転速さをコントロールする信号を出力します。
ステッピングモーターの回し方
今回使用するステッピングモータにはピンが6本あります。
2ピンと5ピンはNCピン(No Connect ピン)になり、1(A),3(C),4(B),6(D)ピンはモータの中のコイルに接続されています。
モータの中には
- 磁石のついた回転軸
- A&Cピンに接続されたコイル
- B&Dピンに接続されたコイル
が下の画像のように配置されています。
コイルに電流を流すと電磁石となり磁力が発生します。この磁力により回転軸についている磁石を引き寄せたり、遠ざけたりする力が発生します。
電気を流すコイルを切り替えたり、電流の向きで電磁石の極性を変えることにより磁石のついた回転軸を回します。
ちなみに、このコイルを切り替え方、及び極性の替え方により4種類の駆動モードがあります。
各コイルへの電気のON-OFFや電流の向きのコントロールのためにモータドライバが必要になります。
ウェーブモード
1ステップするのに1つのコイルのみに電気を流す一番単純な駆動
フルステップモード
1ステップするのに2つのコイルに電気を流すことにより、強い磁場が生成されるため、モータがより高いトルクで回転する。
ハーフステップモード
ウェーブモードとフルステップモードを組み合わせたモード。1ステップで動く角度を少なくできるが、モータのトルクが一定ではない。
(1つのコイルのみに通電されているときはトルクが弱まる)
マイクロステッピング
ハーフステップモードの強化版で、コイルへの電流量により磁場を調整し、1ステップで動く角度をさらに小さくする。
モータドライバの回路図
ブラシ付きDCモータのモータドライバに使うようなHブリッジ回路を2つ組み合わせて、それぞれのHブリッジ回路に電磁石となる各コイルを繋げた回路になります。
Arduinoからの信号により所定のトランジスタがONし、任意に電流を流すコイルや電流の向きをコントロールできます。
上記回路図を使ってステッピングモータをウェーブモードで反時計回りに動かす際の各ステップごとの電流の流れを下に記載します。
プログラム
最後に、Arduinoに書き込むサンプルプログラムを記載します。参考にしてください。
プログラム(ウェーブモード)反時計回り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
int Time = 2; //回転速度 int A = 2; int C = 3; int B = 4; int D = 5; void setup() { pinMode(A,OUTPUT); pinMode(B,OUTPUT); pinMode(C,OUTPUT); pinMode(D,OUTPUT); } void loop() { digitalWrite(A,HIGH); digitalWrite(D,LOW); delay(Time); digitalWrite(B,HIGH); digitalWrite(A,LOW); delay(Time); digitalWrite(C,HIGH); digitalWrite(B,LOW); delay(Time); digitalWrite(D,HIGH); digitalWrite(C,LOW); delay(Time); } |
プログラム(ウェーブモード)時計回り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
int Time = 2; //回転速度 int A = 2; int C = 3; int B = 4; int D = 5; void setup() { pinMode(A,OUTPUT); pinMode(B,OUTPUT); pinMode(C,OUTPUT); pinMode(D,OUTPUT); } void loop() { digitalWrite(A,HIGH); digitalWrite(B,LOW); delay(Time); digitalWrite(D,HIGH); digitalWrite(A,LOW); delay(Time); digitalWrite(C,HIGH); digitalWrite(D,LOW); delay(Time); digitalWrite(B,HIGH); digitalWrite(C,LOW); delay(Time); } |
プログラム(フルステップモード)反時計回り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
int Time = 2; //回転速度 int A = 2; int C = 3; int B = 4; int D = 5; void setup() { pinMode(A,OUTPUT); pinMode(B,OUTPUT); pinMode(C,OUTPUT); pinMode(D,OUTPUT); } void loop() { digitalWrite(A,HIGH); digitalWrite(C,LOW); delay(Time); digitalWrite(B,HIGH); digitalWrite(D,LOW); delay(Time); digitalWrite(C,HIGH); digitalWrite(A,LOW); delay(Time); digitalWrite(D,HIGH); digitalWrite(B,LOW); delay(Time); } |
プログラム(フルステップモード)時計回り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
int Time = 2; //回転速度 int A = 2; int C = 3; int B = 4; int D = 5; void setup() { pinMode(A,OUTPUT); pinMode(B,OUTPUT); pinMode(C,OUTPUT); pinMode(D,OUTPUT); } void loop() { digitalWrite(A,HIGH); digitalWrite(C,LOW); delay(Time); digitalWrite(D,HIGH); digitalWrite(B,LOW); delay(Time); digitalWrite(C,HIGH); digitalWrite(A,LOW); delay(Time); digitalWrite(B,HIGH); digitalWrite(D,LOW); delay(Time); } |