Raspberry Pi講座 ステッピングモータ(28BYJ-48)

前回『Raspberry Pi講座⑩ モータドライバ(DRV8835)』でモータドライバ(DRV8835) 300円を用いてステッピングモータを制御しました。今回はアマゾンで購入した28BYJ-48 220円についてきたULN2003AGPをもちいて28BYJ-48を制御してみたいと思います。基本的にDRV8835もULN2003AGPも複数チャンネルのトランジスタなのでどちらでも同じような制御ができますが、220円でステッピングモーターとドライバーが購入できるので問題がなければこちらを使っていこうと思います。

配線
Raspberry PiとULN2003AGPの接続
ラズパイ 5V(2番ピン)      :           + ULN2003AGP 
ラズパイ GND(6番ピン)     :           - ULN2003AGP 
ラズパイ GPIO4(7番ピン)     :        IN1 ULN2003AGP 
ラズパイ GPIO17(11番ピン)     :     IN2 ULN2003AGP
ラズパイ GPIO27(13番ピン)     :     IN3 ULN2003AGP
ラズパイ GPIO22(15番ピン)     :     IN4 ULN2003AGP

ULN2003AGPと28BJY-48の接続
専用のソケットとコネクタがありますので、そのままつないでください。




サンプルプログラム(c28byj48.py)
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
from time import sleep

class C28BYJ48:
    """コンストラクタ"""
    def __init__(self, IN1, IN2, IN3, IN4):
        #Setting GPIO
        GPIO.setmode(GPIO.BCM)
        self.mPin = [IN1, IN2, IN3, IN4]     #GPIO Number
        for pin in range(0, 4):
            GPIO.setup(self.mPin[pin], GPIO.OUT)

        #Setting related Sequence
        #1step angle = 1/4096[deg]
        self.mNSeq = 0      #Sequence number from 0 to 7
        self.mSeq = [[1,0,0,1],[1,0,0,0],[1,1,0,0],[0,1,0,0],[0,1,1,0],[0,0,1,0],[0,0,1,1],[0,0,0,1]]

        #default speed = max speed
        self.SetWaitTime(0.001)

    """ピンのHigh or Lowを設定する"""
    def SetPinsVoltage(self, NSeq):
        self.mNSeq = NSeq
        for pin in range(0, 4):
            if self.mSeq[self.mNSeq][pin]!=0:
                GPIO.output(self.mPin[pin],GPIO.HIGH)
            else:
                GPIO.output(self.mPin[pin],GPIO.LOW)

    """ウエイト時間を設定する"""
    def SetWaitTime(self, wait):
        if wait < 0.001:
            self.mStep_wait = 0.001
        elif wait > 0.1:
            self.mStep_wait = 0.1
        else:
            self.mStep_wait = wait

    """CWに1Step移動する"""
    def Step_CW(self, step, wait):
        self.SetWaitTime(wait)
        for i in range(0, step):
            if self.mNSeq >= 7:
                self.SetPinsVoltage(0)
            else:
                self.SetPinsVoltage(self.mNSeq+1)
            sleep(self.mStep_wait)

    """CCWに1Step移動する"""
    def Step_CCW(self, step, wait):
        self.SetWaitTime(wait)
        for i in range(0, step):
            if self.mNSeq <= 0:
                self.SetPinsVoltage(7)
            else:
                self.SetPinsVoltage(self.mNSeq-1)
            sleep(self.mStep_wait)

    """終了処理"""
    def Cleanup(self):
        GPIO.cleanup()

"""メイン関数"""
if __name__ == '__main__':
    StepMoter = C28BYJ48(IN1=4, IN2=17, IN3=27, IN4=22)
    #Main loop
    try:
        while True:
            StepMoter.Step_CW(4096,0.001)
            sleep(0.5)
            StepMoter.Step_CCW(4096,0.001)
            sleep(0.5)

    except KeyboardInterrupt  :         #Ctl+Cが押されたらループを終了
        print("\nCtl+C")
    except Exception as e:
        print(str(e))
    finally:
        StepMoter.Cleanup()
        print("\nexit program")
サンプルプログラム(c28byj48.py)の実行
『$sudo python c28byj.py』で実行し、動画のようにステッピングモーターが動けば成功です。






ċ
c28byj48.py
(2k)
1000gou,
2017/06/30 7:44
Comments