ステッピングモーターを指定位置まで回転させる基本手順 (Raspberry Pi + RPZ-Stepper)

RPZ-StepperとRaspberry Pi(ラズパイ)を使ってステッピングモーターを指定位置まで回転させる基本手順を解説しています。制御ソフトウェアcgstepの使い方と、必須のパラメーターについても解説しています。

更新日 : 2024年1月3日

セットアップ

本記事では高機能モータードライバー基板「RPZ-Stepper」を使用してステッピングモーターを制御します。RPZ-Stepperの特徴、セットアップ、制御ソフトウェアのインストールは製品ページを参照してください。

RPZ-Stepper

J3 MOTOR1端子にモーターを接続します。

Pythonとコマンドライン

RPZ-Stepper制御ツール「cgstep」は、Pythonもしくはコマンドで操作することができます。そこで、これ以降は画面を左右に分けてそれぞれの方法を解説していきます。まずはターミナルを開きましょう。

Pythonは対話モードで解説していきます。python3コマンドで対話モードに入り、「>>>」が表示される状態としてください。Pythonコードも用意しているので、対話モードでなく直接実行したい方はそちらも参考にしていただけます。

Python:

$ python3
>>> 

Pythonでの準備

最初のステップとして、必要最低限の設定でモーターを指定位置まで回転させる方法を解説します。

Pythonの場合は、モーター制御の準備をします。m1がモーター制御クラスのインスタンスで、J2 MOTOR1端子のモーターを操作できます。steps_per_revは使用モーターの1回転のフルステップ数を指定します。ステップ角1.8度なら360÷1.8=200となります。省略すると200になります。

コマンドラインの場合は次に進んでください。

Python:

from cgstep import TMC5240
m1 = TMC5240(steps_per_rev=200)



パラメーターの設定方法

モーターを操作する際に最もよく使用するのがパラメーターの設定(書き込み)です。例えば、モーターの回転速度や加減速、目標位置などのパラメーターに値を設定することで、意図した通りにモーターを動かせるのです。

パラメーターを設定(書き込み)する際の書式は以下のとおりです。

Python:

m1.パラメーター名 = 設定値

コマンド:

cgstep パラメーター名 -w 設定値

設定したパラメーターはモータードライバーICに保存され、電源を落とすまで保持されます。また、パラメーター名はモータードライバーIC TMC5240のデータシートに準拠しています。

また、パラメーターを読み出すこともできます。これはモーターの状態、現在の位置などを確認することに使います。パラメーター読み出しの書式は以下のとおりです。

Python:

変数 = m1.パラメーター名

コマンド:

cgstep パラメーター名

電流の最大値の設定

ここからは実際に、モーターを動かす際に必須のパラメーターを以下を順に設定していきます。

ifsパラメーターで電流の最大値[A]を設定します。モータードライバーはこの電流値を超えないようにモーターを駆動します。通常は使用するモーターの定格電流値に合わせてください。0.125 – 3.0の範囲で指定します。

例えば、0.5Aに設定するには以下のようにします。

Python:

m1.ifs = 0.5

コマンド:

cgstep ifs -w 0.5

なお、定格を下回る設定でもトルクは下がりますが動作させることは可能です。また、3Aなどの大きな値に設定した場合でも、電源電圧の供給を超える電流は流れません。具体的には以下の式以上の電流は流れません。

電流の最大値/相[A] = 電源電圧[V] / モーター抵抗[Ω]

回転速度の設定

vmax_rpmで回転速度を設定します。今回の例では60rpmとします。コマンドの場合は、-sオプションに続けて使用モーターの1回転のフルステップ数を指定します。省略すると200になります。

Python:

m1.vmax_rpm = 60

コマンド:

cgstep vmax_rpm -w 60 -s 200

上記のvmax_rpmは、指定したrpmの値からモータードライバーICで使用する回転速度vを計算し、その値をvmaxパラメーターに設定しています。rpmで指定したほうが直感的ですが、以下のように直接vmaxを指定しても構いません。200ステップ/回転のモーターなら, 68720で60rpmになります。

Python:

m1.vmax = 68720

コマンド:

cgstep vmax -w 68720

amaxで加速の速さを、dmaxで減速の速さを設定します。今回の例では500とします。これは1秒で速度v=47684(200ステップ/回転のモーターで41.6rpm)に達する加速になります。減速も同様です。

Python:

m1.amax = 500
m1.dmax = 500

コマンド:

cgstep amax -w 500
cgstep dmax -w 500

電圧印加

次に以下を実行してモータードライバーの出力をONにし、モーターに電圧を印加します。なお、enableはパラメーターではなくcgstepのオペレーション名です。そのため、パラメーターと若干書式が異なり、Pythonでは関数なので「()」が付きます。コマンドでは「-w」は不要です。

Python:

m1.enable()

コマンド:

cgstep enable

