本帖最后由 lynnxh 于 2015-11-30 22:00 编辑
受限于Pi的性能,java一直不是Pi 应用的开发首选,不过Pi 2 的性能跑Java已经没有问题啦,跑Eclipse都在可接受的范围内,嘿嘿。
国内Pi上玩java的太少,这里抛砖引玉一下,希望更多的码农在Pi上玩java。
嗯,废话不多说了,进入正题。
华丽的分割线----------------------------------------------------------------------------------------
首先,要有光!Pi的官方系统已经内置了JDK,输入java -version,ok!没有?apt-get install总会用吧?apt-cache search jdk,然后装吧。
其次,要有....PI4J。嗯,这个必须顶一个,实现了GPIO的控制,所以,你要有。还是apt-get install。
上面都是环境准备,好多教程,略过不表,进入正题:
我们都知道12V的电脑调速监控风扇用的是4针接口,这4针的定义请参考:
四针监控调速风扇
监控风扇转速就要用到SENSE的插针了。Control用来发送PWM信号,调节转速。
很明显Sense需要一个模数转换的过程,如果没有A/D卡,这个就有点复杂了,不想花钱还想要功能,就要多出点力了。模拟吧,好在风扇转速没那么快,Pi 2处理的来。
Sense的输入原理是当风扇旋转一圈,完整的输出1~4个波形。如果把Sense接到GPIO的数字口上,表现为高低电平的变化,也就是说如果我们能够监控GPIO口的电平变化情况,就可以算出1秒钟风扇转的圈数,这样就实现了转速的监控,简单吧?
代码如下:
- final GpioController gc = GpioFactory.getInstance();
- //注意,使用时必须加高电平,Sense才会输出波形!
- GpioPinDigitalInput measurePin = gc.provisionDigitalInputPin(RaspiPin.GPIO_00,"",PinPullResistance.PULL_UP);
- //定义一个触发器,每当输入的电瓶变化时,计数器+1
- private void initPinTrigger() throws Exception{
- if(measurePin == null){
- throw new Exception("Error to set Monitor , The GPIO Pin is Null !");
- }
- measurePin.addTrigger(new GpioCallbackTrigger(new Callable<Void>(){
- @Override
- public Void call() throws Exception {
- count ++ ;
- return null;
- }
- }));
- }
复制代码看,我们已经能对输入的信号计数了,下面就要设置探测的时间间隔,每到间隔时间,重置计数器:
- <div>//做个线程,每秒重置计数器一次
- int measureTime = 1000;
- private float ratio = 0.25f;</div><div>
- public void run(){
- while(true){
- //重置计数器
- count = 0;
- try {
- Thread.sleep(measureTime);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- //计算风扇转速
- calculateFanSpeed();
- }
- }
- /**
- * when the time to measure finished, use ratio,count calculate the speed
- */
- private void calculateFanSpeed(){
- int fanSpeed = (int)(measureTime/1000 * 60 * ratio * count);</div><div>//更新风扇转速的单例
- ControllerInformation.getInstance().setFanSpeed(fanSpeed);
- }</div>
复制代码需要注意的是计算风扇转速的时候,一个高电平、低电平的变化计数器累加了2次,因此,最少也要在计数器上除2。另外,还要了解风扇转一圈输出几个波形,实验一下就能简单的得出答案。我使用的台达风扇一圈输出2个波形,因此Ratio设置为0.25。
ok,到此,转速的监控就完成了,简单吧??
下一篇再来给大家介绍OneWire的java访问方法及PWM控制风扇的方法。