工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduino でステッピング モーターをマスターする:総合ガイド

このチュートリアルでは、Arduino を使用したステッピング モーターの制御について知っておくべきことをすべて学びます。 A4988、DRV8825、TMC2208 ステッピング ドライバーと組み合わせて NEMA17 ステッピング モーターを制御する方法について説明します。

ステッピング モーターとドライバーのこの組み合わせは、3D プリンター、CNC 機械、ロボット工学、自動化機械など、位置制御が必要な無数のアプリケーションで使用されています。

私自身、次のような多くの Arduino プロジェクトですでにこれを使用しています。

それらがどのように機能するか、ステッピングモーターをArduinoに接続する方法、ドライバーの電流制限を設定する方法、Arduinoライブラリの有無にかかわらずドライバーをプログラムする方法について詳しく説明します。また、あらゆる種類の Arduino プロジェクトで Arduino CNC シールドを使用して複数のステッピング モーターを簡単に制御する方法も説明します。 

したがって、このチュートリアルではかなり多くのことを取り上げます。次のビデオを視聴するか、すべてのサンプル コードと配線図も含まれている以下のチュートリアルを読むことができます。

ステッピング モーターとは何ですか?またその仕組み

このチュートリアルの他の内容をよりよく理解するのに役立つように、ステッピング モーターとは何か、そしてそれがどのように機能するかを簡単に説明することから始めます。 

ステッピング モーターは、フィードバックがなくても位置を正確に制御できるユニークなタイプのブラシレス DC モーターです。

ステッピング モーターの動作原理は磁場に基づいています。これには、ステーターとローターという 2 つの主要コンポーネントがあります。ローターは通常永久磁石で、ステーター上のいくつかのコイルに囲まれています。

コイルに電流を流すか、コイルに電流を流すと、ステーター内に特定の磁場が発生し、ローターを引き付けるか反発します。特定の順序でコイルを 1 つずつ段階的にアクティブにすることで、ローターの継続的な動きを実現できるだけでなく、任意の位置で停止させることもできます。

したがって、これらのモーターはステッピング モーターと呼ばれ、個別のステップで動きます。 

ローターの磁極の数を増やすことで、可能な停止位置の数を増やすことができ、モーターの分解能や精度が向上します。これは単なる基本的な説明であり、詳細については、ステッピング モーターの仕組みチュートリアルを参照してください。 

たとえば NEMA17 などの一般的なステッピング モーターには、ローター上に 50 の停止ポイントまたはステップがあります。一方、ステーターには、4 つの異なる磁場の向きまたは位置を提供する 2 相で構成された複数のコイルを含めることができます。

したがって、ローターの 50 ステップと 4 つの異なる磁界方向を掛け合わせると、完全な回転を完了するには合計 200 ステップになります。または、360 度を 200 ステップで割ると、1 ステップあたり 1.8 度の解像度になります。

ステーター コイルが 2 相で構成されていると述べましたが、ステッピング モーターのワイヤの数を見るとそれにも気づくことができます。各相に 2 つずつ、4 本の 4 線があります。相に両方向に電流を流すことができるため、4 つの異なる磁界方向が可能です。

5 線、6 線、さらには 8 線のステッピング モーターもありますが、それでも 2 相で動作するか、4 つの端子だけで制御します。

これらのワイヤの重要な点は、4 つの制御端子でこれらのワイヤをどのように接続するかに応じて、トルクや速度の向上など、さまざまなパフォーマンス特性を提供できることです。

それでも、この簡単な説明で、ステッピング モーターを駆動するには、電源を接続するだけでは何も起こらないことが理解できました。代わりに、2 つのモーター相を両方向に通電し、タイムリーなシーケンスで特定の順序でパルスをアクティブにするか送信する必要があります。そのため、ステッピング モーターを制御するドライバーが必要です。 

ステッピング モーターのさまざまな種類とサイズに対応して、ドライバーの種類とサイズもさまざまです。ただし、それらすべての基本的な動作原理は、モーターの相を両方向に通電できる 2 つの H ブリッジを備えていることです。

もちろん、マイクロ ステッピングや電流制限など、ステッピング モーターの本来の目的であるステッピング モーターを簡単に制御できるようにする機能が他にもたくさんあります。

Arduino と A4988 ステッピング ドライバーを使用して NEMA17 ステッピング モーターを制御する方法

さて、このチュートリアルの最初の例、A4988 ステッピング ドライバーを使用して NEMA 17 ステッピング モーターを制御する方法を見てみましょう。 

