找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 5720|回复: 0

LeJOS NXJ入门指南 - 控制马达(下)

[复制链接]
发表于 2010-9-26 12:25:29 | 显示全部楼层 |阅读模式
上集链接:http://www.cmnxt.com/thread-3636-1-1.html

程序四 - 中断旋转
有时候你可能想在马达转到指定角度之前停掉它(或者做些其他什么事情)。本程序将检测按键,当你在马达达到指定角度前按下按键,马达将会立即停止。前面介绍过的rotate()方法在马达到达指定角度并停止前不会返回(译注:也就是程序不会运行到下一行代码)。但下面我们要介绍的新方法,则可以在调用后立刻返回。如果没有其他代码干扰马达的运转,马达仍会在到达指定角度后停止。

程序中用到的方法
方法名
说明
Motor
rotate(angle, immediateReturn)
这两个方法的功能与前面的相同,但当immediateReturn参数为true的时候,可以在调用后立即返回。

rotateTo(angle, immediateReturn)

boolean isMoving()
检测马达是否仍在运转。

int readButtons()
返回按下按钮的ID。

程序将会以如下流程运行:
  • 显示Interrupt rotation字样,鸣叫两声,等待按键
  • 按任意键后,马达开始旋转,如果没有干扰,将旋转两圈(720°)
  • 当马达旋转时,在屏幕左侧显示从马达中读取的角度
  • 当任意键按下时,停止马达
  • 当马达完全停止后,在屏幕右侧显示马达停止时的所在角度
  • 等待按键
  • 按任意键后,向回转,目标为转回至初始位置
  • 重复步骤3 - 6
你将观察到当你按下按键时,马达将会在达到指定角度前停止。
译注:上面示例代码中使用的程序并非针对最新的LeJOS版本,如果你是用v0.85,请进行如下替换:
Motor.A.isRotating() –> Motor.A.isMoving()
Motor.A.getActualSpeed() –> Motor.A.getRotationSpeed()


程序五 - 校准马达速度
之前我们提到过了校准器的一个任务,校准器的另一个任务,是控制马达的速度。需要校准速度的一个原因是两轮驱动的车辆只有在两个马达以完全相同的速度运转时才会走直线。(显而易见的道理。)标准LEGO软件通过直接同步两个马达来解决这一问题。NXJ则使用了另一种方法:让两个马达都与系统时钟同步。校准器会将马达的旋转角度与速度乘以运行时间作比较,并调节功率(power)来保证两者尽可能匹配。当你调用任何一个上面提到过的方法时,校准器都会将运行时间和马达的旋转角度重新归零。

程序中用到的方法
方法名
说明
Motor
regulateSpeed(boolean yes)
设置校准器开启与否。默认为开启。
Stopwatch
elapsed()
返回运行时间。单位为毫秒。

reset()
将时钟重置为0。
Stopwatch类在lejos.util包中。
程序将会以如下流程运行:
  • 创建一个秒表(Stopwatch)
  • 让所有三个马达以每秒两圈(720度/秒)的速度运转
  • 每隔200毫秒,在屏幕上的同一行显示出三个马达实际转过的角度值
  • 重复执行8次步骤3,每次结果显示在不同行上。
  • 记下各个马达转角间的最大差值
  • 关闭校准器
  • 重复步骤1 - 5
当校准器开启时,马达间的角度误差将在几度以下。当校准器关闭时,角度误差将随着时间的推移不断增大。如果你足够幸运,得到了刚好完全匹配的三个马达,或许结果会有所不同。
何时可能需要关闭速度校准?
有些机器人,对速度的精确度要求并不高,或者是通过传感器数值来控制马达。对于这样的机器人,频繁速度校准将对机器人CPU造成浪费。在这种情况下,可以考虑关闭校准器。比如巡线机器人和平衡机器人。

何时应该使用速度校准?
如果你指定了一个非常慢的速度,马达功率可能会无法抗衡内部阻力,所以马达或许会永远静止不动。在这种情况下,rotate()方法如果被调用了,就永远不会返回。如果开启了速度校准,校准器将不断提成功率直到马达达到了指定速度。

其他马达方法监测马达
  • boolean isMoving()
    检测马达是否在动。马达在运动时返回true,否则返回false。
  • boolean isRotating()
    检测马达的rotate()或者rotateTo()方法引起的运动是否仍在进行。译注:此方法在最新版本中已经去掉。
  • int getLimitAngle()
    返回目前马达旋转的目标角度。译注:就是rotate()方法或者rotateTo()方法中指定的角度。
  • boolean isRegulating()
    检测马达的速度校准器是否开启。
  • int getSpeed()
    返回当前速度设定。译注:这里返回的是设定的速度。
  • int getRotationSpeed()
    返回马达的实际运转速度。实际速度将会每隔100毫秒更新一次,精确度在±10°/秒。此方法可以用来检测马达是否已经失速。译注:在早期版本中,此方法为getActualSpeed()。
  • int getPower()
    返回当前功率设置。取值范围在0到100之间。
  • int getMode()
    返回当前马达所处状态
    代码
    马达状态
    1
    向前旋转(forward)
    2
    向后旋转(backward)
    3
    停止(stop)
    4
    惯性滑行(float)

以下方法也可以取得马达状态:
  • boolean isForward()
  • boolean isBackward()
  • boolean isStopped()
  • boolean isFloating()
杂项方法
  • setPower(int aPower)
    直接设置马达功率。参数值在0到100之间。如果速度校准器开启,请不要使用此方法。因为速度校准器会随时改变功率。
  • resetTachoCount()
    将转速计数值归零。此方法会将校准器用以监测何时停止马达的源数据重置。
  • lock()
    通常来说,当马达停止时,会有一些阻力阻止其转动。但在有些应用场景下,比如负重机器人,重力足以胜过阻力从而让马达运动。此方法将通过校准器线程为马达提供一些动力功率以保证马达停在指定位置上。


评分

参与人数 1乐币 +20 收起 理由
晓舟 + 20

查看全部评分

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-5-9 01:24 , Processed in 0.090442 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表