以上で必須パラメーターの設定は完了で、モーターを動かす準備が整いました。これらの必須パラメーターはどのような設定でモーターを動かす場合も必要になります。




モーターを指定位置まで回転させる

モーターを指定位置まで回転させるには、xtargetパラメーターに目標位置を設定します。

位置の初期値は0で、マイクロステップ数で指定します。モーターの1ステップ(フルステップ)は256のマイクロステップに分割されます。つまり、200ステップ/回転(フルステップ角1.8°)のモーターの場合、

200 × 256 = 51200

となり、xtargetに51200を設定するとちょうど1回転することになります。今回の例では3回転する153600にします。

位置は+/-2147483647の範囲で指定することができ、マイナスだと反対方向に回転します。

Python:

m1.xtarget = 153600

コマンド:

cgstep xtarget -w 153600

5秒程度かけてモーターが3回転して停止すれば成功です!

モーターの位置、速度を取得

xactual、vactualを読み出すことでモーターの現在位置、現在の速度を取得できます。すでにモーターが回転し終わって停止していれば、位置が153600、速度が0となるはずです。

Python:

print('現在の位置:', m1.xactual)
print('現在の速度:', m1.vactual)

コマンド:

cgstep xactual
cgstep vactual

また、position_reachedを読み出すことでモーターがxtargetで指定した位置に到達したか分かります。到達している場合は1、そうでない場合は0を返します。

Python:

print(m1.position_reached)

コマンド:

cgstep position_reached

モーターを元の位置に戻す

xtargetに0を設定すると、逆回転して最初の位置に戻ります。

Python:

m1.xtarget = 0

コマンド:

cgstep xtarget -w 0

目標に到達するまで待つ

xtargetを設定する場合、モーターが動き始めた時点で制御が戻るため、モーターが目標に到達するまでの間に他の処理が可能です。一方、movetoオペレーションを使うと、目標に到達するまで待機し、到達すると制御を戻します。なお、movetoはcgstepのオペレーションの1つで、パラメーターではありません。

Python:

m1.moveto(153600)
m1.moveto(0)

コマンド:

cgstep moveto -w 153600
cgstep moveto -w 0



電圧印加停止

disableでモータードライバーの出力をOFFにし、モーターへの電圧を停止できます。(enableの逆の動作)

Python:

m1.disable()

コマンド:

cgstep disable

Python対話モード終了

以上で本記事のサンプルコードは終了です。Pythonの対話モードを使用していた場合はexit()で終了します。

Python:

exit()

リセット(パラメーター初期化)

設定した位置、速度やその他パラメーターの情報は、モータードライバーICに保持され続けます(Pythonを終了しても保持されます)が、以下のいずれかを満たすと初期値に戻ります。

  • Raspberry Piの電源が切れる (電圧が印加されない状態)
  • RPZ-Stepperの電源(J2コネクタ)が切れるか、電圧が4.5Vを下回る
  • リセットスイッチSW1を押して離す

リセットスイッチSW1を押すことで、意図的に初期値に戻すことができます。サンプルコードがうまく動作しない場合は、以前設定したパラメーターが原因の可能性がありますので、リセットをお試しください。

リセットはモーターが停止している状態で行ってください。

まとめ

RPZ-StepperとRaspberry Pi(ラズパイ)を使ってステッピングモーターを指定位置まで回転させる基本手順を解説しました。制御ソフトウェアcgstepの使い方と、必須のパラメーターについても理解していただけたと思います。RPZ-Stepperには他にも多くの機能があり、それらの解説記事も参考にしてください。

TSL2572センサーとラズパイで明るさ(照度)を測定する

Indoor Corgiのセンサー制御ソフトウェア「cgsensor」を利用して、TSL2572センサーで明るさを測定する方法を解説します。コマンドラインツールを使って1行もコードを書かずに測定ができるほか、Pythonパッケージを使えばご自身のプログラムから簡単にセンサーを制御できます。

ラズパイと赤外線でエアコンの自動ON、消し忘れ機能を実現

普段、エアコンを消し忘れてしまい夜間つけっぱなしにしてしまったり、冬場に朝エアコンを入れても暖かくなるのに時間がかかったことは無いでしょうか?本記事では、Raspberry Piと拡張基板を利用して、毎晩のエアコン消し忘れ機能、および朝に温度が低い場合に自動で暖房を入れる機能を実現します。

RPZ-PowerMGR (Raspberry Pi/Jetson Nano用 電源管理/制御/RTC拡張基板)

スイッチで電源ON/OFF、指定時刻に電源ON/OFF、シャットダウン後自動電源OFFを可能にする拡張基板です。Raspberry Pi(ラズパイ)やJetson Nanoの電源の課題を解決し、省電力運用を可能にします。RTCで電源OFF時も時刻を保持します。USB Type-C端子を搭載し、モバイルバッテリーでも利用できます。