😸

ステッピングモーターNema17とモータードライバーA4988の接続方法

2024/03/30に公開

久しぶりに使うと、色々忘れているのでメモ

Nema17

3Dプリンタとかで使われているステッピングモーターです。

AliExpressでも買えますが、保証面を考えるとAmazonのほうが確実
(しかし高くなったよな・・・)
https://amzn.to/3PEidmv

A4988

こちらもAmazonで購入可能
https://amzn.to/3Q5GjqD

配線図

回路では以下のようになっています

A4988をひっくり返すと、以下のような配置になっているはずです。

私は実験の時(ブレッドボードで繋ぐ時)は、わかりやすいようにA4988をひっくり返して使っています。
Nema17に付属しているジャンパー線は[赤・青・緑・黒]の並び順になっています。
以下のようにXHコネクタの爪を外側にすると並び順そのままにA4988と繋ぐことができます。

もちろん実基板にA4988を取り付ける際は正面を上にするでしょうから、XHコネクタの爪は内側に配置すると良いでしょう

サンプルコード

以下のコードでは1分間の回転数を60回転(1秒で1回転)になるようにしています。

Nema17ではデフォルトのステップ数が200ですから、1秒で200ステップ、つまりステップの間隔時間は0.5秒になります。

経験上、ステップの間隔時間をこれより短くするとモーターが脱調します。

それよりもゆっくり回転させたい場合は、ステップ角を小さく刻むか、ギア比で調整しましょう。

from machine import Pin
from utime import sleep

led = Pin(25,Pin.OUT)

dirPin = Pin(0,Pin.OUT)
stepPin = Pin(1,Pin.OUT)

power = True
rotateForMin = 60 # 1分あたりの回転数。60を下回ると脱調する可能性大

sleepPin = Pin(2,Pin.IN,Pin.PULL_UP)
incPin = Pin(3,Pin.IN,Pin.PULL_UP)
decPin = Pin(5,Pin.IN,Pin.PULL_UP)

def increment(pin):
    global speedState
    speedState = speedState +1

def decrement(pin):
    global speedState
    speedState = speedState -1


Pin.irq(incPin, trigger=Pin.IRQ_FALLING, handler=increment)
Pin.irq(decPin, trigger=Pin.IRQ_FALLING, handler= decrement)


# ステッピングモータの設定
stepsPerRevolution = 200  # 1回転に必要なステップ数
stepDelay = 60 / (rotateForMin * stepsPerRevolution) / 2  # ステップの間隔時間を計算 (秒)

dirPin.on()

while True:
    stepPin.on()
    sleep(stepDelay)
    stepPin.off()
    sleep(stepDelay)

もちろんsleepではなくマイコンのPWMを使うこともできます。
(というか、PWMを使ったほうが良い)

PWMの設定ではデューティ比は50%に設定します。
ラズパイpicoの場合、デューティ比50%はduty_u16を使って2**16/2で設定します。
(割り算でfloat型になるので、int型に変換しましょう)

# stepPinはGP1を設定
pwm = PWM(Pin(1),freq=400,duty_u16=int(2**16/2))

sleep(2)
# ストップさせる
pwm.deinit()

sleep(2)
# 再び動かす
pwm.init(freq=400,duty_u16=int(2**16/2))

Discussion