さて、このチュートリアルの最初の例である、A4988 ステッピング ドライブで NEMA 17 ステッピング モーターを制御する方法を見てみましょう。

NEMA17 は、優れた性能を提供し、同時に手頃な価格であるため、メーカー間で最も人気のあるステッピング モーターです。ほぼすべてのデスクトップ 3D プリンタやレーザー彫刻機にも搭載されています。 

一般に、NEMA17 ステッピング モーターは 200 ステップ、つまりステップごとの分解能が 1.8 度ですが、400 ステップでステップごとの分解能が 0.9 度のモデルもあります。ここで、NEMA17 という名称は、実際には前面プレートのサイズという観点からモーターのサイズを表しているだけであることに注意してください。

この数字は、フェイスプレートのサイズを 10 で割ったときのインチ単位を表します。この場合、17 を 10 で割った値は 1.7 インチのフェイスプレート、NEMA23 の場合は 2.3 インチのフェイスプレートに相当します。

したがって、フェイスプレートのサイズは固定されていますが、NEMA17 ステッパーの長さは 20mm から 60mm まで変化する可能性があり、それに応じてモーターの電力要件も変化します。電力要件は通常、モーターが消費できる電流の大きさによって定義され、これらの NEMA17 ステッピング モーターの範囲は 0.3A ~ 2.5A です。

ここで、ステッピング モーターの電流定格に従って、その電流量を処理できる適切なドライバーを選択する必要があります。 NEMA17 ステッピング モーターを制御する最も一般的なドライバーは、A4988 ステッピング モーター ドライバーです。

A4988 の最大電流定格はコイルあたり 2A ですが、これは実際にはピーク定格です。電流を約 1A に保つことが推奨されますが、もちろん、IC に適切な冷却を提供するために最大 2A まで上げることも可能です。 

A4988 ステッピング ドライバーが備えている優れた機能 (実際には他のすべてのドライブも備えている) は、電流制限です。これにより、モーターの定格に関係なく、モーターが消費する電流を簡単に設定できます。たとえば、定格 2.5A のステッピング モーターでも接続できますが、ドライバーの電流は 1.5A に制限されます。したがって、モーターは最大能力では動作しませんが、それでも使用することはできます。

一方、モーターの定格がドライバーに設定された電流制限よりも低い場合、モーターは過熱します。もちろん、モーターの定格電流とドライバーの定格電流を一致させることを常にお勧めします。

A4988 と Arduino の接続

さて、それでは、A4988 ドライバーをステッピング モーターおよび Arduino コントローラーに接続する方法を見てみましょう。

この Arduino チュートリアルに必要なコンポーネントは、以下のリンクから入手できます。

開示:これらはアフィリエイト リンクです。 Amazon アソシエイトとして、 私は対象商品を購入することで収入を得ています

ドライバーの右上隅には VMOT ピンと GND ピンがあり、ここに 8 ~ 36V の範囲でモーターの電源を接続します。ここでは、ボードを電圧スパイクから保護するために、これら 2 つのピン間にデカップリング コンデンサを使用することも推奨されます。少なくとも 47uF の容量を持つ大きな電解コンデンサを使用する必要があります。 

次に、ステッピング モーターを接続する 4 つのピンです。モーターの 1 つの相は 1A および 1B ピンに接続され、もう 1 つの相は 2A および 2B ピンに接続されます。 

場合によっては、モーターのどの 2 本のワイヤが 1 つの位相を形成しているかを認識するのが少し難しい場合がありますが、それらを識別する方法はいくつかあります。最も簡単な方法は、ステッピング モーターのシャフトを手で回転させ、2 本のワイヤーを相互に接続することです。 2 本のワイヤーを接続して位相を作ると、シャフトの回転が少し難しくなります。

もう 1 つの方法は、マルチメーターを使用して 2 本のワイヤ間の導通をチェックすることです。 2 本のワイヤを接続して同相を形成すると、短絡が発生し、マルチメータからビープ音が鳴り始めます。

フェーズを見つけたら、それをドライバーの 2 つの位置の任意の位置に接続できます。順序は関係ありません。 

次に、IC またはロジックの電源ピン、VDD と GND があり、3V ~ 5V になります。反対側には、Arduino ボードの任意のピンに接続できる Step ピンと Direction ピンがあります。 Direction ピンでモーターの回転方向を選択し、Step ピンでモーターのステップを制御します。 Step ピンにパルスを送信するたびに、モーターは選択した方向に 1 ステップ進みます。 

