Sun SPOT程序设计 University Outreach Programs in China 蒋清野(John) Sun 中国技术社区,高级经理 John.Jiang@Sun.Com http://www.qyjohn.net/ Qingye Jiang (John) Senior Manager Sun Developer Network, China 1
Sun Sun SPOT Small Programmable Object Technology - 基于ARM 902T处理器(32位,180MHz) - 512 KB SRAM,4 MB Flash - 硬件上直接运行Java虚拟机(无操作系统) - 使用Java语言编程 (NetBeans IDE) - 支持CLDC 1.1和MIDP 1.0规范 - 通讯接口:802.15.4规范 - 通过USB接口与上位机通讯(mini-b) - 可充电锂电池(3.6V, 750 mAh) - 深层睡眠模式(36 uA)
Sun SPOT应用程序框架 //声明包名称 package org.sunspotworld.demo; //导入应用程序需要使用的雷库 import com.sun.spot.peripheral.Spot; import com.sun.spot.sensorboard.EDemoBoard; import java.io.*; import javax.microedition.io.*; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; //定义一个类,类名为SunSpotApplication(可根据需要命名),该类的父类为MIDlet public class SunSpotApplication extends MIDlet { //定义startApp()方法 protected void startApp() throws MIDletStateChangeException { } //定义pauseApp()方法(此方法在Sun SPOT应用中从来不会被调用) protected void pauseApp() { //定义destroyApp()方法 protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
Sun SPOT应用中的import部分 import com.sun.spot.peripheral.Spot; //静态类,定义了SPOT电路板上的各种元件 import com.sun.spot.sensorboard.EDemoBoard; //Sun 公司的SPOT的传感器板上面的外设当中的三色LED指示灯 import com.sun.spot.sensorboard.peripheral.ITriColorLED; //Sun 公司的SPOT的外设当中的射频装置的广播政策管理器 import com.sun.spot.peripheral.radio.IRadioPolicyManager; //Sun 公司的SPOT的射频I/O的两种实现 import com.sun.spot.io.j2me.radiostream.*; import com.sun.spot.io.j2me.radiogram.*; //Sun 公司的SPOT的一些常用方法 import com.sun.spot.util.*; //Java ME中的一些常用类库 import java.io.*; import javax.microedition.io.*; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException;
Sun SPOT应用中的startApp()方法 protected void startApp() throws MIDletStateChangeException { // 显示调试信息 System.out.println("Hello, world"); // 监测USB电缆是否连接到开发主机,识别并处理主机发送给SPOT的指令 new BootloaderListener().start(); // 获得本机IEEE Mac地址并显示 IEEEAddress ourAddr = new IEEEAddress(Spot.getInstance().getRadioPolicyManager().getIEEEAddress()); System.out.println("Our radio address = " + ourAddr.asDottedHex()); // 获得三色LED指示灯的引用地址,将第一只LED指示灯设置为红色 ITriColorLED [] leds = EdemoBoard.getInstance().getLEDs(); leds[0].setRGB(100,0,0); // 进入一个死循环 boolean running = true; while (running) { leds[0].setOn(); // 开启第一只LED Utils.sleep(250); // 等待250 毫秒 leds[0].setOff(); // 关闭第一只LED Utils.sleep(3000); // 等待3000毫秒 } notifyDestroyed(); // 如果运行到这里,则结束MIDP的运行(到不了)
访问Sun SPOT的各种传感器 传感器板: - 三轴加速度计(2G/6G) - 光照传感器 - 温度传感器 - 按钮两个 - 可编程LED(8 只),电源指示LED,状态指示LED - 模拟信号接口(6 个),5个GPIO,4 个高电流输出 访问所有的传感器设备都涉及到I/O操作,需要捕获与I/O 相关的例外! try { //在这里访问传感器设备 } catch (IOException ex) { System.out.println("Error in I/O: " + ex); }
访问Sun SPOT的加速度计
访问Sun SPOT的加速度计 在应用程序的开头部分,您需要import与加速度计相关的类库: import com.sun.spot.sensorboard.peripheral.IAccelerometer3D; 在应用程序中,声明一个IAccelerometer3D对象: 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的加速度计 LIS3L02AQAccelerometer 是IAccelerometer3D的子类 在Sun SPOT自带的传感器上,自带的加速度计型号为LIS3L02AQ。该加速度计的测量范围可以设定为2G或者是6G,在测量范围不同的时候,其测量精度也是不同的。 import com.sun.spot.sensorboard.peripheral.LIS3L02AQAccelerometer; 在应用程序中访问该加速度计: LIS3L02AQAccelerometer acc = (LIS3L02AQAccelerometer)EDemoBoard.getInstance().getAccelerometer(); 获得加速度计的当前测量范围。如果加速度计工作在2G状态,该方法返回SCALE_2G;如果加速度计工作在6G状态,该方法返回SCALE_6G。 public int scale = acc.getCurrentScale(); 设定加速度计的测量范围为2G: acc.setScale(acc.SCALE_2G); 设定加速度计的测量范围为6G: acc.setScale(acc.SCALE_6G); LIS3L02AQAccelerometer 是IAccelerometer3D的子类 在前一个页勉励所提到的各种IAccelerometer3D的方法 均可直接在LIS3L02AQAccelerometer中使用,例如 acc.getAccelX(); acc.getTiltX();
访问Sun SPOT的光照传感器 在应用程序的开头部分,您需要import与光照传感器相关的类库: import com.sun.spot.sensorboard.peripheral.ILightSensor; 在应用程序中,声明一个ILightSensor对象: ILightSensor lightSensor = EDemoBoard.getInstance().getLightSensor(); 读取光照强度,其数值范围在0 到740 之间。 int lightIndication = lightSensor.getValue();
访问Sun SPOT的温度传感器 在应用程序的开头部分,您需要import与温度传感器相关的类库: import com.sun.spot.sensorboard.peripheral.ITemperatureInput; 在应用程序中,声明一个ITemperatureInput对象: ITemperatureInput tempSensor = EDemoBoard.getInstance().getADCTemperature(); 读取温度数据,用华氏度表示: double tempF = tempSensor.getFahrenheit(); 读取温度数据,用摄氏度表示: double tempC = tempSensor.getCelsius();
访问Sun SPOT的控制按钮 在应用程序的开头部分,您需要import与控制按钮相关的类库: import com.sun.spot.sensorboard.peripheral.ISwitch; 在应用程序中,声明两个ISwitch对象,其中sw1为左边的控制按钮,sw2为右边的控制按钮: ISwitch sw1 = EDemoBoard.getInstance().getSwitches()[0]; ISwitch sw2 = EDemoBoard.getInstance().getSwitches()[1]; 控制按钮实际上是一个数字开关,它可以被设置为开启和关闭两种状态。 检查sw1和sw2是否为开启状态: boolean status = sw1.isOpen(); boolean status = sw2.isClose(); 您也可以让程序等待某个控制按钮的状态发生改变,例如: sw1.waitForChange(); waitForChange()是一个阻塞方法。它会停止当前线程的执行,一直到该控制按钮的状态发生改变为止。
访问Sun SPOT的LED 在应用程序的开头部分,您需要import与LED相关的类库: import com.sun.spot.sensorboard.peripheral.ITriColorLED; 在应用程序中,获得LED对象的实例: ITriColorLED [] leds = EDemoBoard.getInstance().getLEDs(); 设定某个LED的颜色: leds[0].setRGB(100,0,0); 控制某个LED的开启: leds[0].setOn(); leds[0].setOff();
Sun SPOT传感器综合编程练习 编写一个Sun SPOT应用程序,用LED模拟一个在水中作单向运动的小球。该小球可以是一个密度大于水的铁球,也可以是一个密度小于水的气球,使用左边的控制按钮改变其密度状态。该小球的颜色可以使用温度或者是亮度来控制,当温度(亮度)较高的时候,小球的颜色为红色;当温度(亮度)较低的时候,小球的颜色为绿色;过渡颜色为蓝色。 可以参考Demos\CodeSamples这个目录里面的例程。
Sun SPOT传感器:滤波 算术平均值滤波 S=(X1+X2+...+XN)/N 中值滤波 对n个采样数据排序,取中间值作为滤波结果 防脉冲干扰平均值滤波 去掉一个最高分、去掉一个最低分,计算其余的平均值作为滤波结果 一阶惯性滤波 S(i)=a.x(i)+(1-a)S(i-1) 其中x(i)为本次采样值,S(i-1)为上一次的滤波输出值。
Sun SPOT传感器综合编程练习 连续采集加速度计的信息,用不同的方法对其进行滤波。比较滤波前和滤波后的数据,观察不同滤波算法的效果。
Sun SPOT程序设计 University Outreach Programs in China 蒋清野(John) Sun 中国技术社区,高级经理 John.Jiang@Sun.Com http://www.qyjohn.net/ Qingye Jiang (John) Senior Manager Sun Developer Network, China 23