LeJOS学习(8):Sensor的API研究-InfraRedSensor

来源:互联网 发布:福建医科大学网络教育 编辑:程序博客网 时间:2024/06/05 00:54

一鼓作气,继续红外传感器的研究,就是这个传感器:
这里写图片描述
红外传感器的作用只有两个:测距、定位。其实还有一个功能,可以接受远程控制,方法略有不同。

先看代码:

        EV3IRSensor sensor = new EV3IRSensor(SensorPort.S1);        //模式一:测距,一个数,越小越近,远了就变成Infinity        //SensorMode mode = sensor.getDistanceMode();        //模式二:定位,8个数,4组,每组两个(方位-25~25,距离远了也是Infinity)        SensorMode mode = sensor.getSeekMode();         float[] samples = new float[mode.sampleSize()];        while(  !Button.DOWN.isDown() ){            mode.fetchSample(samples, 0);            int k=0;            for(float v : samples)                System.out.println("===v["+(k++)+"]="+v);                //log.echo("v["+(k++)+"]="+v);            Delay.msDelay(1000);        }        sensor.close();

测量距离

getDistanceMode用于测试红外传感器与前面物体的距离,采样得到1个数,范围从5cm到50cm之间。

定位

getSeekMode可以让红外传感器根据4个信标来定位,其实就是能同时接收4个信标的信号,每个信标的信号有两个数(方位和距离),这样意味着采样得到的是8个数,每2个一组,对应一个信标的频道,比如我使用Channel3,所以在数组中是 samples[4]为方位,samples[5]为距离,修改频道可以使用遥控器中间的拨动开关,4个频道可选。
其中,方位的取值范围从-25到+25,表示传感器角度来看信标的方位(从左向右,顺时针)。
这里写图片描述

远程命令

现在来看看远程命令,其实就是感应红外遥控器的按钮。代码如下:

        EV3IRSensor sensor = new EV3IRSensor(SensorPort.S1);        while(  !Button.DOWN.isDown() ){            int cmd = sensor.getRemoteCommand(2);            if(cmd!=0)                log.echo("cmd="+cmd);            byte[] buf = new byte[4];            sensor.getRemoteCommands(buf, 0, 4);            int k=0;            for(float v : buf){                if(v!=0)                    System.out.println("===v["+(k++)+"]="+v);                else                    k++;                    //log.echo("v["+(k++)+"]="+v);            }            Delay.msDelay(1000);        }        sensor.close();

其中getRemoteCommand(int channel) 是指定频道获取命令ID,而getRemoteCommands()则可以同时获取4个频道上的命令ID。命令ID的定义见下表:

0 = 无按钮(并且“信标”模式关闭)
1 = 按钮 1
2 = 按钮 2
3 = 按钮 3
4 = 按钮 4
5 = 按钮 1 和按钮 3 同时
6 = 按钮 1 和按钮 4 同时
7 = 按钮 2 和按钮 3 同时
8 = 按钮 2 和按钮 4 同时
9 =“信标”模式开启
10 = 按钮 1 和按钮 2 同时
11 = 按钮 3 和按钮 4 同时

遥控器图示如下:
这里写图片描述

1 0