ステッピングモーターは軽負荷や停止時であっても電流を消費するという特徴があります。RPZ-Stepperは回転時、停止時それぞれについて、32段階で電流値を変更できます。最適な値にすることで省電力化が可能です。また、電流の測定も可能で、バッテリーでの動作時間の見積もりが可能です。
更新日 : 2023年11月13日セットアップ
本記事では高機能モータードライバー基板「RPZ-Stepper」を使用してステッピングモーターを制御します。RPZ-Stepperの特徴、セットアップ、制御ソフトウェアのインストールは製品ページを参照してください。

制御ソフトウェアcgstepの基本的な使い方は以下の記事で解説しています。まだの方は先に確認してください。
J3 MOTOR1端子にモーターを接続します。
Pythonでの準備
Pythonは対話モードで解説していきます。Pythonサンプルコードも用意しています。
Pythonの場合、モーター制御クラスのインスタンスを作成します。
Python:
from cgstep import TMC5240
m1 = TMC5240()
電流レンジを細かく設定する
current_rangeで基本となる電流レンジを0-2で設定します。電流レンジは相あたりの最大電流を決めるだけでなく、後述する32段階の電流値設定の基準になります。
例えば50%の電流に設定した場合、電流レンジが3Aなら1.5A程度、電流レンジが1Aなら0.5A程度になるということです。なお、モーターの定格以上に電流が流れることはありません。定格で1Aのモーターの場合、電流レンジを3Aにしても1Aまでしか流れません。
逆に、定格が1.5Aのモーターに対して電流レンジを1Aにすることで省電力化することは可能です。その場合はトルクが足りていることを確認してください。
current_range | 電流レンジ(ピーク/相) | 電流レンジ(実効値/相) |
---|---|---|
0 (初期値) | 1A | 0.7A |
1 | 2A | 1.4A |
2 | 3A | 2.1A |
Python:
m1.current_range = 2
コマンド:
cgstep current_range -w 2
global_scalerに1-255の値を設定することで電流レンジを細かく調整できます。例えばcurrent_rangeに1、global_scalerに192を設定すると電流レンジは1.5Aとなります。
電流レンジ = current_rangeで設定した値 x (global_scaler)/256
以下の例では0(global_scaler無効、初期値)としています。必要に応じて設定してください。
Python:
m1.global_scaler = 0
コマンド:
cgstep global_scaler -w 0
電流値を設定する
irunでモーター回転中の電流値を、iholdでモーター停止中の電流値をそれぞれ0-31の32段階で設定できます。irunの初期値は31、iholdの初期値は8となっています。
今回では比較のため最初はどちらも最大の31に設定します。
Python:
m1.irun = 31
m1.ihold = 31
コマンド:
cgstep irun -w 31
cgstep ihold -w 31
モーターが停止した後、電流値irunを保持する時間(iholdに下げ始めるまでの待ち時間)をtpowerdownで0-255の範囲で設定できます。時間は以下の式で計算できます。初期値は10です。
停止後irunを保持する時間 = tpowerdown x 21[ms]
Python:
m1.tpowerdown = 10
コマンド:
cgstep tpowerdown -w 10
必須の設定をしておきます。
Python:
m1.vmax = 68720
m1.amax = 500
m1.dmax = 500
m1.enable()
コマンド:
cgstep vmax -w 68720
cgstep amax -w 500
cgstep dmax -w 500
cgstep enable
停止時の電流値を測定する
board_currentを読み出すことで、基板の電流値を測定できます。これはパラメーターではなくcgstepのオペレーション名となります。これにより、設定でどの程度電流値が変化するかの確認や、バッテリーでの動作時間の見積もりが可能です。
測定電流はモーターごとではなく、基板全体の値となります。測定精度は+/-10%となります。
実際に電流値を表示してみます。単位はAです。現在モーターは停止しているので、ihold=31の電流値となります。
Python:
print(m1.board_current)
コマンド:
cgstep board_current
次にiholdを4に変更して電流を測定してみます。電流値が下がっているのが分かると思います。
Python:
m1.ihold = 4
print(m1.board_current)
コマンド:
cgstep ihold -w 4
cgstep board_current
回転時の電流を測定する
今度は回転時の電流を測定してみます。速度指定モードで回転させて測定してみます。irun=31の電流値となります。
Python:
m1.rampmode = TMC5240.RAMPMODE_VELOCITY_POSITIVE
print(m1.board_current)
コマンド:
cgstep rampmode -w 1
cgstep board_current
irunを16に変更して測定してみます。電流値が下がると思います。あまり変わらない場合は電流レンジがモーター定格に対して大きすぎる可能性があります。また、電流値はirunの設定値に比例して変化するわけではありません。
Python:
m1.irun = 16
print(m1.board_current)
コマンド:
cgstep irun -w 16
cgstep board_current
別の解説記事に進む場合は、SW1スイッチを押してリセットするか、以下を実行してモーターをもとの位置に戻しておきます。
Python:
m1.rampmode = TMC5240.RAMPMODE_POSITIONING
コマンド:
cgstep rampmode -w 0
まとめ
制御ソフトウェアcgstepで、ステッピングモーター電流値を設定、測定する方法の解説は以上です。RPZ-Stepperには他にも多くの機能があり、それらの解説記事も参考にしてください。

人感センサーとラズパイで人や動物が通ったら撮影する (RPZ-PIRS)
人感センサー(PIR/焦電赤外線センサー)は、人や動物の動きを検知できます。そこで、Raspberry Pi(ラズパイ)、カメラと組み合わせて、人や動物が通ったら写真や動画を撮影する方法を解説します。実際に動作するプログラムも用意しています。人感センサー搭載のRPZ-PIRS拡張基板を利用します。

定期撮影ラズパイカメラをモバイルバッテリーで長期運用 (RPZ-PowerMGR)
Raspberry Pi(ラズパイ)と純正カメラを使用して、定期的に撮影するタイムラプス機能を実装する方法を解説します。RPZ-PowerMGR拡張基板を使うことで、指定時刻に起動し、撮影後は自動的にシャットダウン&電源OFFします。待機時の消費電力をカットすることで、モバイルバッテリーで長期運用が可能になります。

RPZ-PIRS (Raspberry Pi用 人感/明るさセンサー/赤外線 拡張基板)
Raspberry Pi(ラズパイ)に人感、明るさセンサー、赤外線送受信機能を搭載できる拡張基板です。人感センサーで人や動物を検知してカメラで撮影したり、赤外線で照明をONするような使い方が可能です。周囲の明るさをモニターできる他、外付温湿度/気圧センサー(別売り)を接続することで、温度、湿度、気圧の測定機能を追加できます。7色表示可能なRGB LEDにステータスを表示したり、スイッチを押すことで特定の動作をさせることができます。