ステッピングモーターの原理
前回の記事で紹介したモーターは、電気エネルギーを回転運動に変換するように作られたものです。シャフトの回転速度は制御しやすいですが、角度にして何度回転させるかという制御や、正確に何回転させるといった制御は難しく、精度を求めるのも難しいという問題があります。
「正確に〇度回転させる」場合や「正確に何回転させる」場合には、ステッピングモーターを使用します。ステッピングモーターは正確な角度で回転させることができ、停止した位置でブレーキをかけておくこともできます。
こうした回転制御を行うために、ローターの永久磁石とステーターの電磁石が歯車のように細かく作られていて、ローターの磁石とステーターのコイルとは円周上の同じ位置にはなく、わずかにずらして配置されています。
ステーターのコイルのうち一つに電流が流れると、ローターの磁石を引き寄せます。このコイルの電流を切り、隣のコイルに電流を流すと、ローターはコイル1つ分回転します。この角度を「ステップ」と呼びます。
コイルに電流を流すタイミングは正確に制御しなくてはならないため、ステッピングモーターの制御にはステッピングモーター専用のモータードライバーを使用します。「どちらの方向に」「何ステップ」動かすかを指示すれば、自動でステッピングモーターを動かすための信号を生成してくれます。
ステッピングモーターに過負荷がかかると、コイルと永久磁石のブレーキ力ではシャフトの位置を保持することができず、位置がずれてしまうことがあります。ステーターのコイルは通常4つおきに電流を流して使用するため、次のコイルの位置で再び停止しますが、シャフトの現在の位置は正確には分からなくなってしまいます。
ステッピングモーターは比較的安価に製造でき、低コストで高精度な位置決め制御を行えます。近年普及している家庭用の3Dプリンターなどには安価なステッピングモーターがよく用いられます。小型のCNC加工機を製作する場合にも活用できます。
設計はシンプルなものですが、ステッピングモーターのトルクは強力で、ブレーキも強力にかけられるため、精度のよい位置決め制御が可能になります。また、高速回転させても位置決め精度が落ちないのも特徴の一つです。
制御モードとモーターそのものの構造によって回転角度の制度が自動的に決まるため、マイコンなどにシャフトの現在位置をフィードバックする機構がなくとも、高い位置決め精度を長期間にわたって実現することができます。
基準点さえ分かっていれば、どちらの方向に何ステップ動かしたかという情報からシャフトの位置を計算できるからです(基準点からどのくらい移動したかによって現在位置を求める方式を「インクリメンタル」といいます。)。基準点は、例えばモーターを動かしてある位置に到達したときに動作するようにスイッチを設置し、スイッチが押されたらその位置を基準点とする、などの方法で決定します。
ラズパイとA4988の接続方法
Raspberry Piで動作させるには、図3のように接続します。
ステッピングモーターと、ステッピングモーター専用のモータードライバー(ここではA4988と呼ばれるICを使用したもの)、入力電圧の平滑化用に100μFの電解コンデンサを使用します。使用するステッピングモーターとモータードライバーの仕様に合わせて、電源電圧などは適宜調整してください。
今回使用したモーターはRaspberry Piから供給される電源では動作できないため、別に9Vの電源ユニットを用意します。この9VはRaspberry Piの動作電圧をはるかに超える電圧で、Raspberry Piに入力すると壊れてしまう可能性がありますので、どのピンにも接続してはなりません。
Raspberry Piとモータードライバーは、次の表のように接続します。
モーターの電線とモータードライバーの出力との対応はモーターやモータードライバーの仕様を確認して決めます。
電解コンデンサは極性が決まっているので注意してください。
名前 | モーター ドライバー | Raspberry Pi GPIO | ブレッドボード |
モーター電源 | VMOT | – | 電源ユニット+極 電解コンデンサ+極 |
GND | GND | – | 電源ユニット-極 電解コンデンサ-極 |
モーター1 | 2B | – | – |
モーター2 | 2A | – | – |
モーター3 | 1A | – | – |
モーター4 | 1B | – | – |
ロジック電源 | VDD | 3.3V | – |
GND | GND | GND | – |
リセット | RST | – | RSTとSLPを 直接つなぐ |
スリープ | SLP | – | RSTとSLPを 直接つなぐ |
ステップ | STEP | GPIO 21ピン | – |
回転方向 | DIR | GPIO20ピン | – |
サンプルプログラム
以下のpythonプログラムで、ステッピングモーターが動作します。
from time import sleep import RPi.GPIO as GPIO direction = 20 step = 21 GPIO.setmode(GPIO.BCM) GPIO.setup(direction, GPIO.OUT) GPIO.setup(step, GPIO.OUT) GPIO.output(direction, 1) step_count = 200 delay = .001 for x in range(step_count): GPIO.output(step, GPIO.HIGH) sleep(delay) GPIO.output(step, GPIO.LOW) sleep(delay) sleep(.5) GPIO.output(direction, 0) for x in range(step_count): GPIO.output(step, GPIO.HIGH) sleep(delay) GPIO.output(step, GPIO.LOW) sleep(delay) GPIO.cleanup()
このプログラムを実行すると、モーターは最初に左に回転し、次に右に回転して停止します。使用するモーターによってどのくらい回転するかは変わってきます。
このプログラムでは200ステップずつ動かしているので、1周200ステップのモーターを使用した場合にはそれぞれ1周ずつ回転します。モータードライバーの「STEP」端子に入力される電圧が「LowからHigh」に切り替わったときに、1ステップ進む動作をします。(信号がLowからHighに切り替わるタイミングを「立ち上がり」、逆にHighからLowに切り替わるタイミングを「立ち下がり」といいます。 こうした信号の切り替わりを総称して「エッジ」と呼びます。)
回転する方向は「DIR」端子の入力がHighかLowかによって決まります。このように、プログラムは非常にシンプルなものになっています。シャフトに粘着テープの「旗」を取り付けると、ステッピングモーターの回転の様子がより分かりやすくなります。
ステッピングモーターを接続したり切り離したりする際は、必ずプログラムの動作を止めてから行ってください。
コメントを残す