ラズベリーパイでステッピング・モータ (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+黒

 今回入手したモデルは一番下の接続でした。