进阶马达控制、传感器控制以及第三方硬件产品
感谢网友圈圈妈 的翻译


进阶马达控制、传感器控制以及第三方硬件产品

马达类

基础马达

所有leJOS NXJ的马达类都扩展了基础马达类的抽象概念。 基础马达定义了任一种leJOS NXJ马达都必须对其中一些马达支持和提供所有工具的方法。这些方法是:

  • public void setPower(int power)
  • public int getPower()
  • public void forward()
  • public boolean isForward()
  • public void backward()
  • public boolean isBackward()
  • public void reverseDirection()
  • public boolean isMoving()
  • public void flt()
  • public boolean isFloating()
  • public void stop()
  • public boolean isStopped()
  • public int getMode()
RCX马达

RCX马达没有内置转速计,所以它不支持NXT马达的进阶功能,如旋转,有条理的旋转和速度调节。

一个更简单些的类用来支持RCX马达。 它在leJOS的RCX版本中有着与马达类相似的方法,这与那些支持基础马达类的相同。

使用RCX马达,你可以使用如下构造来创建RCX马达类的例子:

  • public RCXMotor(BasicMotorPort port)

例如


RCXMotor rcxMotor = new RCXMotor(MotorPort.A);				
				

你可以通过用转换连接线连接的方式使用leJOS NXJ的RCX马达。这个线可以在LEGO上买到(它也是LEGO MINDSTORMS的配套元件)。 你也可以通过连接远程RCX来使用RCX马达类控制RCX马达。

马达

这个类可以控制内含转速计的NXT马达,而且可以描述控制马达

马达端口类

在使用NXT马达时,不必明确使用马达端口类:你可以使用多种多样的马达A, 马达B和马达C。 所以,如果你仅用NXT马达,那你就可以跳过这部分。

但是,理解所使用的马达端口如何工作也是很有帮助的:

  • The Motor class (马达类)

  • The RCXMotor class (RCX马达类)

  • The RemoteNXT class (远程NXT类)

  • The RCXMotorMultiplexer class (RCX马达多路器类)

  • Remote RCX motors accessed via the RCXLink class (通过RCXLink类存取的远程RCX马达)

在马达端口定义的接口中,有个层级结构

  • BasicMotorPort (基础马达端口)

  • Tachometer (转速计)

  • TachoMotorPort (转速马达端口)

所有的马达端口都支持基础马达端口的接口,这可以控制马达的功率和模式 (前进,后退,停止,游荡)

支持这个的端口包含:

  • 连接NXT马达的NXT端口

  • 通过RCX转换头连接RXC马达的NXT端口

  • RCX马达多路适配器的端口

  • 通过远程NXT类接入的远程NXT端口

  • 通过RCXLink类接入的远程RCX端口

基础马达端口的所有工具包含:

  • MotorPort (马达端口)

  • RemoteMotorPort (远程马达端口)

  • RCXPlexedMotorPort (RCX可编程马达端口)

  • RCXRemoteMotorPort (RCX远程马达端口)

NXT马达内部的转速器支持转速器接口。

NXT马达端口支持包含基础马达端口和转速器接口的转速马达端口接口。

转速马达端口的执行方式包括:

  • MotorPort (马达端口)

  • RemoteMotorPort (远程马达端口)

所有这些看起来复杂,但是使用很简单:

  • NXT马达,你使用:Motor.A, Motor.B and Motor.C

  • 通过转换头连接的RXC马达,你可以使用: RCXMotor(MotorPort.A), RCXMotor(MotorPort.B) or RCXMotor(MotorPort.C)

  • 在远程NXT上的NXT马达,你可以使用:remoteNXT.Motor.A, remoteNXT.Motor.B or remoteNXT.Motor.C (其中remoteNXT是RemoteNXT类的一个实例)

  • 通过RCX马达多路器连接的RXC马达,你可以使用:rcxMotorMultiplexer.A, rcxMotorMultiplexer.B, rcxMotorMultiPlexer.C or rcxMotorMultiplexer.D, (其中 rcxMotorMultiplexer 是 RCXMotorMultiPlexer 类的一个实例)

  • RCX马达通过RCXLink类连接t远程RXC的情况,你可以使用 rcxLink.A, rcxLink.B or rcxLink.C (其中rcxLink是RCXLink类的一个实例)

返回顶部

传感器端口

如果你将一个传感器直接连到一个NXT传感器端口,你可以使用传感器端口类,并跳过这一章节。

但是如果你使用了一个端口分流器,或者一个远程NXT或RXC,那么这章节也许有些帮助。

NXT传感器端口支持三种不同类型的传感器:

  • NXT 模/数 传感器

  • I2C 传感器

  • 传统RCX传感器

根据不同类型的传感器,这有一些相对应的接口

  • 扩展了基础传感器端口的AD传感器端口

  • 扩展了基础传感器端口的I2C端口

  • 扩展了AD传感器端口的传统传感器端口

在接口层级的最上层是基础传感器端口。所有的传感器端口类都执行这个接口。这个接口允许设置一个传感器的类型和模式。这些类型和模式始终由通过基础传感器端口的接口继承来的接口传感器定义。

The types of sensors are:

传感器的类型

编码

int TYPE_NO_SENSOR

0x00;

int TYPE_SWITCH

0x01;

int TYPE_TEMPERATURE

0x02;

int TYPE_REFLECTION

0x03;

int TYPE_ANGLE

0x04;

int TYPE_LIGHT_ACTIVE

0x05;

int TYPE_LIGHT_INACTIVE

0x06;

int TYPE_SOUND_DB

0x07;

int TYPE_SOUND_DBA

0x08;

int TYPE_CUSTOM

0x09;

int TYPE_LOWSPEED

