Java Embedded (10)GPIO進階應用 – 步進馬達
|
Java Embedded (9)紅外線測距模組與類比數位轉換 << 前情 10-1 認識步進馬達Raspberry Pi的GPIO有非常多不同的應用,例如前面已經討論過的LED控制,讀取按鈕與紅外線模組的資訊。應用程式經由GPIO與外界實體的零件與設備互動,現在有很多類似自動掃地機的裝置,它們可以經由馬達驅動,由程式控制裝置的行動路線,配合超音波測距模組,還可以自動避開障礙物。其它像是機器手臂或是一台具備手跟腳的機器人,這類裝置都需要馬達驅動,這一篇介紹可以讓裝置活動的應用,在應用程式控制步進馬達的運作。這個實作需要這些零件與設備:
各種電動控制的應用,需要搭配不同的馬達,大致有下列幾種:
步進馬達適合使用在很多常見的裝置,這是一般步進馬達的外觀,它的規格是四相五線: 步進馬達的定位比較精確,可以使用1000rpm以內的速度運轉,適合動作頻繁與距離較短的應用。步進馬達通常會搭配控制晶片,應用程式比較容易設計,市面上可以找到整合ULN2003晶片的控制模組,提供連接步進馬達的插座、指示燈號與連接到Raspberry Pi的針腳。這是步進馬達與ULN2003控制模組的外觀: 以四相的步進馬達來說,馬達裡面有四個控制方向的磁鐵,應用程式透過連接的線路,控制四個磁鐵的正、負極,讓步進馬達依照要的方向與速度運轉: 10-2 連接步進馬達控制模組認識步進馬達基本的概念後,搭配使用ULN2003晶片的控制模組,對Raspberry Pi來說會簡單很多。你必須選擇四個GPIO輸出針腳,連接到控制模組後,用來控制步進馬達的運轉。控制模組電源的部份需要5V與接地。依照下面的線路圖連接所有的零件: 10-3 撰寫應用程式控制步進馬達現在可以撰寫控制步進馬達的應用程式,Pi4J在「com.pi4j.component.motor.impl」套件,提供「GpioStepperMotorComponent」類別,使用它控制步進馬達是最方便的作法。GpioStepperMotorComponent類別包裝在「pi4j-device.jar」,所以這個應用程式除了主要的pi4j-core.jar外,也要記得加入pi4j-device.jar。參考下列的程式碼,完成控制步進馬達的應用程式: package steppermotordemo01;
import com.pi4j.component.motor.impl.GpioStepperMotorComponent;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
public class StepperMotorDemo01 {
// 28BYJ-48、四相步進馬達
// 單步、4 steps
public static final byte[] SINGLE_STEP = {
(byte) 0b0001,
(byte) 0b0010,
(byte) 0b0100,
(byte) 0b1000 };
// 雙步、4 steps
public static final byte[] DOUBLE_STEP = {
(byte) 0b0011,
(byte) 0b0110,
(byte) 0b1100,
(byte) 0b1001 };
// 半步、8 steps
public static final byte[] HALF_STEP = {
(byte) 0b0001,
(byte) 0b0011,
(byte) 0b0010,
(byte) 0b0110,
(byte) 0b0100,
(byte) 0b1100,
(byte) 0b1000,
(byte) 0b1001 };
// 4-Step sequence: 32 * 63.68395 = 2037.8864 (2038)
public static final int STEPS_PER_REV = 2038;
public static void main(String[] args) {
System.out.println("StepperMotorDemo01 Start...");
// 建立GPIO控制物件
final GpioController gpio = GpioFactory.getInstance();
// 建立控制步進馬達的GPIO輸出物件
final GpioPinDigitalOutput[] pins = {
gpio.provisionDigitalOutputPin(RaspiPin.GPIO_00, PinState.LOW),
gpio.provisionDigitalOutputPin(RaspiPin.GPIO_01, PinState.LOW),
gpio.provisionDigitalOutputPin(RaspiPin.GPIO_02, PinState.LOW),
gpio.provisionDigitalOutputPin(RaspiPin.GPIO_03, PinState.LOW)};
// 結束時把輸出針腳設定為低電壓
gpio.setShutdownOptions(true, PinState.LOW, pins);
// 建立步進馬達物件
GpioStepperMotorComponent motor =
new GpioStepperMotorComponent(pins);
// 設定每一步的間隔時間
motor.setStepInterval(2);
// 設定運作模式
motor.setStepSequence(SINGLE_STEP);
motor.setStepsPerRevolution(STEPS_PER_REV);
// 正向轉一圈
motor.rotate(1);
delay(500);
// 反向轉一圈
motor.rotate(-1);
delay(500);
gpio.shutdown();
System.out.println("StepperMotorDemo01 End...");
System.exit(0);
}
private static double angleToRev(int angle) {
return angle / 360.0;
}
/**
* 暫停指定的時間(毫秒、1000分之一秒)
*
* @param ms
*/
private static void delay(int ms) {
try {
Thread.sleep(ms);
}
catch (InterruptedException e) {
System.out.println(e.toString());
}
}
}
10-4 步進馬達進階控制因為步進馬達與ULN2003控制模組是很常見的搭配與應用,所以Pi4J提供步進馬達的包裝類別「GpioStepperMotorComponent」,應用程式直接使用它來控制步進馬達是最方便的作法。這是GpioStepperMotorComponent類別提供的建構式,使用參數指定的GPIO輸出針腳物件陣列,建立步進馬達控制物件: public GpioStepperMotorComponent(GpioPinDigitalOutput pins[]) 建立好步進馬達控制物件以後,根據使用的步進馬達,使用下列方法執行正確的設定:
建立好步進馬達控制物件以後,使用下列的方法控制步進馬達的運轉:
之前說明的範例程式,把控制步進馬達運轉的部份,改為下列的程式碼片段,程式執行以後,可以讓步進馬達一次運轉四分之一圈: motor.rotate(0.25); delay(500); motor.rotate(0.25); delay(500); motor.rotate(0.25); delay(500); motor.rotate(0.25); delay(500); 示範影片: 在控制步進馬達的時候,要特別注意使用方法的特性。forward、reverse與step在呼叫以後,應用程式會繼續往後執行,所以它們通常使用在步進馬達運轉的時候,應用程式還有其它的工作需要同時執行。呼叫forward(long milleseconds)、reverse(long milleseconds)、rotate(double revolutions)方法,執行完成後才會繼續後面的流程。 課程相關的檔案都可以GitHub瀏覽與下載。 |

Java 學習之路



https://github.com/macdidi5/JavaEmbedded




netsbig3
12/09老師您好,很感謝老師提供的範例,我在實作時採用了和範例相同的步進馬達(28YBJ-48)和步進馬達控制模組(ULN2003),不過我所採用的樹莓派是Raspberry Pi 2 Model B(40 pin GPIO)。將檔案上傳到樹莓派並執行後,步進馬達無法順利轉動,出現了類似失步的現象(馬達有噪音及震動、確不回轉)。想請問老師這個錯誤該如何來修正?