星期四, 2月 27, 2014

Raspberry Pi 筆記(十二):控制步進馬達

[2014/02/26]
先前寫一篇文章 Arduino筆記(八):控制步進馬達 提到如何用 Arduino 控制步進馬達,這幾天同時有兩三位網友問了相關問題,因此決定用 Raspberry Pi 來執行步進馬達控制方法,也對照一下Arduino的連接圖,轉為Raspberry Pi的線路圖。

今天晚上的實作,發生幾個問題:一開始 ULN2003APG接到 Raspberry Pi的接腳差一格,從pin2 ~ pin5,執行程式的結果就是只能正轉,怎麼樣都不能倒轉;仔細檢查後發現才改回來 pin1~ pin4。執行程式結果還是只能正轉,包括執行 backwards 那段程序也正轉,仔細檢查發現是程式中的接腳順序錯了,a1, a2, b1, b2順序對調,等修正後,終於能正確控制正反轉了。



[步進馬達]

步進馬達的種類依照結構來分可以分成三種:
• 永久磁鐵 PM 式 (permanent magnet type)
• 可變磁阻 VR 式 (variable reluctance type)
• 複合式 (hybrid type)

PM式步進馬達的轉子是以永久磁鐵製成,其特性為線圈無激磁時,由於轉子本身具磁性故仍能產生保持轉矩。

VR式步進馬達的轉子是以高導磁材料加工製成,由於是利用定子線圈產生吸引力使轉子轉動,因此當線圈未激磁時無法保持轉矩,此外,由於轉子可以經由設計提高效率,故VR式步進馬達可以提供較大之轉矩,通常運用於需要較大轉矩與精確定位之工具機上,VR式的步進角一般均為15°。

複合式步進馬達在結構上,是在轉子外圍設置許多齒輪狀之突出電極,同時在其軸向亦裝置永久磁鐵,可視為PM式與VR式之合體,故稱之為複合式步進馬達,複合式步進馬達具備了PM式與VR式兩者的優點,因此具備高精確度與高轉矩的特性,複合式步進馬達的步進角較小,一般介於1.8°~3.6°之間,最常運用於OA器材如影印機、印表機或攝影器材上。

步進馬達依定子線圈的數目可分成2相,3相,4相及5相式,小型步進馬達以4相式較普遍,高速型步進馬達則以5相式為主。4相步進馬達頂部和底部,兩側是一對,如下圖:
即(相與相)和(相與相 ),同一線圈繞在同一磁極上、兩組線圈所繞的方向相反,只需對其中一組線圈激磁,便可以改變定子磁場的極性,因此不可將A相與-A相 (或B相與-B相 ) 線圈同時激磁。

馬達正轉時,依序從( )改變線圈磁性,即可讓步進馬達正轉,如下圖:




馬達反轉時,依序從( )改變線圈磁性,即可讓步進馬達反轉,如下圖:


[材料]

• 麵包板 x 1
• Raspberry Pi Model B主板 x 1 (使用無線網卡)
• ULN2003APG x 1
• 步進馬達 x 1
• 連接線 x N條

[線路連接與電路圖]

• Pi Pin2接到麵包版 + 端,再接到步進馬達紅色線。
• Pi Pin6接到 ULN2003APG(以下簡稱2003) Pin8(GND),Pi Pin8(GPIO14)接到 2003 Pin1(IN1),Pin10(GPIO15)接到 2003 Pin2(IN2),Pin11(GPIO17)接到 2003 Pin3(IN3),Pin12(GPIO18)接到 2003 Pin4(IN4)。
• 步進馬達藍色線接到 2003 Pin14(OUT3),黃色線接到 2003 Pin13(OUT4),橘色線接到 2003 Pin15(OUT2),粉紅色線接到 2003 Pin16(OUT1)。

上面這樣說明是不是看到眼都花了,整理成下表,比較容易瞭解:

• ULN2003APG與步進馬達連接線路
ULN2003APG
Raspberry Pi
步進馬達
Pin 8  (Ground)
Pin 6 (Ground)

VCC   (5V)
Pin 2 (3.3V)
紅色線
Pin1 (IN1)
Pin8 (GPIO14)

Pin2 (IN2)
Pin10 (GPIO15)

Pin3 (IN3)
Pin11 (GPIO17)

Pin4 (IN4)
Pin12 (GPIO18)

Pin14 (OUT3)

藍色
Pin13 (OUT4)

黃色
Pin15 (OUT2)

橘色
Pin16 (OUT1)

粉紅色


[程式]

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

a1_pin = 14
a2_pin = 15
b1_pin = 17
b2_pin = 18

GPIO.setup(a1_pin, GPIO.OUT)
GPIO.setup(a2_pin, GPIO.OUT)
GPIO.setup(b1_pin, GPIO.OUT)
GPIO.setup(b2_pin, GPIO.OUT)

forward_seq = ['1010', '0110', '0101', '1001']
reverse_seq = ['1001', '0101', '0110', '1010']

def forward(delay, steps):
    for i in range(steps):
        for step in forward_seq:
            set_step(step)
            time.sleep(delay)

def backwards(delay, steps):
    for i in range(steps):
        for step in reverse_seq:
            set_step(step)
            time.sleep(delay)

def set_step(step):
    GPIO.output(a1_pin, step[0] == '1')
    GPIO.output(a2_pin, step[1] == '1')
    GPIO.output(b1_pin, step[2] == '1')
    GPIO.output(b2_pin, step[3] == '1')

while True:
    set_step('0000')
    delay = raw_input("Delay between steps (milliseconds)?")
    steps = raw_input("How many steps forward? ")
    forward(int(delay) / 1000.0, int(steps))

    set_step('0000')
    steps = raw_input("How many steps backwards? ")
    backwards(int(delay) / 1000.0, int(steps))

[執行結果]



[參考資料]

Raspberry Pi Cookbook by Simon Monk
• The Hobby Electronic:Operation principle of stepper motor
黃兄知識庫
Share:

1 則留言:

  1. 可以問一下 如果是兩相步進馬達 有程式碼嗎

    回覆刪除