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瀏覽與下載。 |

Java 學習之路



https://github.com/macdidi5/JavaEmbedded