これらのピンのすぐ上には、スリープ ピンとリセット ピンがあり、その名前が示すように、ドライバをスリープ モードにするかリセットするために使用されます。これらのピンは両方ともアクティブ ローであることに注意してください。スリープ ピンはデフォルトで HIGH 状態ですが、RST ピンはフローティングです。つまり、ドライバーを有効にする最も簡単な方法は、これらの 2 つのピンを相互に接続することです (これらのピンの機能を使用しないと仮定します)。 

Enable ピンもアクティブ Low なので、HIGH にしない限り、ドライバは有効になります。 

次の 3 つのピン、MS1、MS2、および MS3 は、モーターのステップ分解能を選択するためのものです。ステップ分解能はモーターの構造に依存し、NEMA 17 ステッピング モーターでは通常 1 回転あたり 200 ステップであるとすでに述べました。ただし、すべてのステッピング ドライバーには、より高い解像度でモーターを駆動できるマイクロステッピングと呼ばれる機能が備わっています。これは、中間の電流レベルでコイルに通電することで実現され、中間のステップ位置が生成されます。

たとえば、1/4 ステップ分解能を選択した場合、モーターの 200 ステップは、200 掛ける 4 で 1 回転あたり 800 マイクロステップになります。これを実現するために、ドライバーはコイルに 4 つの異なる電流レベルを使用します。 

A4988 ドライバーの最大分解能は 16 マイクロステップで、NEMA17 モーターは 200 ステップ、つまり NEMA17 モーターは 1 回転あたり 3200 ステップ、つまり 1 ステップあたり 0.1125 度になります。これは本当に驚くべき精度であり、そのためこの種のステッピング モーターとドライバーが非常に多くのアプリケーションで使用されています。実際、最大 256 マイクロステップのステッパー ドライバーがあります。これは、1 回転あたり 51200 ステップ、つまり 1 ステップあたり 0.007 度という途方もないことになります。

それにも関わらず、これら 3 つのピンにはプルダウン抵抗が付いているため、これらを切断したままにすると、ドライバーはフルステップ モードで動作します。別のマイクロステップ分解能を選択するには、この表に従って 5V を適切なピンに接続する必要があります。 

A4988 電流制限

さて、ステッピング モーターとドライバーを Arduino ボードに接続する方法がわかったので、ステッパーを制御するために Arduino をプログラムまたはコーディングする方法の説明に進むことができます。ただし、それを行う前、またはモーターに電力を供給する前に、行う必要がある非常に重要なことがもう 1 つあります。それは、ドライバーの電流制限を調整することです。

すでに説明したように、ドライバーの電流制限をモーターの定格電流よりも低く調整する必要があります。そうしないと、モーターが過熱してしまいます。

A4988 ドライバには小さなトリマ ポテンショメータがあり、電流制限を調整できます。ポテンショメータを時計回りに回転させると電流制限が上がり、逆も同様です。電流制限の実際の値を決定するために使用できる方法は 2 つあります。 

最初の方法では、ポテンショメータ自体と GND 間の基準電圧を測定します。マルチメーターを使用して基準電圧を測定し、その値を次の式で使用してドライバーの電流制限を計算できます。

電流制限 =Vref / (8 x Rcs)

Rcs は電流検出抵抗、またはチップのすぐ隣にある電流検出抵抗の値です。メーカーによって異なりますが、これらの値は通常 0.05、0.1、または 0.2 オームです。したがって、この方法で電流制限を正確に計算するには、これらの抵抗の値を詳しく調べる必要があります。私の場合、これらの抵抗には R100 というラベルが付いており、これは 0.1 オームを意味します。

たとえば、0.7V の基準電圧を測定し、0.1 オームの抵抗を使用する場合、電流制限は 0.875A になります。あるいは、電流をたとえば 1A に制限したい場合は、基準電圧を 0.8V に調整する必要があります。 

電流制限を設定する 2 番目の方法は、コイルを流れる電流を直接測定することです。そのためには、前に説明したようにステッピング モーターとドライバーを接続する必要があります。コントローラーの接続をスキップすることもできますが、代わりに 5V を方向ピンとステップ ピンに接続して、モーターがアクティブなままで 1 つの位置を保持できるようにします。ドライバがフルステップ モードで動作するように、MS ピンは切断されたままにしておく必要があります。次に、モーターから 1 本の線またはコイルを切り離し、電流計と直列に接続します。このようにして、ロジック電圧 5V と、私の場合はモーター用の電力 12V の両方でドライバーに電力を供給すると、コイルに流れる電流の量を読み取ることができます。

