JAVA版树莓派呼吸灯完整程序(PWM)及碰到的各种坑

来源:互联网 发布:搜房网网络摇号直播间 编辑:程序博客网 时间:2024/04/28 05:56

网上搜了一下,树莓派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/01final 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变换,会不断缓慢的变亮及变暗,达到呼吸灯的效果。













原创粉丝点击