JAVA版樹莓派呼吸燈完整程式(PWM)及碰到的各種坑
網上搜了一下,樹莓派LED呼吸燈的程式,有C++和Pyhon的,但是沒有發現JAVA的,就嘗試自己去做一套。終於做完了,也發出來大家共享一下,同時Mark一下過程中碰到的各種問題及解決方案。
下面就搞一步一步來了,
1. 下載Pi4j Java 類庫 (http://pi4j.com/download.html)
此處要注意的是pi4j-1.1.zip中的pi4j-core.jar要替換成pi4j-core-1.2-SNAPSHOT,否則執行程式時,提示錯誤:只支援BCM2708, BCM2709, 但是你的harware是BCM2835
最終用到的類庫如下:
2.設定JDK path, classpath, 為了編譯和執行方便,直接設定/usr/testdev/pi4jlibs路徑到classpath中去
編輯 /etc/profile檔案,加入下圖中的內容,儲存,並重新載入變數到系統中 source /etc/profile,使新增的內容立刻有效
PI4JLIBPATH=`find /usr/testdev/pi4jlibs -name *.jar|xargs|sed "s/ /:/g"`
export PI4JLIBPATH
export JAVA_HOME=/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt
export JRE_HOME=/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$PI4JLIBPATH:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
使用命令source /etc/profile重新載入系統變數後,檢視pi4j的類庫是否已經在CLASSPATH中,如下圖
3.程式設計,程式內容:
1. 要控制LED等緩慢從暗到亮,然後從亮慢慢變暗,需要用PWM函式,並且需要用支援PWM的引腳23/24/26/01
2. 要特別注意引腳的編碼,pi4j用的引腳編碼是wiringpi的編碼,而不是樹莓派(sratch2)中的BCM編碼,控制錯了pin的話,不能點亮LED,如下面程式碼中用到的腳RaspiPin.GPIO_26是wiringpi的26腳,而不是BCM編碼的12。
* * @author (your name) * @version (a version number or a date) */ import java.util.*; import com.pi4j.io.gpio.GpioController; import com.pi4j.io.gpio.GpioFactory; import com.pi4j.io.gpio.GpioPinDigitalOutput; import com.pi4j.io.gpio.GpioPinPwmOutput; import com.pi4j.io.gpio.PinState; import com.pi4j.io.gpio.RaspiPin; import com.pi4j.wiringpi.*; public class LEDBreathingLight { // instance variables - replace the example below with your own private int x; /** * Constructor for objects of class Helloworld */ public LEDBreathingLight() { // initialise instance variables x = 0; } public static void main(String[] args) throws InterruptedException { System.out.println("Let's gogogogogoogo...Breathing~"); // create gpio controller final GpioController gpio = GpioFactory.getInstance(); // initializing a GpioPinPwmOutput pin, 26/24/01 final GpioPinPwmOutput pin = gpio.provisionPwmOutputPin(RaspiPin.GPIO_26, "MyLED", 100); // set shutdown state for this pin pin.setShutdownOptions(true, PinState.LOW); int sleep_time = 10; int sleep_time2 = 7; while(true) { // lighting.... for (int i=0; i<=100; i++) { pin.setPwm(i); Thread.sleep(sleep_time); } // darking... for (int i=100; i>0; i--) { pin.setPwm(i); Thread.sleep(sleep_time2); } Thread.sleep(1000); // break 1 second } // (this method will forcefully shutdown all GPIO monitoring threads and scheduled tasks) /* gpio.shutdown(); System.out.println("Exiting ControlGpioExample"); */ } }
4. 編譯,執行
因為將pi4j的類庫放到了系統變數CLASSPATH中,所以直接javac / java 進行編譯和執行寫的java類,無需新增classpath路徑
javac *.java
java LEDBreathingLight
執行後,LED根據輸入PWM值0-100變換,會不斷緩慢的變亮及變暗,達到呼吸燈的效果。