ただし、ドライバーがフルステップ モードで動作する場合、コイル内の電流は実際の電流制限の 70% にしか達しないことに注意する必要があります。したがって、他のマイクロステッピング モードでドライバを使用する場合、ドライバの電流制限の実際の値を取得するには、電流計の読み取り値を 1.3 倍する必要があります。 

ドライバーの電流制限を設定するために両方の方法を試しましたが、ほぼ同じ結果が得られました。

ステッピング モーターと Arduino – サンプル コード

それにもかかわらず、ここで Arduino のプログラミングに進むことも、Arduino ボードでステッピング モーターを制御するためのコード例をいくつか見てみることもできます。

ライブラリを使用せずにステッピング モーターを制御する方法の非常に基本的なサンプル コードから始めましょう。

コード例 1

/* 
 * Basic example code for controlling a stepper without library
 * 
 * by Dejan, https://howtomechatronics.com
 */
// defines pins
#define stepPin 2
#define dirPin 5 
 
void setup() {
 // Sets the two pins as Outputs
 pinMode(stepPin,OUTPUT); 
 pinMode(dirPin,OUTPUT);
}
void loop() {
 digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction
 // Makes 200 pulses for making one full cycle rotation
 for(int x = 0; x < 800; x++) {
 digitalWrite(stepPin,HIGH); 
 delayMicroseconds(700); // by changing this time delay between the steps we can change the rotation speed
 digitalWrite(stepPin,LOW); 
 delayMicroseconds(700); 
 }
 delay(1000); // One second delay
 
 digitalWrite(dirPin,LOW); //Changes the rotations direction
 // Makes 400 pulses for making two full cycle rotation
 for(int x = 0; x < 1600; x++) {
 digitalWrite(stepPin,HIGH);
 delayMicroseconds(500);
 digitalWrite(stepPin,LOW);
 delayMicroseconds(500);
 }
 delay(1000);
}Code language: PHP (php)

コードの説明:

ここでは、STEP ピンと DIR ピンがどのピン番号に接続されているかを定義し、それらを出力として定義するだけです。ループ内では、まず Direction ピンのステータスを HIGH にしてモーターの回転方向を設定します。次に、「for」ループを使用して STEP ピンに 200 パルスを送信します。これにより、モーターがフルステップ モードで動作することを考慮して、モーターが全サイクル回転します。パルスは、STEP ピンの状態を時間遅延を挟んで HIGH から LOW に切り替えるだけで生成されます。この時間遅延が実際に回転速度を定義します。下げるとステップが速くなるため回転速度が上がり、逆も同様です。 

次に、回転方向を変更し、別の「for」ループを使用して 400 個のパルスを送信します。これにより、モーターが 2 サイクル回転します。ただし、ドライバーのマイクロステッピング モードを 1/4 ステップに変更すると、モーターのステップ数は 800 になり、最初のループではモーターが 90 度だけ回転し、2 番目のループでは半回転だけになります。

コード例 2

もう 1 つの簡単な例は、ポテンショメータを使用してステッピング モーターの速度を制御する例です。

そのためには、ポテンショメータを Arduino に接続し、analogRead() 関数を使用してその値を読み取るだけです。

/*
 Basic example code for controlling a stepper without library
 by Dejan, https://howtomechatronics.com
*/
// defines pins
#define stepPin 2
#define dirPin 5
int customDelay, customDelayMapped;
void setup() {
 // Sets the two pins as Outputs
 pinMode(stepPin, OUTPUT);
 pinMode(dirPin, OUTPUT);
}
void loop() {
 speedControl();
 // Makes pules with custom delay, depending on the Potentiometer, from which the speed of the motor depends
 digitalWrite(stepPin, HIGH);
 delayMicroseconds(customDelayMapped);
 digitalWrite(stepPin, LOW);
 delayMicroseconds(customDelayMapped);
}
// Custom function for reading the potentiometer and mapping its value from 300 to 3000, suitable for the custom delay value in microseconds
void speedControl() {
 customDelay = analogRead(A0); // Read the potentiometer value
 customDelayMapped = map(customDelay, 0, 1023, 300, 3000); // Convert the analog input from 0 to 1024, to 300 to 3000
}Code language: PHP (php)

コードの説明:

次に、0 ~ 1023 のポテンショメータ値を、ステップ パルスのマイクロ秒単位の遅延時間に適した値にマッピングまたは変換できます。ステップ間の遅延の最小値は約 300 マイクロ秒であることがわかりました。それを下回ると、ステッピングモーターがステップをスキップし始めます。 

全体として、この方法でステッピング モーターを制御するのは簡単で、機能しますが、必要な制御が例に示すように単純な場合に限られます。より複雑な制御が必要な場合、最良の方法は Arduino ライブラリを使用することです。

Arduino と AccelStepper ライブラリを使用したステッピング モーターの制御 – 例

Arduino でステッピング モーターを制御するための最も人気のあるライブラリは、Mike McCauley による AccelStepper ライブラリです。これは、速度、加減速の制御、目標位置の設定、複数のステッピング モーターの同時制御などを備えた非常に多用途なライブラリです。

ライブラリには、各関数がどのように機能するかを説明する優れたドキュメントがあります。私はすでにこのライブラリをいくつかの Arduino プロジェクトで使用しており、DIY カメラ スライダー、3D ワイヤー ベンディング マシン、SCARA ロボット アームなどの動きを制御しています。ご興味があれば、Web サイトに各プロジェクトの詳細とコードの説明があります。 

次に、このライブラリを使用したコード例をいくつか見てみましょう。

コード例 – ポテンショメータを使用したステッピング モーターの速度制御

最初の例は、ポテンショメータを使用してモーターの速度を制御します。

/* 
 * Basic example code for controlling a stepper with the AccelStepper library
 * 
 * by Dejan, https://howtomechatronics.com
 */
