物づくりの小部屋

個人で活躍するクリエーターになりたい現役エンジニアの行動記録

【ラズバイ】Raspberry Pi4でステッピングモータを回す①(ユニポーラ式:28BYJ-48)

f:id:zaloha8:20220109174722j:plain

こんにちは。alohaです。

 

Raspberry Pi4でステッピングモータを回すテストを行ったので、結果を書き残しておきます。

 

ステッピングモータの特徴として、

          ・角度の制御が可能

          ・連続回転が可能

という特徴があり、様々な用途で使用されています。

 

ステッピングモータには、ユニポーラ方式とバイポーラ方式がありますが、今回テストを行ったのはユニポーラ方式です。

 

<必要部品(Raspberry Pi4本体以外に必要なもの)>

  • 28BYJ-48 ULN2003ドライバーボードセット   1セット
  • ACアダプタ(DC5V, 2.3A)           1個
  • ジャンパー線                   数本

f:id:zaloha8:20220109172410j:plain

 

<ユニポーラ式ステッピングモータ>

今回テストするユニポーラ式ステッピングモータ(28BYJ-48)の回路図は下の図の通りです。2つあるREDの線は1本にまとまっているため、信号線としては5本あります。

f:id:zaloha8:20220109091628j:plain

 

REDの線がGNDで他の4本の信号線(PINK, ORANGE, YELLOW, BLUE)からパターンの決まった電圧信号を入力する事でモータを回転させる事ができます。

 

<電圧信号の入力パターン>

電圧信号の入力パターンは、1相励磁、2相励磁、1-2相励磁等があり、入力パターンはそれぞれ以下の通りです。

 

① 1相励磁(最も単純な方式)

f:id:zaloha8:20220109131652j:plain

② 2相励磁(滑らかに動作)

f:id:zaloha8:20220109131152j:plain

 

③ 1-2相励磁(さらに滑らかに動作します)

f:id:zaloha8:20220109132926j:plain

 

<正回転、逆回転の切替え>

ステッピングモータの正回転、逆回転を切換えるには、例えば1相励磁の場合は下の図の様な電圧入力パターンにします。

f:id:zaloha8:20220109135926j:plain

 

<回転速度の切替え>

ステッピングモータの回転速度を変更するには、例えば1相励磁の場合は下の図の様に入力電圧の幅を変更します。

入力電圧の幅を狭くするとモータは高速で回り、広くすると低速で回りますが、設定できる幅には限界があり、限界値以下の(もしくは以上の)幅を設定するとモータは回らなくなります。

f:id:zaloha8:20220109142453j:plain



<回路図>

Raspberry Pi4でステッピングモータ(28BYJ-48)を回す場合の回路図は下の図の通りです。

f:id:zaloha8:20220109143607j:plain

組み立てると下の写真の様になります。

シャフトの回転角度を分かりやすくするため、3Dプリンタで作成した▲印付きの円盤を付けています。

f:id:zaloha8:20220109172820j:plain

 

<動作プログラム>

ステッピングモータ(28BYJ-48)を回すPythonプログラムとして、

正回転(反時計回り1周)→ 逆回転(時計回り1周)を行うプログラムを作成しました。

 

モータの仕様では、64パルスでモータのシャフトが5.625°回転する仕様ですが、これは1-2相励磁の場合です。1相励磁、2相励磁の場合は 半分の32パルスでモータのシャフトが5.625°回転します。

 

モータのシャフトを1回転(360°)させる場合、Raspberry Pi4側から出力するパルス数は以下の式で計算できます。

 

【1相励磁、2相励磁の場合】

パルス数=\frac{360}{(5.625/32)}=2048

【1-2相励磁の場合】

パルス数=\frac{360}{(5.625/64)}=4096

 

 

・1相励磁 or 2相励磁でステッピングモータを回すプログラム

(29, 30行目で1相励磁 or 2相励磁のどちらかを選択します)

#coding:utf-8

#GPIOライブラリをインポート
import RPi.GPIO as GPIO

#timeライブラリをインポート
import time

#collectionsライブラリのdequeオブジェクトをインポート
from collections import deque

#ピン番号の割当方式を「コネクタピン番号」に設定
GPIO.setmode(GPIO.BOARD)

#使用するピン番号を代入
IN_1=8    #BLUE
IN_2=10   #PINK
IN_3=16   #YELLOW
IN_4=18   #ORANGE

