DRV8825というモータードライバーを使ってNEMA 17ステッピングモーターを回してみた。 だいたいStepper Motor with DRV8825 and Arduino Tutorial (4 Examples)を読めば分かるのだが、まとまった日本語文献が見当たらなかったので書き残しておく。
部品について
ステッピングモーターは3Dプリンターのような正確な位置決めが必要になる用途で使われる。 モーターを回すには比較的大電流が必要になるため、モータードライバーと呼ばれるICを使うことが一般的である。 今回は比較的安価で評判の良かったDRV8825を使うことにした。 ICをそのまま使うのは面倒なので各種部品を追加したモジュールがPololu社から販売されており (Pololu - DRV8825 Stepper Motor Driver Carrier, High Current)、その互換品をAmazonで購入した。
ステッピングモーターにはいろいろ種類があるのだが、今回はよく使われるNEMA 17という種類のものを使うことにする。 NEMA 17はNational Electrical Manufactures Associationが定めた規格で、大きさが 1.7 x 1.7 inch (42.3 x 42.3 mm) であることが決まっている。 それ以外に何が定められているのかはよく知らないのだが、NEMA 17準拠を謳うモーターでも高さや電圧にはバラつきがあるので割と緩い規格のようだ。 NEMA 17に準拠したモーターの例は https://reprap.org/wiki/NEMA_17_Stepper_motor などに挙げられている。 今回は電圧12V・高さ39mmの17HS15-1504S-X1というモーターをAmazonで購入した。
モーターを制御するArduinoなどを含めた買い物リストは以下の通りである。
買い物リスト
- Arduino Uno(今回はAmazonで売っていた互換ボードを使用)
- DRV8825モジュール (今回購入した製品)
- ステッピングモーター(12Vであればどれでもいいはず。今回購入した製品)
- ブレッドボードとジャンパーケーブル(Amazonの商品例)
- DC 12V電源(2A以上流せる必要がある。今回購入した商品。ターミナルブロックへの変換プラグがあるとブレッドボードへの接続が楽になる)
- デジタルマルチメーター(DC電圧が測定できれば何でもよい)
- 100 μFのコンデンサ(パスコンなので容量はある程度適当でも良いはず)
ハードウェアの設定
電流制限の設定
今回購入したモジュールはポテンショメータを回すことで電流制限の調整を行うことができる。このモジュールは最大で2.5Aしか流せないのだが、初期位置によってはそれよりも多い電流が流れる設定になっている場合があるのでモーターをつなぐ前に設定値を確認する必要がある。ブレッドボードを用いて以下のような回路を組む。
右上の電源にはモーター用の電源12Vをつなぐ。ドライバーでポテンショメータを回して、GNDとポテンショメータ間の電圧を測定することで電流値を設定できる。ポテンショメータの電圧をVref (V)とすると 最大電流 (A) = Vref x 2
という関係が成り立つ。このモジュールはヒートシンクなしで1.5Aまで流せるので、とりあえず0.75 Vくらいに設定するのが良いだろう。
設定方法についての公式動画はここに上がっている。 www.youtube.com
解説
最大電流 (A) = Vref x 2
という公式だが、左右で単位が揃っていなくて気持ちが悪い。DRV8825のデータシートに掲載されている元の数式は というものである。ここでモータードライバモジュールの回路図を確認するとは0.1 Ωなので、最大電流 (A) = Vref (V) / 0.5 (Ω)
がこの公式の本来の姿となる。
モーターの配線
最大電流を設定できたらいよいよモーターの配線を行う。次のように接続すればよい。
モーターから出るケーブルの色は型番によって異なるようなのだが、とりあえず左から順番につないでおけば動いた。一応解説しておくと、このモジュールのピン配置は以下のようになっている(モジュールを裏返すと書いてある)。
- VMOT: モーター用電源の+端子を接続する
- GND: 片方はモーター用電源の-端子に、もう片方はArduinoのGNDに接続する
- SLP・RST: Arduinoからの5Vに接続する
- DIR: Arduinoの2ピン
- STP: Arduinoの3ピン
接続が完了したらArduinoに以下のコードを書きこむ。なお、配線が間違っていた場合にPCのUSB端子に12Vが掛かってダメージを受けるのを防ぐため、私はいつも電源を外した状態でプログラムを書き込み、その後ArduinoをPCから外して外部電源につなぎなおしてから12V電源をつなぐようにしている。
/* Example sketch to control a stepper motor with A4988/DRV8825 stepper motor driver and Arduino without a library. More info: https://www.makerguides.com */ // Define stepper motor connections and steps per revolution: #define dirPin 2 #define stepPin 3 #define stepsPerRevolution 200 void setup() { // Declare pins as output: pinMode(stepPin, OUTPUT); pinMode(dirPin, OUTPUT); } void loop() { // Set the spinning direction clockwise: digitalWrite(dirPin, HIGH); // Spin the stepper motor 1 revolution slowly: for (int i = 0; i < stepsPerRevolution; i++) { // These four lines result in 1 step: digitalWrite(stepPin, HIGH); delayMicroseconds(2000); digitalWrite(stepPin, LOW); delayMicroseconds(2000); } delay(1000); // Set the spinning direction counterclockwise: digitalWrite(dirPin, LOW); // Spin the stepper motor 1 revolution quickly: for (int i = 0; i < stepsPerRevolution; i++) { // These four lines result in 1 step: digitalWrite(stepPin, HIGH); delayMicroseconds(1000); digitalWrite(stepPin, LOW); delayMicroseconds(1000); } delay(1000); // Set the spinning direction clockwise: digitalWrite(dirPin, HIGH); // Spin the stepper motor 5 revolutions fast: for (int i = 0; i < 5 * stepsPerRevolution; i++) { // These four lines result in 1 step: digitalWrite(stepPin, HIGH); delayMicroseconds(500); digitalWrite(stepPin, LOW); delayMicroseconds(500); } delay(1000); // Set the spinning direction counterclockwise: digitalWrite(dirPin, LOW); //Spin the stepper motor 5 revolutions fast: for (int i = 0; i < 5 * stepsPerRevolution; i++) { // These four lines result in 1 step: digitalWrite(stepPin, HIGH); delayMicroseconds(500); digitalWrite(stepPin, LOW); delayMicroseconds(500); } delay(1000); }
プログラムはMakerguidesからCC BY-NC-SA 4.0ライセンスに基づき掲載。
正しく設定できていればモーターが左右に回転するはずである。
ここまでできれば、あとはAccelStepperライブラリやStepperDriverライブラリなどでステッピングモーターを制御できるはずである。既に文献がありそうなのでここでは割愛する。 また、ブレッドボードで大電流を流すのは推奨できないのでこの構成はあくまでテスト用であり、本番実装では適切な配線を行うべきである。