Java Embedded (11)控制直流馬達 - 使用L293D晶片 by Michael | CodeData
top

Java Embedded (11)控制直流馬達 - 使用L293D晶片

分享:

Java Embedded (10)GPIO進階應用 – 步進馬達 << 前情

11-1 認識直流馬達與L293D晶片

使用Raspberry Pi可以控制各種馬達,讓製作的裝置可以執行各種任務。前一章認識與實作的步進馬達,可以使用在繪圖機或3D印表機這類裝置。Raspberry Pi也很常被用來製作遙控車或自走車,需要讓車輪轉動的應用,步進馬達就不太合適了。

一般的玩具車通常是使用小型的直流馬達驅動車輪,直流馬達有很多種規格,主要是電壓的區分,最常見的是6V直流馬達。這是它的外觀:

JavaEmbedded_11_01

6V直流馬達可以使用兩個(3V)或四個(6V)電池串聯驅動。雖然Raspberry Pi提供3.3V和5V的電源,不過直流馬達需要的電流比較大,所以千萬不要直接使用Raspberry Pi提供的電源給直流馬達使用。如果你這麼做了,通常會讓Raspberry Pi停止運作,也很有可能燒壞Raspberry Pi。所以你需要準備兩個或四個的電池盒,用來提供電源給直流馬達使用,建議使用兩個電池就可以了。

在控制直流馬達的時候,Raspberry Pi與應用程式扮演的角色,變成控制電池的電源是否通過直流馬達。這樣的工作適合使用L293D這樣的晶片,這是它的腳位圖形:

JavaEmbedded_11_02

L293D可以控制兩組大電流的直流電源,下列是它的針腳編號與功能說明:

  1. 1,2EN:連接高電壓時啟動左側馬達控制。
  2. 1A:輸入高電壓時,電流會導向3號針腳(1Y)。
  3. 1Y:連接到馬達。
  4. HEAT SINK AND GDOUND:接地。
  5. HEAT SINK AND GDOUND:接地。
  6. 2Y:連接到馬達。
  7. 2A:輸入高電壓時,電流會導向3號針腳(2Y)。
  8. Vcc2:給馬達使用的電源。
  9. 3,4EN:連接高電壓時啟動右側馬達控制。
  10. 3A:輸入高電壓時,電流會導向3號針腳(3Y)。
  11. 3Y:連接到馬達。
  12. HEAT SINK AND GDOUND:接地。
  13. HEAT SINK AND GDOUND:接地。
  14. 4Y:連接到馬達。
  15. 4A:輸入高電壓時,電流會導向3號針腳(4Y)。
  16. Vcc1:提供給IC的電源,這個Pin要供給5V電壓。

L293D很適合用來控制直流馬達,所以也有人把它叫作直流馬達控制晶片。其實還有很多需要控制大電流的直流電源的應用,都可以使用這個晶片。

11-2 連接直流馬達與L293D晶片

如果Raspberry Pi與應用程式,需要控制一個直流馬達,需要下列的零件與設備:

  • 直流馬達,一個
  • L293D、直流馬達控制晶片,一個
  • 兩顆三號電池與電池盒,一個
  • 杜邦線(公-母)四條
  • 麵包板連接線(公-公)七條
  • 麵包板

依照下面的線路圖連接所有的零件與設備:

JavaEmbedded_11_03

雖然接下來的說明只會控制一個直流馬達,不過遙控車或自走車需要同時控制兩個直流馬達,所以你可以參考下面的線路圖連接與控制兩個直流馬達:

JavaEmbedded_11_04

11-3 撰寫控制直流馬達的應用程式

使用L293D晶片控制直流馬達,除了可以正確的提供電源給直流馬達,還可以在應用程式控制馬達的運轉方向,只要使用一般的GPIO輸出功能就可以完成。參考下列的程式碼,撰寫控制直流馬達的應用程式:

package dcmotordemo01;

import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.RaspiPin;

public class DCMotorDemo01 {

    public static void main(String[] args) {
        // 建立GPIO控制物件
        final GpioController gpio = GpioFactory.getInstance();

        // 建立控制直流馬達用的GPIO輸出針腳物件
        final GpioPinDigitalOutput pin00 = 
                gpio.provisionDigitalOutputPin(RaspiPin.GPIO_00);
        final GpioPinDigitalOutput pin01 = 
                gpio.provisionDigitalOutputPin(RaspiPin.GPIO_01);

        // 順時鐘方向旋轉
        pin00.high();
        pin01.low();
        delay(2000);

        // 停止
        pin00.low();
        pin01.low();
        delay(2000);

        // 逆時鐘方向旋轉
        pin00.low();
        pin01.high();
        delay(2000);

        // 停止
        pin00.low();
        pin01.low();

        gpio.shutdown();
    }

    private static void delay(int ms) {
        try {
            Thread.sleep(ms);
        }
        catch (InterruptedException e) {
            System.out.println(e.toString());
        }
    }        

}

執行這個應用程式以後,直流馬達會以順時鐘方向旋轉兩秒,停止兩秒以後,再以逆時鐘方向旋轉兩秒。

11-4 控制直流馬達的速度

提供給直流馬達的正、負極,可以控制它運轉的分向,運轉的速度是依照提供電源的電壓決定的。如果提供的電壓是固定的,你也可以使用程式碼控制直流馬達運轉的速度。參考下列的程式碼,完成這個可以控制運轉速度的應用程式:

package dcmotordemo02;

import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.RaspiPin;

public class DCMotorDemo02 {

    public static void main(String[] args) {
        // 建立GPIO控制物件
        final GpioController gpio = GpioFactory.getInstance();

        // 建立控制直流馬達用的GPIO輸出針腳物件
        final GpioPinDigitalOutput pin00 = 
                gpio.provisionDigitalOutputPin(RaspiPin.GPIO_00);
        final GpioPinDigitalOutput pin01 = 
                gpio.provisionDigitalOutputPin(RaspiPin.GPIO_01);

        pin01.low();

        // 順時鐘方向旋轉,由慢變快
        for (int i = 0; i < 100; i++) {
            pin00.high();
            delay(i);
            pin00.low();
            delay(100 - i);
        }

        delay(1000);

        pin00.low();

        // 逆時鐘方向旋轉,由慢變快
        for (int i = 0; i < 100; i++) {
            pin01.high();
            delay(i);
            pin01.low();
            delay(100 - i);
        }

    }

    private static void delay(int ms) {
        try {
            Thread.sleep(ms);
        }
        catch (InterruptedException e) {
            System.out.println(e.toString());
        }
    }        

}

示範影片:

課程相關的檔案都可以GitHub瀏覽與下載。

http://github.com/macdidi5/JavaEmbedded

後續 >> Java Embedded (12)整合應用 – PiFan

分享:
按讚!加入 CodeData Facebook 粉絲群

相關文章

留言

留言請先。還沒帳號註冊也可以使用FacebookGoogle+登錄留言

熱門論壇文章

熱門技術文章