控制马达
感谢网友 动力老男孩 的翻译


控制马达

Motor类介绍

Motor类是对NXT马达的一个逻辑抽象。一个马达必须链接到NXT的三个输出端口上的一个才能够生效。因此,Motor类为每一个端口提供了一个已经实现好了的实例。他们分别是:Motor.A,Motor.B和Motor.C。Motor类提供了控制马达的各种方法,同时也提供了检查马达状态和参数的方法。

本指南将围绕5个例子程序展开。你可以通过试着自己书写这些例子来理解如何控制NXT的马达。这些例子都非常简单,哪怕你没有太多的Java经验,也可以成功地书写它们。在最后,还有一个关于其他马达方法的讨论,这些方法虽然没有在我们的例子程序中用到,但或许对你要做的机器人来说却是有用的。

程序1 - 基本运动控制

本程序中使用了最基本的马达运动控制方法。

程序中用到的方法

方法名

说明

Motor

forward()

启动马达,并向前转动

 

backward()

启动马达,并向后转动

 

changeDirection()

逆转马达转动方向

 

stop()

迅速停止马达

Button

waitForPress()

等待任意按钮被按下

LCD

drawString(String str, int x, int y)

在屏幕上绘制字符串

请编写一段程序完成以下功能:
  1. 启动马达A,并向前转动

  2. 在屏幕第一行显示 FORWARD

  3. 等待任意键被按下

  4. 反向转动马达

  5. 在屏幕下一行显示 BACKWARD

  6. 等待任意键被按下

  7. 向前转动马达A

  8. 在屏幕下一行显示 FORWARD

  9. 等待任意键被按下

  10. 停止马达

你可以把上述的每个函数仅用一次,来实现这些功能。

答案看这里

返回顶部

程序2 - 使用转速计

NXT马达里面有一个内置的转速计在不断地跟踪马达当前转过的角度(单位为度)。本程序的目的是使用转速计来看一下马达会停得多快。

程序中用到的新方法

方法名

说明

Motor

flt()

float的缩写,关闭马达供电,但不启动刹车

 

getTachoCount()

返回马达角度,单位:度

 

resetTachocount()

重置马达旋转角度为0

 

setSpeed(int speed)

speed – 每秒转过的角度值. 可以被精确维持的最大速度大约是电池电压值的110倍。

 

int getActualSpeed()

返回马达的实际速度,单位:度/秒

LCD

drawInt()

在屏幕上绘制整数

请编写一段程序完成以下功能:
  1. 启动并正向转动马达A

  2. 等待马达转角达到360度

  3. 停止马达

  4. 等待马达实际停止

  5. 在屏幕上显示马达停止时实际转过的角度数

  6. 等待按键,以便让你有足够的时间读取屏幕

  7. 设置马达转速为720度/秒(默认转速为360度/秒)

  8. 重设马达转角归零

  9. 重复步骤1-6。注:为了防止重复书写相同的代码,你可以写一个方法来执行1-6步,然后调用。

当你完成上面程序之后,试着将stop()方法替换为flt()方法再试一次。 ( flt是float的缩写,因为float是Java保留字,无法使用,所以使用flt来定义方法名。). flt()方法将停止马达供电,但允许其随着惯性继续转动。

你会看到,即便使用stop()方法进行刹车处理,马达也不会立即停止,而是因为惯性稍微转过一点点。

答案看这里

返回顶部

程序3 - 精确旋转控制

马达类有个调节进程一直在工作. 它主要有两个作用,其中之一是在特定的角度停止马达的工作. 这个程序会判断rotate()方法的准确性.

在程序中需要用到的新方法

方法名称

说明

Motor

rotate(angle)

旋转 angle 角度

 

rotateTo(angle)

旋转到角度为 angle 的位置

 

rotateTo(angle,true)

把角度计数器置零

请编写一段程序完成以下功能:
  1. 让马达完整的旋转一周.

  2. 在LCD屏第1行上显示转速计的读数.

  3. 将马达旋转至角度0.

  4. 在LCD屏第2行上显示转速计的读数.

  5. 等待按键按下,主要是给你看LCD上的读数

  6. 清屏.

  7. 将速度设置为720.

  8. 重复步骤1-6.

注意: 你可以使用一个子函数执行这些步骤,以避免重复的代码.

如果马达监视器正常工作的话,你会发现马达会停止在在指定角度的1度范围内。它通过计算得知马达还需要运行多远就需要刹闸。在到达指定角度前,它就需要刹闸。最后它需要对马达的位置进行微小的调整,使马达能够足够接近预设的角度.

答案看这里

返回顶部

程序 4.中断旋转

有时在马达到达指定角度前,你希望它停下来(或者做点别的事情)。如果你尽快的按下按键,那么这个程序会检测到按键被按下,然后就中断旋转任务。rotate() 方法在马达到达目标角度前是不会返回的。但这个程序中的新方法可以立刻返回。除非一个新的马达方法又开始运行,否则这个马达会保持停止在当前角度。