#各ピンを出力ピンに設定し、初期出力をローレベルにする
GPIO.setup(IN_1,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN_2,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN_3,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN_4,GPIO.OUT,initial=GPIO.LOW)

#出力信号パターンのリストを作成
#(1相励磁 or 2相励磁どちらかを選択)
#sig = deque([0,1,0,0])        #1相励磁
sig = deque([1,1,0,0])       #2相励磁

#回転させる角度をdegで入力
ang = 360

#角度degをパルス数に換算
p_cnt = int(ang / (5.625 / 32))

#回転方向を定義(-1が時計回り、1が反時計回り)
dir = 1

#パルス幅を変数に入力
#値が小さい程回転速度は上がる。0.002より小さい値にすると回転しない
p_wid = 0.002


#時計回りに1回転、反時計回りに1回転する
for i in range(0,2):
    #パルス出力開始
    for j in range(0,p_cnt):
        
        #出力信号パターンを出力
        GPIO.output(IN_1, sig[0])
        GPIO.output(IN_2, sig[1])
        GPIO.output(IN_3, sig[2])
        GPIO.output(IN_4, sig[3])
        
        #パスル幅分待機
        time.sleep(p_wid)
        
        #出力信号パターンをローテート
        sig.rotate(dir)
    #回転方向を逆向きにする
    dir = dir * -1
    #1秒待機
    time.sleep(1.0)
    #カウントアップ
    i += 1


#メッセージを表示
print("End of program")
    

#GPIOを開放
GPIO.cleanup()

 

 

・1-2相励磁でステッピングモータを回すプログラム

#coding:utf-8

#GPIOライブラリをインポート
import RPi.GPIO as GPIO

#timeライブラリをインポート
import time

#collectionsライブラリのdequeオブジェクトをインポート
from collections import deque

#ピン番号の割当方式を「コネクタピン番号」に設定
GPIO.setmode(GPIO.BOARD)

#使用するピン番号を代入
IN_1=8    #BLUE
IN_2=10   #PINK
IN_3=16   #YELLOW
IN_4=18   #ORANGE

#各ピンを出力ピンに設定し、初期出力をローレベルにする
GPIO.setup(IN_1,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN_2,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN_3,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN_4,GPIO.OUT,initial=GPIO.LOW)

#出力信号パターンのリストを作成
sig_1 = deque([0,1,0,0])       #1相励磁
sig_2 = deque([1,1,0,0])       #2相励磁

#回転させる角度をdegで入力
ang = 360

#角度degをパルス数に換算
p_cnt = int(ang / (5.625 / 64))

#回転方向を定義(-1が時計回り、1が反時計回り)
dir = 1

#パルス幅を変数に入力
#値が小さい程回転速度は上がる。0.001より小さい値にすると回転しない
p_wid = 0.001


#時計回りに1回転、反時計回りに1回転する
for i in range(0,2):
    #パルス出力開始
    for j in range(0,p_cnt):
        
        if(j % 2 == 0):
            #出力信号パターンを出力
            GPIO.output(IN_1, sig_2[0])
            GPIO.output(IN_2, sig_2[1])
            GPIO.output(IN_3, sig_2[2])
            GPIO.output(IN_4, sig_2[3])
                        
            #パスル幅分待機
            time.sleep(p_wid)
            
            #出力信号パターンをローテート
            sig_2.rotate(dir)
        else:
            #出力信号パターンを出力
            GPIO.output(IN_1, sig_1[0])
            GPIO.output(IN_2, sig_1[1])
            GPIO.output(IN_3, sig_1[2])
            GPIO.output(IN_4, sig_1[3])
                        
            #パスル幅分待機
            time.sleep(p_wid)
            
            #出力信号パターンをローテート
            sig_1.rotate(dir)
            
            
    #回転方向を逆向きにする
    dir = dir * -1
    #1秒待機
    time.sleep(1.0)
    #カウントアップ
    i += 1


#メッセージを表示
print("End of program")
    

#GPIOを開放
GPIO.cleanup()

 

<まとめ>

Raspberry Pi4でステッピングモータ(28BYJ-48)を回すテストを行いました。

単純にモータを回すだけでも電圧信号のパターンについて学ぶ事が多く、とても勉強になります。

電圧信号のパターンの図を眺めるだけではなく、実際にプログラムを作成して動かして見るとより一層理解が深まりますね。

モータを使った物づくりに役立ちそうです。

 

それでは、また。