Java Embedded (11)控制直流馬達 - 使用L293D晶片
Java Embedded (10)GPIO進階應用 – 步進馬達 << 前情 11-1 認識直流馬達與L293D晶片使用Raspberry Pi可以控制各種馬達,讓製作的裝置可以執行各種任務。前一章認識與實作的步進馬達,可以使用在繪圖機或3D印表機這類裝置。Raspberry Pi也很常被用來製作遙控車或自走車,需要讓車輪轉動的應用,步進馬達就不太合適了。 一般的玩具車通常是使用小型的直流馬達驅動車輪,直流馬達有很多種規格,主要是電壓的區分,最常見的是6V直流馬達。這是它的外觀: 6V直流馬達可以使用兩個(3V)或四個(6V)電池串聯驅動。雖然Raspberry Pi提供3.3V和5V的電源,不過直流馬達需要的電流比較大,所以千萬不要直接使用Raspberry Pi提供的電源給直流馬達使用。如果你這麼做了,通常會讓Raspberry Pi停止運作,也很有可能燒壞Raspberry Pi。所以你需要準備兩個或四個的電池盒,用來提供電源給直流馬達使用,建議使用兩個電池就可以了。 在控制直流馬達的時候,Raspberry Pi與應用程式扮演的角色,變成控制電池的電源是否通過直流馬達。這樣的工作適合使用L293D這樣的晶片,這是它的腳位圖形: L293D可以控制兩組大電流的直流電源,下列是它的針腳編號與功能說明:
L293D很適合用來控制直流馬達,所以也有人把它叫作直流馬達控制晶片。其實還有很多需要控制大電流的直流電源的應用,都可以使用這個晶片。 11-2 連接直流馬達與L293D晶片如果Raspberry Pi與應用程式,需要控制一個直流馬達,需要下列的零件與設備:
依照下面的線路圖連接所有的零件與設備: 雖然接下來的說明只會控制一個直流馬達,不過遙控車或自走車需要同時控制兩個直流馬達,所以你可以參考下面的線路圖連接與控制兩個直流馬達: 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瀏覽與下載。 |