静音モードでステッピングモーターの動作音を抑える (Raspberry Pi + RPZ-Stepper)

ステップ角単位で回転するという仕組み上、ステッピングモーターは振動や音が大きくなりやすい特徴があります。RPZ-Stepperは静音モードを搭載しており、特に低速回転時において振動と音を低減できます。静かな環境で動作させるアプリケーションに最適です。

静音モードあり、なしの動作音の比較
更新日 : 2024年1月3日

セットアップ

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

RPZ-Stepper

制御ソフトウェアcgstepの基本的な使い方は以下の記事で解説しています。まだの方は先に確認してください。

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

Pythonでの準備

Pythonは対話モードで解説していきます。Pythonサンプルコードも用意しています。

Pythonの場合、モーター制御クラスのインスタンスを作成します。rpmで速度を指定する場合はsteps_per_revに使用モーターの1回転あたりのステップ数を指定します。省略すると200になります。

Python:

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

静音モードを有効にする

静音モードはen_pwm_modeに1を設定することで有効になります。TMC5240でStealthChop2と呼ばれている機能になります。

Python:

m1.en_pwm_mode = 1

コマンド:

cgstep en_pwm_mode -w 1

pwm_freqでPWM周波数を変更できます。通常は初期値の0から変更不要です。何らかの理由で変更したい場合は以下の表を参考に設定します。

pwm_freqPWM周波数[kHz]
0 (初期値)24.4
136.6
248.8

Python:

m1.pwm_freq = 0

コマンド:

cgstep pwm_freq -w 0

必須の設定をしておきます。電流値ifsを0.5Aとしていますが、お使いのモーターに合わせてください。コマンドで速度を指定する場合は、-sオプションに使用モーターの1回転あたりのステップ数を指定します。省略すると200になります。

Python:

m1.ifs = 0.5
m1.vmax_rpm = 90
m1.amax = 500
m1.dmax = 500
m1.enable()

コマンド:

cgstep ifs -w 0.5
cgstep vmax_rpm -w 90 -s 200
cgstep amax -w 500
cgstep dmax -w 500
cgstep enable



回転させる

xtargetを設定して回転させてみます。静音モードを有効にしたことで、動作音や振動が抑えられているのが分かると思います。

Python:

m1.xtarget = 153600

コマンド:

cgstep xtarget -w 153600

モータードライバーは回転時の負荷や電流に応じて自動的にPWMの設定を最適化するため、ユーザー側で細かい調整は不要です。手動で調整したい場合はTMC5240データシートを参照してください。

一定速度以上で静音モードを解除する

静音モードは低速域では動作音を大きく減らす一方、回転速度が上がると動作音軽減が少なくなるほか、トルクが落ちる特徴があります。そこで、一定速度以上で自動的に静音モードを解除する機能があります。(オプション機能)

この機能を有効にするには, tpwmthrs_rpmを設定します。コマンドで指定する場合は、速度vmaxなどと同様、-sオプションに使用モーターの1回転あたりのステップ数を指定します。省略すると200になります。以下は60rpmを超えると静音モードを無効にする例です。

Python:

m1.tpwmthrs_rpm = 60
m1.xtarget = 0

コマンド:

cgstep tpwmthrs_rpm -w 60 -s 200
cgstep xtarget -w 0

どの程度の回転速度で無効にしたほうが良いかは使用機器によって変わります。200ステップ/回転のモーターの場合、100rpm程度を目安にすると良いと思います。

tpwmthrs_rpmを設定すると、ソフトが指定されたrpmから計算してtpwmthrsパラメーターを設定しています。vmax_rpmを指定すると実際にはvmaxが設定されるのと同様です。tpwmthrsは速度のvmaxと異なり、以下の計算式で求めます。

tpwmthrs = 16777216 ÷ 速度v

200ステップ/回転のモーターの場合、60rpmのとき速度v=68720、tpwmthrs=244となります。rpmで指定する場合はソフトが自動で計算するため気にする必要はありませんが、このような仕組みになっています。

tpwmthrsに0を設定すると静音モードが常に有効な状態(切り替えが無効)に戻ります。

停止時にモーターを固定しない

静音モードで利用可能なもう一つのオプション機能を紹介します。

指定位置で停止している場合、通常ステッピングモーターはその位置で固定される力が働きます。freewheelオプションを使うと、停止時に位置を固定せず外力で回転可能な状態にすることができます。消費電力もカットできます。特に固定する必要がないアプリケーションでご利用ください。

以下の表の通り、freewheelの設定値によって動作が変わります。また、この機能は停止時の電流iholdを最低の0に設定することで有効になります。

freewheel動作
0 (初期値)通常の動作。モーター位置を保持する
1フリーホイール。電流を流さず、モーターが外力で回転する
2パッシブブレーキ。電流を流さず、モーターが外力で回転するがブレーキがかかる

フリーホイールに設定する例です。モーターの位置が固定されなくなるのが分かると思います。

Python:

m1.freewheel = 1
m1.ihold = 0

コマンド:

cgstep freewheel -w 1
cgstep ihold -w 0

なお、外力で回転した場合でもモータードライバー側の現在位置xactualは変わらない(回転したかどうかプログラムからは分からない)点に注意してください。

まとめ

制御ソフトウェアcgstepで、ステッピングモーター振動と音を低減させる方法の解説は以上です。RPZ-Stepperには他にも多くの機能があり、それらの解説記事も参考にしてください。

BME280センサーとラズパイで気温、湿度、気圧を測定する

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

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

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

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

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