ラズベリーパイでステッピング・モータ (1) 駆動
■3Dプリンタで一気に普及
ステッピング・モータはパルス・モータとも呼ばれ、産業界では位置決め用途で使われます。Arduinoで制御する普及帯の3Dプリンタに使われるX、Y軸の移動用モータに中トルクのステッピング・モータが使われたので、今ではアマゾンでも安価に購入できます。
●専用のICを使うと制御は簡単
モータは電源をつないでドライブ・デバイスをONすれば回ります。効率よくON/OFFするためにMOS FETを四個使ったHブリッジが使われます。この駆動形式では、回る方向も簡単に変えられます。しかし、ON/OFFのタイミングは微妙なので、過熱防止回路などを含んだ専用のICが用意されています。
東芝のステッピング・モータ・コントローラTB6600で検索すると、たくさんの制御ボードが見つかります。その中の一つを購入しました。ICのもつ機能のうち、電流の設定が外部からできないですが、それ以外は端子に出ています。入手した制御ボードの端子名です。
◆モータ側の接続端子
つなぐもの | 端子名 |
---|---|
8から32Vまでのモータ用電源 | 32V |
モータ電源のGND | GND |
A相 | A+ |
A- | |
B相 | B+ |
B- |
◆コンピュータ側の接続端子
TB6600のロジック回路の電圧は、High=2~5.5V、Low=-0.2~0.8Vです。
- CW Clock Wise 時計方向の回転
- CCW Counter Clock Wise 反時計方向の回転
端子名 | つなぐもの |
---|---|
+5V | ロジック回路の電源 |
CLK | 駆動の基準となるクロック。最高200kHz |
CW | 方向。CW=1、CCW=0 |
EN | イネーブル |
◆マイクロステップ
基板上にあるDIPスイッチで、回転角をより細かくできます。M1,M2,M3=1もしくは0はスタンバイ・モードです。ステップを細かくするほど、同じクロックならば回転速度は低下します。
M1 | M2 | M3 | マイクロステップ |
---|---|---|---|
0 | 0 | 1 | 1 |
0 | 1 | 0 | 1/2A |
1 | 0 | 0 | 1/2B |
1 | 0 | 1 | 1/4 |
1 | 1 | 0 | 1/16 |
制御ボードにはGNDが+32Vの横にしかありません。ロジックのGNDと共通なので、ラズベリーパイのGNDと接続します。
●使用するステッピング・モータはNEMA17
NEMA17は2 相ステッピング・モータで、バイポーラ駆動用です。といっても数多くの相当品があります。いずれも、
- 保持トルク;約45Ncm
- 電流;約1.5A(1相)
- シャフト径;5mm
などが同じで、取り付け穴の寸法が共通です。コントローラのTB6600で駆動できる範囲のスペックです。
次のように接続します(コラム参照)。
●プログラム
ラズベリーパイのロジック信号レベルは3.3Vです。制御ボードでは+5Vと書かれた端子があります。ここへはGPIOの1番ピンから3.3Vをつなぎます。制御ボードの入力信号は100kΩでプルダウンされています。
モータの電源は24V/1.5Aをつなぎました。制御ボードの電流設定半固定抵抗の位置を確認します。真ん中12時の位置から10時の位置へ回し、電流値を下げておきます。各ボードの配線にはジャンパ線を利用しました。製品によっては線材が細く、かつ酸化しているものもよくあるので、アンペア単位の電流を流せません。
ラズベリーパイの電源を入れ、モータの電源を入れます。ENがLowの間、モータへ駆動信号は出ません。次のプログラムは、5秒時計方向、そのあと反時計方向に回転した後止まります。
プログラムは終了しても電流は流れ、モータが高温になります。使わないときは、DIPスイッチを全部OFFにしてスタンバイ・モードにするか、モータの電源をOFFにします。
#!/usr/bin/python
import time
import RPi.GPIO as GPIO
ENable = 4 #07pin
CW = 17 #11pin# 1=CW,0=CCW
CLK = 18 #12pin
#MicroStep M1=1 M2=1 M3=0 ...1/16
#init
GPIO.setmode(GPIO.BCM)
GPIO.setup(ENable , GPIO.OUT)
GPIO.output(ENable , 0)
GPIO.setup(CW , GPIO.OUT)
GPIO.setup(CLK , GPIO.OUT)
pwm = GPIO.PWM(CLK, 100) #100Hz Max 200kHz
pwm.start(50) #duty 50%
def forward(speed):
GPIO.output(CW , 1)
GPIO.output(ENable , 1)
print ("forward ",speed)
pwm.ChangeFrequency(speed/3) #
time.sleep(0.1)
pwm.ChangeFrequency(speed)
def backwards(speed):
GPIO.output(CW, 0)
GPIO.output(ENable , 1)
print ("backwards",speed)
pwm.ChangeFrequency(speed/3)
time.sleep(0.1)
pwm.ChangeFrequency(speed)
def Stop():
GPIO.output(ENable , 0)
pwm.stop()
#main
try:
print ("start")
forward(8000) #1000 is 1kHz
time.sleep(5)
backwards(2000)
time.sleep(5)
Stop()
GPIO.cleanup()
except:
print ("Done!")
Stop()
GPIO.cleanup()
●電流波形
マイクロステップ=1の波形です。上の青色はB-の電圧、下の赤色は電流です。
拡大しました。
マイクロステップ=1/16のときの波形です。
拡大しました。
●問題点
Arduinoでつないだときの電流波形です。特に異常な音は出ず、スムーズに回転します。黄色はA相、緑はB相の電流です。スケールは同じではありません。
ラズパイの波形です。周期的にパルスが抜けたり、電圧レベルが瞬間に止まることがあります。このときに、コトという振動音が出ます。RPi.GPIO以外にgpiozeroやwiringpi(softPWM)ライブラリを使いましたが、いずれも周期的なパルスの抜けが観測されました。RPi.GPIOはそれに加えて、電圧の変化のしない部分が発生するので、特にコトという音が大きいように感じます。
コラム ステッピング・モータNEMA17の信号線
市販のNEMA17にはたくさんのコンパチブル製品があります。トルクなども異なりますが、一番の問題は信号です。バイポーラなので、2組のコイルがあります。通常A相、B相と呼びます。インターネットの検索で調べました。
本体から出ているケーブルに3種類の方式があるようです。
- 直接
- 4ピンのコネクタ
- 6ピンのコネクタ
ケーブルの色も何種類かあるようです(NC;接続なし)。
- 4ピン・コネクタ A+黒、A-緑、B+赤、B-青
- 4ピン・コネクタ A+緑、A-灰、B+黄、B-赤
- 6ピン・コネクタ A-緑、NC、B-青、A+黒、NC、B+赤
- 6ピン・コネクタ B-青、NC白、A-緑、B+赤、NC黄、A+黒
今回入手したモデルは一番下の接続でした。