ステッピングモーターの電流を最適化して省電力化&発熱対策 (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には他にも多くの機能があり、それらの解説記事も参考にしてください。

SCD41 CO2センサーとラズパイで二酸化炭素濃度を測定する

Indoor Corgiのセンサー制御ソフトウェア「cgsensor」を利用して、SCD41 CO2センサーで二酸化炭素濃度を測定したり、センサーの校正や設定を変更する方法を解説します。コマンドラインツールを使って1行もコードを書かずに測定や記録ができるほか、Pythonパッケージを使えばご自身のプログラムから簡単にセンサーを制御できます。

ラズパイで赤外線制御 (家電、エアコン、照明、テレビなどを制御するホームIoT)

Pythonとpigpioを使ってRaspberry Piで赤外線の送受信を行う方法について解説しています。サンプルプログラムを用意しているので、簡単に受信、登録、送信動作をさせることができるほか、データ解析も可能です。赤外線を使ってエアコン、照明、テレビなどの家電を制御することが可能になります。

RPZ-Stepper (Raspberry Pi用 高機能ステッピングモータードライバー)

ステッピングモーターを制御できるRaspberry Pi(ラズパイ)用拡張基板です。位置や角度、回転数などを指示すれば、自動で目標までモーターを動かしてくれます。加減速、静音モード、省電力モード、電流測定などの機能を搭載しています。ものを動かしたり回転させるシステムが実現できます。