星期二, 2月 11, 2014

Raspberry Pi 筆記(七):使用L293D驅動馬達

[2014/02/07]
一般控制DC 馬達驅動時,如果只是單一方向轉動,只要控制其電壓正負極的接腳,就可以控制轉向。如果要有正反轉能力的話,就必須在電路運作中將馬達電壓反向,一般常用的是L293D 這顆 IC,其他還有L298N、TA7257P、SN754410等。一般馬達電流比 Raspberry Pi 控制板大很多,如果直接使用,可能會因為控制板電流輸出過小推不動馬達,或是馬達的電流太大把控制板燒壞。所以建議使用獨立的電源供應馬達,並搭配馬達驅動器L293D。

[基礎知識:H-Bridge]

驅動馬達時,使用H-Bridge,連接的方式如下圖:

圖片來源:Wikipedia

當開關S1和S4 (下圖左方) 閉合且S2和S3是打開的,正電壓將依照電流方向使馬達正轉。當S1和S4的開關打開且S2和S3的開關閉合 (下圖右方) ,此電壓是相反的,會使馬達轉向相反。使用這個電路時,開關S1和S2不應該在同一時間被封閉,因為這將導致輸入電壓短路,電流就會從正極穿過兩個電晶體直接回到負極,同樣的S3和S4也不能同時閉合,這種情況被稱為直通 (shoot-through),是有可能燒壞電晶體的。在實際驅動電路中通常要用硬體電路方便地控制電晶體的開關。

 圖片來源:Wikipedia

圖片來源:Robotix

[L293D接腳說明]

• 1 Enable 1-2:作為左半邊IC控制用。當這個Pin為高電壓時,左半邊IC可作用,反之,低電壓時,左半邊IC無作用。
• 2 INPUT 1:當這個Pin為高電壓時,電流會流出至Output 1。
• 3 OUTPUT 1:這個Pin要接到終端馬達的一個接腳。
• 4,5 GND:接地。
• 6 OUTPUT 2:這個Pin要接到終端馬達的一個接腳。
• 7 INPUT 2, 當這個Pin為高電壓時,電流會流出至Output 2。
• 8 VC:供給給馬達使用的電壓,如果要驅動的馬達是12V,那就要供給這個Pin 12V直流電。
• 9 Enable 3-4:作為右半邊IC控制用。當這個Pin為高電壓時,右半邊IC可作用,反之,低電壓時,右半邊IC無作用。
• 10 INPUT 3,:這個Pin為高電壓時,電流會流出至Output 3。
• 11 OUTPUT 3:這個Pin要接到終端馬達的一個接腳。
• 12,13 GND:接地。
• 14 OUTPUT 4:這個Pin要接到終端馬達的一個接腳。
• 15 INPUT 4:當這個Pin為高電壓時,電流會流出至Output 4。
• 16 VSS:提供給IC的電源,這個Pin要供給5V電壓。

[材料]

• 麵包板 x 1
• Raspberry Pi 主板 x 1
• 直流 3V 馬達 x 1
• L293D IC晶體 x 1
• 電池盒(3V) x 1
• 連接線 x N條

[線路連接與電路圖]

• Raspberry Pi Pin2接到L293D Pin16(Vcc 1),Pin6接到L293D Pin5(GND)。
• Raspberry Pi Pin12接到L293D Pin1(Enable1,2),Pin16接到Pin2(Input1),Pin18接到Pin7(Input2)。
• 電池盒正負極接到L293D Pin8(VCC 2)及Pin12(GND)。
• 馬達的兩條線分別接在L293D Pin3(Output1)及Pin6(Output2)。

[程式碼]

import time
import RPi.GPIO as GPIO

enable_pin = 18
in1_pin = 23
in2_pin =24
GPIO.setmode(GPIO.BCM)
GPIO.setup(enable_pin, GPIO.OUT)
GPIO.setup(in1_pin, GPIO.OUT)
GPIO.setup(in2_pin, GPIO.OUT)

pwm = GPIO.PWM(enable_pin, 500)
pwm.start(0)

def clockwise():
    GPIO.output(in1_pin, True)
    GPIO.output(in2_pin, False)

def counter_clockwise():
    GPIO.output(in1_pin, False)
    GPIO.output(in2_pin, True)

while True:
    cmd = raw_input("Command, f/r 0..9, E.g. f5 :")
    direction = cmd[0]
    if direction == "f":
        clockwise()
    else:
        counter_clockwise()
    speed = int(cmd[1]) * 10
    pwm.ChangeDutyCycle(speed)

[程式說明]

GPIO.setmode設定有兩種方法:(GPIO.BCM) 跟(GPIO.Board),這兩種方式可以透過 RPi.GPIO對 Raspberry Pi上的Pin進行編號。
● 第一種方式是使用 BOARD 編號系統。這個方式是參考 Raspberry Pi 主機板上 P1 接線柱的針腳編號。使用這個方式的優點是無需考慮主機板的修訂版本,不會隨著硬體版本更新而改變Pin腳編號,程式也無須改變。指令為:GPIO.setmode(GPIO.BOARD)。
● 第二種方式是使用 BCM 編號系統。這是一種低階的工作方式,需參考 Broadcom SOC 的通道編號。使用時,需注意主機板上的針腳與圖表上標注的通道編號相對應。程式可能會因為Raspberry Pi 主機板進行版本更新而無法工作。指令為:GPIO.setmode(GPIO.BCM)。


[參考資料]

● Raspberry Pi Cookbook
● ROBOTIX-Motor Driver IC
● WikiPedia-H Bridge
Share:

6 則留言:

  1. 您好,我是台中科技大學的學生,敝姓李,目前正在做有關Raspberry Pi的專題,有參考您的程式碼,
    但遇到了些瓶頸,這裡是我的信箱 az401148249a@gmail.com
    如果方便的話可以交流一下嗎?我們需要你的協助,拜託了!!

    回覆刪除
    回覆
    1. 透過Mail 回覆你聯絡方式了, 如果能解決你的問題, 我很樂意幫忙!!

      刪除
  2. 小弟在電子街買了ULN2003A 應該可以驅動減速馬達 (專題要用)
    看到這文章使用L293D驅動馬達,該去買這顆嗎?

    回覆刪除
  3. 本來是用步進馬達結果扭力太小,改用減速馬達來使用

    回覆刪除
  4. 作者已經移除這則留言。

    回覆刪除
  5. 你好我目前是大三的學生 專題製作需要利用arduino+L293D來控制dc馬達正反轉
    想請問一下 Raspberry Pi 的程式碼部分 如果利用arduino該如何撰寫?

    回覆刪除