程序中用到的新方法

方法名

说明

Motor

rotate(angle,immediateReturn)

immediateReturn 参数为 true 时,这个函数会立即返回


rotateTo(angle,immediateReturn)


(boolean)isRotating()

如果马达被中止的话,这个函数将返回 false

Button

int readButtons()

返回被按下的按钮ID

请编写一段程序完成以下功能:
  1. 开始旋转720度.

  2. 当马达旋转时,在第一行显示转速器计数。

  3. 当有按键按下时,停止马达.

  4. 当马达停下后,在这行的中心显示转速器计数.

  5. 等待按键按下.

  6. 开始旋转到0度.

  7. 重复步骤 2,3,5.

注意观察: 如果你在旋转完成前按下按键,马达会停止,而不会完成旋转。否则,stop() 方法就没有效果了.

答案看这里

返回顶部

程序 5: 调节马达速度

调节进程的另一个重要功能是控制马达转速。其中一个原因是,如果想让两轮车在一条直线上行驶,必须让两个马达转速一致。(显然是这样)。标准的乐高软件通过直接让两个马达同步解决了这个问题。NXJ 使用了不同的方法:让每个马达旋转与系统时钟同步。校准器通过转速乘以使用时间来比较转数器计数(减去它的参考计数),再调整功率使这两个数目相匹配。当你需要使用任何马达方法时,调节进程将它的参考计数和使用时间置为0,并重新开始比较。

程序中用到的新方法

方法名

说明

Motor

regulateSpeed(booleanyes)

默认情况下,速度管理是可用的

Stopwatch

elapsed()

返回使用的时间,单位是毫秒

 

reset()

把计时器置零

Stopwatch类在lejos.util包里.

请编写一段程序完成以下功能:
  1. 创建一个新秒表.

  2. 让3个马达开始以2转/秒开始旋转.

  3. 每200ms,就在同一行显示3个转速器的数值。

  4. 重复步骤3 8次,每次都使用不同的行.

  5. 写下你能看到的这些马达转速器数值中最大的不同.

  6. 关掉速度调节.

  7. 重复步骤1-5.

当速度调节开着时,马达们彼此间的误差被控制在一个小角度内。当速度调节关掉时, 旋转角度的误差会随时间变大,除非你的运气足够好,买到一系列匹配的非常好的马达。

答案在这里

返回顶部

什么时候需要关掉速度调节呢?

在一些机器人中,马达速度不应该一直不变,而是要随着传感器读数而变化,例如寻线或平衡机器人。如果速度修正频繁发生,那么使用CPU循环的校准器在调整时,通过调整马达功率以保持速度不变将没有任何优势。

什么时候需要使用速度调节呢?

当你指定了一个非常慢的速度,用来维持它的功率可能不足以克服马达内耗,这是马达将不会转动。在这个情况下,rotate() 将永远不会返回. 但是如果使用了速度调节,校准器将会保持功率升高直到这个马达达到相应的速度。

返回顶部

其他马达方法

看看马达正在做些什么

  • boolean isMoving();

    这个用于测试马达是否完成旋转。当马达不论任何原因开始旋转时,isMoving()都会返回true。(例如,执行forward() or backward(),或者正在进行rotate() )

  • boolean isRotating()

    专用来判断当前是否正在进行旋转

  • int getLimitAngle()

    返回目前马达正在旋转的角度

  • boolean isRegulating()

    用来判断速度调节是否打开

  • int getSpeed()

    返回当前速度设定值

  • int getActualSpeed()

    返回马达的实际速度。这个每100ms就更新一次,并且精确到 +- 10 度/秒. 可以使用这个方法检测马达是否停止转动。

  • int getPower()

    在0-100的范围内,返回当前功率设置.

  • int getMode()

    返回当前马达状态的编码

Code

马达状态

1

forward(正向)

2

backward(反向)

3

stop(停止)

4

float(应该指惯性移动)

以下是得到马达状态的其他方法:

  • boolean isForward()

  • boolean isBackward()

  • boolean isStopped()

  • boolean isFloating()

多种多样的其他马达方法

  • setPower(int aPower)

    可以直接用来控制马达功率。使用范围是0-100. 如果使用了速度调节就不用用这个方法,因为校准器会一直不断的调整功率。

  • resetTachoCount()

    这个方法不仅会把转速器计数置0,还会通过校准器决定何时停止旋转任务,重置到起点。

  • lock()

    通常,当马达停止时,它会有一些阻止旋转的力。但是,在某些应用中,例如举重机器人,地心引力可能就足够克服这些阻力了。这个方法使得校准器应用额外的功率以保持马达在正确的位置。

返回顶部