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

最终用到的类库如下:

JAVA版树莓派呼吸灯完整程序(PWM)及碰到的各种坑_第1张图片

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


JAVA版树莓派呼吸灯完整程序(PWM)及碰到的各种坑_第2张图片

使用命令source /etc/profile重新载入系统变量后,查看pi4j的类库是否已经在CLASSPATH中,如下图

JAVA版树莓派呼吸灯完整程序(PWM)及碰到的各种坑_第3张图片


3.编程,程序内容:

1. 要控制LED等缓慢从暗到亮,然后从亮慢慢变暗,需要用PWM函数,并且需要用支持PWM的引脚23/24/26/01

2. 要特别注意引脚的编码,pi4j用的引脚编码是wiringpi的编码,而不是树莓派(sratch2)中的BCM编码,控制错了pin的话,不能点亮LED,如下面代码中用到的脚RaspiPin.GPIO_26是wiringpi的26脚,而不是BCM编码的12。

JAVA版树莓派呼吸灯完整程序(PWM)及碰到的各种坑_第4张图片

 * 
 * @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变换,会不断缓慢的变亮及变暗,达到呼吸灯的效果。

JAVA版树莓派呼吸灯完整程序(PWM)及碰到的各种坑_第5张图片












你可能感兴趣的:(Raspberry,Linux,树莓派,GPIO,Pi4J,JAVA)