ステッピングモーターは軽負荷や停止時であっても電流を消費するという特徴があります。RPZ-Stepperは回転時、停止時それぞれについて、電流値を変更できるため、最適な値にすることで省電力化が可能です。また、ドライバーICの温度や、消費電流の測定も可能で、発熱やバッテリーでの動作時間の見積もりが可能です。
更新日 : 2024年8月21日セットアップ
本記事では高機能モータードライバー基板「RPZ-Stepper」を使用してステッピングモーターを制御します。RPZ-Stepperの特徴、セットアップ、制御ソフトウェアのインストールは製品ページを参照してください。
制御ソフトウェアcgstepの基本的な使い方は以下の記事で解説しています。まだの方は先に確認してください。
J3 MOTOR1端子にモーターを接続します。
Pythonでの準備
Pythonは対話モードで解説していきます。Pythonサンプルコードも用意しています。
Pythonの場合、モーター制御クラスのインスタンスを作成します。
Python:
from cgstep import TMC5240
m1 = TMC5240()
電流の最大値の設定
こちらで解説したとおり、電流の最大値ifsを設定します。この後に設定する回転中、停止中の電流値はこの最大値が基準となります。通常はモーターの定格電流に合わせて設定してください。
例えば、0.5Aに設定するには以下のようにします。
Python:
m1.ifs = 0.5
コマンド:
cgstep ifs -w 0.5
なお、モータードライバーTMC5240にはifsというパラメーターはなく、current_rangeとglobal_scalerの2つを設定することで指定の電流値に設定しています。
回転中と停止中の電流値を設定する
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_rpm = 60
m1.amax = 500
m1.dmax = 500
m1.enable()
コマンド:
cgstep vmax_rpm -w 60 -s 200
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
ドライバーICの発熱について
モーターを駆動する際、ドライバーICが発熱します。電流の最大値(ifs)の設定が2Aを超える場合はドライバーICの温度に注意するようにしてください。使用環境によって変動しますが、連続運転する場合の電流値の目安は以下の通りです。
- 周囲温度30℃: 3A/相 (実効値2.1A)
- 周囲温度40℃: 2.6A/相 (実効値1.8A)
- 周囲温度60℃: 2.1A/相 (実効値1.5A)
周囲温度にはRaspberry Pi本体や周囲のドライバーICの発熱も含みます。また、ihold=31のように静止中も多くの電流を流している場合、静止中でも発熱が大きくなります。
ドライバーICの内部温度[℃]はadc_tempを読み出すことで確認できます。運用時はドライバICの温度が125℃を超えないようにしてください。ドライバーICはモーターごとに独立していますので、複数モーターを駆動する際はそれぞれについて確認してください。
Python:
print('ドライバーIC温度: {}℃'.format(m1.adc_temp))
コマンド:
cgstep adc_temp
ドライバーICの発熱が大きい場合は以下のような対策が可能です。
- 回転中のトルクが十分な状況ではirunを低くして電流を抑える。もしくはifsをモーターの定格より下げる。
- 最高速度(回転数)を下げてトルクを確保し、irunを下げる。(ステッピングモーターは回転数が上がるとトルクが下がるため)
- iholdを適切に設定して静止中の電流を抑え、連続運転の合間に静止時間を入れる。
- 電源電圧を下げる(トルクも下がる可能性があります)
- 基板上のドライバーICにヒートシンクを取り付ける、またはファンで冷却する
また、モーター本体の発熱についてはモーターの仕様書に従ってください。
位置指定モードに戻す
別の解説記事に進む場合は、SW1スイッチを押してリセットするか、以下を実行して位置指定モードに戻しておきます。モーターも座標0に戻ります。
Python:
m1.rampmode = TMC5240.RAMPMODE_POSITIONING
コマンド:
cgstep rampmode -w 0
まとめ
制御ソフトウェアcgstepで、ステッピングモーター電流値を設定する方法や、発熱対策についての解説は以上です。RPZ-Stepperには他にも多くの機能があり、それらの解説記事も参考にしてください。
人感センサーとラズパイで人や動物が通ったら撮影する (RPZ-PIRS)
人感センサー(PIR/焦電赤外線センサー)は、人や動物の動きを検知できます。そこで、Raspberry Pi(ラズパイ)、カメラと組み合わせて、人や動物が通ったら写真や動画を撮影する方法を解説します。実際に動作するプログラムも用意しています。人感センサー搭載のRPZ-PIRS拡張基板を利用します。
指定時刻にラズパイ/Jetsonの電源をON/OFF (RPZ-PowerMGR)
RPZ-PowerMGRを使って、指定時刻にRaspberry Pi(ラズパイ)やJetson Nanoの電源ON/OFFする方法の解説です。決まった時間だけ起動して消費電力を抑えることが可能で、モバイルバッテリーやソーラーシステムでの運用に最適です。
RPi TPH Monitor Rev2 (Raspberry Pi用 温度/湿度/気圧/赤外線 ホームIoT拡張ボード)
動作をプログラミング可能な、Raspberry Pi(ラズパイ)用ホームIoT拡張ボードです。温度、湿度、気圧センサー、赤外線送信、受信機能を搭載。温度が上がったらエアコンをオンにする、外出先から家電の操作をする、気温や湿度を記録する、といった使い方が可能です。ディスプレイやLEDに情報表示、スイッチを押したら特定の処理をすることもできます。