1. 程式人生 > >JAVA版樹莓派呼吸燈完整程式(PWM)及碰到的各種坑

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變換,會不斷緩慢的變亮及變暗,達到呼吸燈的效果。