ステッピングモーターの電流を最適化して省電力化&発熱対策 (Raspberry Pi + RPZ-Stepper)

ステッピングモーターは軽負荷や停止時であっても電流を消費するという特徴があります。RPZ-Stepperは回転時、停止時それぞれについて、電流値を変更できるため、最適な値にすることで省電力化が可能です。また、ドライバーICの温度や、消費電流の測定も可能で、発熱やバッテリーでの動作時間の見積もりが可能です。

更新日 : 2024年1月3日

セットアップ

本記事では高機能モータードライバー基板「RPZ-Stepper」を使用してステッピングモーターを制御します。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拡張基板を利用します。

定期撮影ラズパイカメラをモバイルバッテリーで長期運用 (RPZ-PowerMGR)

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

RPZ-CO2-Sensor (Raspberry Pi用 二酸化炭素センサー/リレー 拡張基板)

Raspberry Pi(ラズパイ)用CO2センサーとリレー拡張基板です。CO2濃度を測定することで換気の目安としたり、オフィス環境の改善やスマート農業のCO2モニタリングに利用できます。CO2濃度が一定以上になった際、リレーで換気ファンなどの外部機器をON/OFFできます。7色表示可能なRGB LEDを搭載し、CO2濃度に合わせて色を変えることも可能です。