Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

RasPiでステッピングモーターを動かす その3:二つ動かす

Raspberry Pi 3BにはハードウェアPWMが実装されています。
2チャンネル各2ピンが割り当てられているので合計4ピンあるわけですが、
同じチャンネルのピンは同時に駆動できません。
たとえばXY平面で斜めに動かしたいなら、XとYはCH1とCH2に分離する必要があります。

ハードウェアPWMのCH0はBCM12,18、CH1はBCM12,19に割り当てられています。

さてこのまま馬鹿正直に以下の様に割り当てると……同時には動きません。

import RPi.GPIO as GPIO

# import the library
from RpiMotorLib import RpiMotorLib
    

# 分解能を設定する MS1 ~ MS3はHIGH固定 = 1/16
# 方向とステップを指定するGPIOピンをBCNで指定
GPIO_pins = (14, 15, 18)
direction_A = 20
step_A        = 12  #CH0
direction_B = 21
step_B        = 13  #CH1


# ステッピングモーターのインスタンスを作成
mymotor_A = RpiMotorLib.A4988Nema(direction_A, step_A, GPIO_pins, "A4988")
mymotor_B = RpiMotorLib.A4988Nema(direction_B, step_B, GPIO_pins, "A4988")


# 駆動。FULLの場合200ステップで1周なので100ステップで半周。
mymotor_A.motor_go(False, "Full" , 100, .01, False, .05)
mymotor_B.motor_go(False, "Full" , 100, .01, False, .05)

#使い終わったらお片づけ
GPIO.cleanup()

というわけで……美しくないですが、for文でやる方法でやってみます。
先ほどの駆動の部分を以下の様に変更。

# 駆動。FULLの場合200ステップで1周なので100ステップで半周。
for i in range(100):
  mymotor_A.motor_go(False, "Full" , 1, .01, False, .05)
  mymotor_B.motor_go(False, "Full" , 1, .01, False, .05)

無事、(見た目には)二つ同時に動いている風になりました。