#include <AccelStepper.h>
// Define the stepper motor and the pins that is connected to
AccelStepper stepper1(1, 2, 5); // (Type of driver: with 2 pins, STEP, DIR)
void setup() {
 // Set maximum speed value for the stepper
 stepper1.setMaxSpeed(1000);
}
void loop() {
 stepper1.setSpeed((analogRead(A0));
 // Step the motor with a constant speed previously set by setSpeed();
 stepper1.runSpeed();
}Code language: PHP (php)

コードの説明:

したがって、ここではまず AccelStepper ライブラリをインクルードする必要があります。もちろん、その前にライブラリをインストールする必要があります。これは Arduino IDE ライブラリ マネージャーから実行できます。 「AccelStepper」を検索するだけでライブラリが表示され、インストールできます。 

次に、モーター用の AccelStepper クラスのインスタンスを作成する必要があります。ここでの最初のパラメータはドライバのタイプです。この場合、2 つの制御ピンを持つドライバの場合、この値は 1 で、他の 2 つのパラメータはドライバが Arduino に接続されているピン番号です。複数のステッピング モーターがある場合は、それぞれを次のように定義する必要があります。好きな名前を付けることができます。この場合、モーターに stepper1 という名前を付けました。 

セットアップセクションでは、1 秒あたりのステップ数として定義されるモーターの最大速度を設定するだけです。この値は最大 4000 まで可能ですが、ライブラリのドキュメントには、1 秒あたり 1000 ステップを超える速度値は信頼できない可能性があると記載されています。 

ループ セクションでは、setSpeed() 関数を使用してモーターの現在の速度を設定します。この場合、それはポテンショメータからのアナログ入力であり、0 ~ 1023 です。

モーターを動かし、その一定速度を実現するには、間隔ごとに runSpeed() 関数を呼び出す必要があります。ここで負の値を指定するか、単に値の前にマイナス記号を含めると、ステッピング モーターが逆方向に回転します。

コード例 – 加速と減速による 2 つのステッピング モーターの制御

以下は、AccelStepper ライブラリを使用して加速と減速を実装して 2 つのステッピング モーターを制御する別の例です。

/*
 Controlling two stepper with the AccelStepper library
 by Dejan, https://howtomechatronics.com
*/
#include <AccelStepper.h>
// Define the stepper motor and the pins that is connected to
AccelStepper stepper1(1, 2, 5); // (Typeof driver: with 2 pins, STEP, DIR)
AccelStepper stepper2(1, 3, 6);
void setup() {
 stepper1.setMaxSpeed(1000); // Set maximum speed value for the stepper
 stepper1.setAcceleration(500); // Set acceleration value for the stepper
 stepper1.setCurrentPosition(0); // Set the current position to 0 steps
 stepper2.setMaxSpeed(1000);
 stepper2.setAcceleration(500);
 stepper2.setCurrentPosition(0);
}
void loop() {
 stepper1.moveTo(800); // Set desired move: 800 steps (in quater-step resolution that's one rotation)
 stepper1.runToPosition(); // Moves the motor to target position w/ acceleration/ deceleration and it blocks until is in position
 stepper2.moveTo(1600);
 stepper2.runToPosition();
 // Move back to position 0, using run() which is non-blocking - both motors will move at the same time
 stepper1.moveTo(0);
 stepper2.moveTo(0);
 while (stepper1.currentPosition() != 0 || stepper2.currentPosition() != 0) {
 stepper1.run(); // Move or step the motor implementing accelerations and decelerations to achieve the target position. Non-blocking function
 stepper2.run();
 //
 //
 }
}Code language: PHP (php)

コードの説明:

したがって、2 つのステッピング モーターを定義し、セットアップで setAcceleration() 関数を使用してモーターの加速値を設定する必要があります。 setCurrentPosition() 関数を使用して、モーターの位置を 0 ステップに設定します。 

ループセクションでは、moveTo() 関数から開始し、モーターにどの位置に移動するか、または何ステップ移動するかを指示します。 4 分の 1 ステップの解像度の場合、800 ステップは 1 回転を意味します。次に、runToPosition()関数で加減速を行いながらモーターをその位置に移動させます。ただし、これはブロック関数であるため、ステッピング モーターがその位置に到達するまで、コードの実行はそこに留まります。 

同じ方法で、2 番目のモーターを 1600 ステップ、つまり 4 分の 1 ステップの分解能で 2 回転させます。 

モーターが目標位置に到達するまでコードをブロックしたくない場合は、 runToPosition() 関数を使用する代わりに、 run() 関数を使用する必要があります。 run() は目標位置に到達するための加速と減速も実装しますが、呼び出しごとに 1 ステップを実行するだけです。したがって、できるだけ頻繁に呼び出す必要があります。そのため、ここでは両方のモーターの run() 関数をこの while ループに配置し、両方のステッパーが位置 0 に到達するまで実行されます。以前に、moveTo() 関数を使用して 2 つのモーターが位置 0 に移動するように設定しました。 

また、その「while」ループにコードを追加して、モーターの実行中に他のことを実行することもできます。実際には、モーターを動かしたり、他のことを行う方法もたくさんあります。各関数がどのように動作するかを理解し、ニーズに応じて実装できるように、わかりやすく説明されたライブラリのドキュメントに目を通すことをお勧めします。

コード例 – AccelStepper ライブラリを使用した複数のステッピング モーターの制御

AccelStepper ライブラリを使用して、複数のステッピング モーターを協調的に制御する例をもう 1 つ示したいと思います。つまり、ステッパーごとに目標位置を設定でき、移動する必要がある距離が異なっていても、すべてのステッパーが同時にその位置に到達できるということです。

これは、AccelStepper ライブラリに付属する MultiStepper クラスを使用して簡単に実行できます。

/*
 Controlling multiple steppers with the AccelStepper and MultiStepper library
 by Dejan, https://howtomechatronics.com
*/
#include <AccelStepper.h>
#include <MultiStepper.h>
// Define the stepper motor and the pins that is connected to
AccelStepper stepper1(1, 2, 5); // (Typeof driver: with 2 pins, STEP, DIR)
AccelStepper stepper2(1, 3, 6);
AccelStepper stepper3(1, 4, 7);
MultiStepper steppersControl; // Create instance of MultiStepper
long gotoposition[3]; // An array to store the target positions for each stepper motor
void setup() {
 stepper1.setMaxSpeed(1000); // Set maximum speed value for the stepper
 stepper2.setMaxSpeed(1000);
 stepper3.setMaxSpeed(1000);
 // Adding the 3 steppers to the steppersControl instance for multi stepper control
 steppersControl.addStepper(stepper1);
 steppersControl.addStepper(stepper2);
 steppersControl.addStepper(stepper3);
}
void loop() {
 // Store the target positions in the "gotopostion" array
 gotoposition[0] = 800; // 800 steps - full rotation with quater-step resolution
 gotoposition[1] = 1600;
 gotoposition[2] = 3200;
 steppersControl.moveTo(gotoposition); // Calculates the required speed for all motors
 steppersControl.runSpeedToPosition(); // Blocks until all steppers are in position
 delay(1000);
 gotoposition[0] = 0;
 gotoposition[1] = 0;
 gotoposition[2] = 0;
 steppersControl.moveTo(gotoposition);
 steppersControl.runSpeedToPosition();
 delay(1000);
}Code language: PHP (php)

コードの説明:

ここでは、MultiStepper クラスを含めて、そのインスタンスを作成する必要もあります。次に、モーターのターゲット位置を保存するために使用される「long」型の配列を定義する必要があります。セットアップ セクションでは、ステッパーの最大速度値を定義し、以前に作成した MultiStepper インスタンスにステッパーを追加する必要があります。ここでは、「steppersControl」という名前を付けました。 

ループセクションでは、まず、以前に作成した配列にターゲット位置の値を保存します。最初のステッパーは 1 回転、2 番目は 2 回転、3 番目は 3 回転するように設定しました。次に、この配列を moveTo() 関数に割り当てることができます。この関数は、すべてのモーターがそれらの位置に同時に到着するために必要な速度を計算します。次に、モーターをその位置に移動する runSpeedToPosition() 関数を呼び出すだけです。ただし、この関数はステッパーがターゲット位置に到達するまでコードをブロックすることに注意してください。コードをブロックしたくない場合は、代わりに run() 関数を使用できます。 MultiStepper クラスは加速と減速をサポートしていないことにも注意してください。 

それでも、より高度な例からさらに詳しく知りたい場合は、すでに述べた私の Arduino プロジェクトをチェックしてください。すべての詳細とコードは Web サイトにあります。

Arduino プロジェクトの複数のステッピング モーターを制御するための CNC シールド

複数のステッピング モーターの制御についてはまだ検討中ですが、Arduino CNC シールドについて言及し、見てみる価値はあります。

Arduino CNC シールドの主な目的は 2 軸または 3 軸 CNC マシンを制御することですが、実際には、コンパクトでドライバーとモーターの接続が簡単なため、複数のステッピング モーターを制御する必要があるあらゆるタイプのプロジェクトを制御するための優れたオプションです。 

このシールドは Arduino UNO ボードの上に設置され、最大 4 つの個別のステッピング モーターを制御でき、残りのすべての Arduino ピンを使用できるようになります。 Arduino UNO ボードと CNC シールドのこの組み合わせを使用して、4 軸スカラ ロボット アームを制御しました。

Arduino で CNC シールドを使用する方法については、記事のこのセクションを近日中に更新して詳細をお知らせする予定です。

DRV8825 対 A4988

さて、それでは次に進み、冒頭で述べたもう 1 つのドライバーである DRV8825 を使用してステッピング モーターを制御する方法を見てみましょう。

実際、A4988 ステッピング ドライバーを使用したステッピング モーターの制御についてこれまで説明したことはすべて、DRV8825 にも当てはまります。これらのドライバーの動作原理、接続、コーディングはほぼ同じです。それらの違いは技術的特性にあります。ここでそれらを見て比較していきます。

DRV8825 は、Texas Instruments のステッパー ドライバーであり、接続が同じであるため、Allegro A4988 ドライバーの直接の代替品として使用できます。これらの 3 つの主な違いは、DR8825 は追加の冷却なしで A4988 より多くの電流を供給できること (1.5A 対 1A)、最大電源電圧が高く (45V 対 35V)、より高いマイクロステップ分解能 (32 対 16 マイクロステップ) を提供することです。 

もちろん、他にもいくつかの小さな違いがあります。たとえば、電流制限ポテンショメータの位置が異なり、電流制限設定と基準ピン電圧の関係も異なります。 DRV8825 はロジック電源を必要とせず、そのピンの位置が FAULT 出力として使用されます。

ただし、FAULT ピンを 5V に直接接続しても安全なので、A4988 ドライバ用に設計されたシステムで DRV8825 を直接代替品として使用できます。 

ただし、A4988 ドライバーを DRV8825 に置き換える場合、ドライバーの向きが正しいことを確認することが非常に重要であることに注意してください。すでに述べたように、ポテンショメータの位置は異なります。A4988 ではチップの下にあり、DRV8825 ではチップの上にあり、それが混乱を引き起こす可能性があり、ドライバが簡単に間違った側に配置される可能性があります。 

電流制限を設定するには、1 つのプローブを GND に接続し、もう 1 つのプローブをポテンショメータ自体に接続して基準電圧を測定します。

DRV8825 ステッピング ドライブの計算式は次のとおりです。

電流制限 =Vref x 2

マイクロステップ解像度の選択に関しては、次の表を使用できます。

全体として、DRV8825 は A4988 よりも優れたステッピング ドライバーです。より高い電流と電圧定格、およびより高いマイクロステッピング解像度を提供し、結果としてステッピング モーターのよりスムーズで静かな動作を実現します。

TMC2208 ステッパー ドライバー

よりスムーズで静かな動作について言えば、TMC2208 ステッピング ドライバーを見てみましょう。 TMC2208 チップは、モーション コントロール エレクトロニクスを専門とするドイツに本拠を置く企業 Trinamic によって製造されています。 TMC2208 は、A4988 または DRV8825 ドライバ用に設計されたシステムの直接代替品としても使用できる静音ステッピング モータ ドライバです。デスクトップ 3D プリンタ、レーザー彫刻機、スキャナなどで広く使用されています。

このドライバーを他の 2 つのドライバーと区別しているのは、256 のサブディビジョンまたはマイクロステップを提供する統合された補間ユニットです。これにより、チップ内部で生成される完璧な正弦波制御が可能になります。これは、2 つの MS ピンを通じて選択したマイクロステップ分解能 (2、4、8、または 16 マイクロステップ) に関係なく、ドライバーがステッピング モーターに 256 マイクロステップを出力することを意味します。これにより、よりスムーズな動作が実現し、マイクロコントローラーの負担が大幅に軽減されます。

ドライバーのこの機能は、ノイズのない電流制御 StealthChop2 テクノロジーと組み合わせることで、ステッピング モーターの超静音制御を実現します。以下は 3 つのドライバー間の騒音レベルの比較です。

ステッパー ドライバーのノイズ レベル: A4988 は約 65dB、DRV8825 は約 67dB、TMC2208 は約 41dB です。

TMC2208 はステッピング モーターを完全に静かに駆動します。これは非常に印象的です。

TMC2208 の電流定格は A4988 ドライバよりわずかに高く、1.2A (ピーク電流 2A) です。ドライバーの電流制限を設定するには、他のドライバーで説明したのと同じ方法を使用できます。 1 つのプローブを GND 上で使用し、もう 1 つのプローブ全体をイネーブル ピンのすぐ隣で基準電圧を測定する必要があります。

電流制限の計算式は次のとおりです。

電流制限 =Vref x 0.71

TMC2208 ドライバーは直接置き換えて使用できますが、A4988 ドライバーと比較してピン配置がわずかに異なります。ここでは、マイクロステップ分解能を選択するためのピンが 2 つだけあり、ドライバーを有効にするために、Enable ピンを GND に接続する必要があります。

コーディングの点では、他の 2 つのドライバーと同じです。 

TMC2208 ドライバには、他の 2 つのドライバと比較して、より高度な機能もいくつかあります。たとえば、2 つの Step ピンと Dir ピンの代わりに 1 本のラインでドライバを制御できる使いやすい UART インターフェイスなどです。それに加えて、より多くの調整および制御オプションを提供します。 

全体として、TMC2208 は A4988 や DRV8825 よりも優れたドライバーですが、価格が高いのは当然のことです。ただし、これらの追加機能が必要なく、騒音レベルが気にならない場合は、他の 2 つのドライバーが最適な選択肢になります。

結論

これで、Arduino を使用したステッピング モーターの制御について知っておくべきことはほぼすべてカバーできました。 NEMA17 と 3 つのドライバー、A4988、DRV8825、TMC2208 は非常に汎用性が高く、位置制御が必要な多くのアプリケーションで使用できます。私の Arduino プロジェクトをいくつか探索することで、いつでも詳細を学ぶことができます。

NEMA23 や NEMA34 などのより大きなステッピング モーターを制御する方法を学習することに興味がある場合は、専用のチュートリアルも用意しています。 

このチュートリアルを楽しんでいただき、何か新しいことを学んでいただければ幸いです。忘れずに購読してください。ご質問があれば、下のコメント セクションでお気軽に質問してください。


製造プロセス

  1. 日付、時刻、温度、湿度の表示
  2. 型抜き機の基本的なメンテナンスのヒント
  3. スイスの CNC 旋盤を使用するのは誰ですか?
  4. CNC旋削部品の説明
  5. 水鉄砲
  6. プリセット曲付き電子ピアノキーボード
  7. ラズベリーパイ温度および光センサー
  8. 集積回路
  9. ArduinoおよびACデバイス-自動ライト
  10. コンパクトディスクプレーヤー
  11. フライトシミュレーター用のDIYラダーペダル