婉兮清扬

案上诗书杯中酒之快意人生

[实验] 访问Sun SPOT上的传感器

发表时间:2008-05-26 17:47:34
一、加速度计



图一、Sun SPOT的XYZ坐标图


图二、Sun SPOT的XY坐标方向

加速度是一个矢量。在使用Sun SPOT的加速度计之前,我们需要了解该矢量所使用的坐标系统。上面两个图形介绍了Sun SPOT的坐标系统,当Sun SPOT如图一所示水平放置时,Z 轴的方向为垂直向下,其加速度值为1G。


在应用程序的开头部分,您需要import与加速度计相关的类库:

import com.sun.spot.sensorboard.peripheral.IAccelerometer3D;

在应用程序中,声明一个IAccelerometer3D对象:

private IAccelerometer3D accel = EDemoBoard.getInstance().getAccelerometer();

获得X, Y, Z三轴上的加速度值:

double accelX = accel.getAccelX();
double accelY = accel.getAccelY();
double accelZ = accel.getAccelZ();

获得X, Y, Z三轴上的倾斜度:

double tiltX = accel.getTiltX();
double tiltY = accel.getTiltY();
double tiltZ = accel.getTiltZ();

在Sun SPOT自带的传感器上,自带的加速度计型号为LIS3L02AQ。该加速度计的测量范围可以设定为2G或者是6G,在测量范围不同的时候,其测量精度也 是不同的。如果我们需要在应用程序当中得到关于加速度计的更多信息,建议您直接使用类库LIS3L02AQAccelerometer。同样,在应用程序 的开头部分,您需要import与该加速度及相关的类库:

import com.sun.spot.sensorboard.peripheral.LIS3L02AQAccelerometer;

在应用程序中访问该加速度计:

private LIS3L02AQAccelerometer acc = (LIS3L02AQAccelerometer)EDemoBoard.getInstance().getAccelerometer();

LIS3L02AQAccelerometer是IAccelerometer3D的一个子类,所以上面所介绍的获得三轴加速度和倾斜度的方法仍然可以使用。

获得加速度计的当前测量范围。如果加速度计工作在2G状态,该方法返回SCALE_2G;如果加速度计工作在6G状态,该方法范围SCALE_6G。

public int scale = acc.getCurrentScale();

设定加速度计的测量范围为2G:

acc.setScale(acc.SCALE_2G);

设定加速度计的测量范围为6G:

acc.setScale(acc.SCALE_6G);

二、光照传感器

在应用程序的开头部分,您需要import与光照传感器相关的类库:

import com.sun.spot.sensorboard.peripheral.ILightSensor;

在应用程序中,声明一个ILightSensor对象:

private ILightSensor lightSensor = EDemoBoard.getInstance().getLightSensor();

读取光照强度,其数值范围在0 到740 之间。

int lightIndication = lightSensor.getValue();

三、温度传感器

在应用程序的开头部分,您需要import与温度传感器相关的类库:

import com.sun.spot.sensorboard.io.ITemperatureInput;

在应用程序中,声明一个ITemperatureInput对象:

private ITemperatureInput tempSensor = EDemoBoard.getInstance().getADCTemperature();

读取温度数据,用华氏度表示:

double tempF = tempSensor.getFahrenheit();

读取温度数据,用摄氏度表示:

double tempC = tempSensor.getCelsius();

四、使用控制按钮

在应用程序的开头部分,您需要import与控制按钮相关的类库:

import com.sun.spot.sensorboard.peripheral.ISwitch;

在应用程序中,声明两个ISwitch对象,其中sw1为左边的控制按钮,sw2为右边的控制按钮:

private ISwitch sw1 = EDemoBoard.getInstance().getSwitches()[0];
private ISwitch sw2 = EDemoBoard.getInstance().getSwitches()[1];

控制按钮实际上是一个数字开关,它可以被设置为开启和关闭两种状态。

检查sw1是否为开启状态:

boolean status = sw1.isOpen();

检查sw2是否为关闭状态:

boolean status = sw2.isClose();

您也可以让程序等待某个控制按钮的状态发生改变,例如:

sw1.waitForChange();

waitForChange()是一个阻塞方法。也就是说,它会停止当前线程的执行,一直到该控制按钮的状态发生改变为止。

在 更多的情况下,我们可能需要知道的是某个控制按钮是否曾经被按下(作为改变系统状态的某种信号),而并不关心其当前状态是开启还是关闭。一个简单的办法是 读取该控制按钮的当前状态并且与上一次的状态进行比较,如果结果不一样则判断该按钮的状态曾经被按下(因为其状态发生了改变)。

五、综合编程练习

编 写一个Sun SPOT应用程序,用LED模拟一个在水中作单向运动的小球。该小球可以是一个密度大于水的铁球,也可以是一个密度小于水的气球,使用左边的控制按钮改变 其密度状态。该小球的颜色可以使用温度或者是亮度来控制,当温度(亮度)较高的时候,小球的颜色为红色;当温度(亮度)较低的时候,小球的颜色为绿色;过 渡颜色为蓝色。

在完成这个编程练习的时候,可以参考Demo\CodeSamples这个目录里面的例程。
上一篇 下一篇

 
姓名:
评论:

请输入下面这首诗词的作者姓名。

杯汝来前!老子今朝,点检形骸。
甚长年抱渴,咽如焦釜;于今喜睡,气似奔雷。
汝说“刘伶,古今达者,醉后何妨死便埋”。
浑如此,叹汝于知己,真少恩哉!

答案:

云与清风常拥有,
冰雪知音世难求。
击节纵歌相对笑,
案上诗书杯中酒。

蒋清野
2000.12.31 于 洛杉矶