0x0A;

int TYPE_LOWSPEED_9V

0x0B;

模式是:

模式

编码

int MODE_RAW

0x00;

int MODE_BOOLEAN

0x20;

int MODE_TRANSITIONCNT

0x40;

int MODE_PERIODCOUNTER

0x60;

int MODE_PCTFULLSCALE

0x80;

int MODE_CELSIUS

0xA0;

int MODE_FARENHEIT

0xC0;

int MODE_ANGLESTEP

0xE0;

基础传感器端口的接口定义方法如下:

  • public int getMode();

  • public int getType();

  • public void setMode(int mode);

  • public void setType(int type);

  • public void setTypeAndMode(int type, int mode);

大多数使用LeJOS NXJ的时候,这些类型和模式都不需要明确设置。因为它已经由传感器类的构造器完成了。例如: 触觉传感器,光传感器和超声传感器。

NXT传感器端口 – 传感器端口 – 支持所有这些接口。之所以分开这些不同的接口,是因为有一些其他的传感器端口只能支持部分接口,并且不同类型的传感器只能执行一些特定的接口。

  • I2C传感器只能用I2C端口

  • NXT A/D 传感器只能用AD传感器

  • RCX传感器如RCX光传感器只能用传统传感器端口

分流器端口如Mind传感器Split-Nx 只能支持I2C传感器,这样,事实上,只支持I2C端口的接口。

也有一些只支持其他接口的情况。例如通用的远程传感器端口 – 远程传感器端口,目前只支持AD传感器端口的接口。

RCX传感器多路器的类,如即将推出的Mind传感器版本,将只支持传统传感器端口的接口。

返回顶部

传感器

LeJOS NXJ支持的每种传感器都有一个特定的类能够进入这个传感器。每种传感器类都有一个参数,一个支持要求的接口的传感器端口。执行接口的任一种传感器端口类都有明确的参数。传感器端口类支持所有的接口,如果被进入的传感器直接连在NXT,那么参数应该是传感器端口S1,传感器端口S2,传感器端口S3,传感器端口S4中的一个。

如果使用了端口分流器,那么参数应该是传感器端口S1,传感器端口S2,传感器端口S3,传感器端口S4中的一个。这明确了使用分流器的用哪个端口。如果多倍传感器连在分流器上,则它们每个都必须有不同的I2C地址。大多数I2C传感器可以有变化的地址-参见制造说明。要明确一个传感器所使用的地址,如果不是默认的,那就应该使用I2C传感器设置地址的方法。

leJOS NXJ支持的传感器端口和支持它们的类,以及这类型所需要的传感器端口类型都在下表中给出:

RCX 传感器

RCX传感器与触觉传感器不同,是需要提供电压的主动传感器,当测量时,会有3毫秒的短路期。

RCX 亮度传感器

RCX光传感器类支持RCX光传感器

它的构造器是:

  • public RCXLightSensor(LegacySensorPort port)

例如


RCXLightSensor light = new RCXLightSensor(SensorPort.S1);
				

RCX光传感器能自动被激活,所以电流通过它LED亮了。它可以明确的被钝化或激活。

方法如下:

  • public int readValue()

  • public void activate()

  • public void passivate()

RCX触觉传感器

RCX触觉传感器是与NXT版本类似的被动传感器, 标准的触觉传感器类能够支持它。

RCX 转动传感器

LeJOS NXJ目前不支持RCX转动传感器

RCX温度传感器

它的构造器如下:

  • public RCXTemperatureSensor(LegacySensorPort port)

  • 方法如下:

  • int readValue()

    返回原始值

  • float getCelcius()

    返回摄氏度

  • float getFarenheit()

    返回华氏度

第三方传感器及其他硬件产品

leJOS NXJ支持很多第三方传感器。其中两大第三方传感器厂商是Mindsensors 和 HiTechnic。

大多数第三方传感器和I2C传感器和扩展I2C传感器类,但是也有A/D传感器,如HiTechnic Gyro 传感器和红外搜索器。

也有一些其他第三方提供的I2C产品,它们不是传感器,而是多路器和适配器。

Mindsensors的RCX马达多路器就是一个多路器的例子。它能够在NXT传感器端口上最多连接4个RCX马达,每个都能够独立控制。

Mindstorms NRLink-Nx infra-red通讯适配器是适配器的一个例子。它能够在NXT和RCXs间进行双向通讯。它也能够控制电源功能马达。

I2C传感器

I2C传感器类可以使用基础方法进入I2C传感器,包括getData和SendData。

它也包括所有的I2C传感器执行的方法,包括getVersion, getProductID 和 getSensorType。

方法如下:

  • public int getData(int register, byte [] buf, int len)

  • public int sendData(int register, byte [] buf, int len)

  • public int sendData(int register, byte value)

  • public String getVersion()

  • public String getProductID()

  • public String getSensorType()

LeJOS NXJ使用7位 I2C地址,而I2C设备说明书通常都是给它们8位地址,其中最低位被设置为零。大多数I2C传感器使用一个默认的地址0x01,而这个说明给出0x02. 大多数I2C设备允许地址改变。

地址设置的方法可以用来设置地址,与I2C设备交谈。它的默认值是0x01。

独立的I2C设备有可以读写的寄存器,并且寄存器可以用来执行命令。每个I2C设备都有一个类可以扩展I2C传感器,有方法可以进入寄存器并执行对该传感器的命令。

I2C传感器类可以用来使一个I2C设备探测生效,汇报哪个设备连接到了哪个传感器和哪个地址-参见I2C设备范例。所有的NXT I2C传感器和其他设备都支持getVersion, getProductID and getSensorType 方法。

参见上表中完整的传感器和其他第三方设备的列表。

返回顶部