版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://programus.blogbus.com/logs/51151014.html
本文含有大量代码格式以及高亮,论坛无法支持,为获得更好的视觉效果,推荐点击上面链接查看BLOG原文。(主要是我懒得在此再调一次……)
Motor类介绍Motor类是对NXT马达的一个逻辑抽象。众所周知,一个马达必须链接到NXT的三个输出端口上的一个才能够生效。因此,Motor类为每一个端口提供了一个已经实现好了的实例。他们分别是:Motor.A,Motor.B和Motor.C。Motor类提供了控制马达的各种方法,同时也提供了检查马达状态和参数的方法。
本指南将围绕5个例子程序展开。你可以通过试着自己书写这些例子来理解如何控制NXT的马达。这些例子都非常简单,哪怕你没有太多的Java经验,也可以成功地书写它们。在最后,还有一个关于其他马达方法的讨论,这些方法虽然没有在我们的例子程序中用到,但或许对你要做的机器人来说却是有用的。
程序一 - 基本运动控制本程序中使用了最基本的马达运动控制方法。
程序中用到的方法
类
|
方法名
|
说明
|
Motor
|
forward()
|
启动马达,并向前转动
|
|
backward()
|
启动马达,并向后转动
|
|
changeDirection()
|
逆转马达转动方向
|
|
stop()
|
立即停止马达
|
Button
|
waitForPress()
|
等待任意键被按下
|
LCD
|
drawString(String str, int x, int y)
|
在屏幕上绘制字符串
|
程序将会以如下流程运行:- 启动马达A,并向前转动
- 在屏幕第一行显示 FORWARD
- 等待任意键被按下
- 马达A反向转动
- 在屏幕下一行显示 BACKWARD
- 等待任意键被按下
- 向前转动马达A
- 在屏幕下一行显示 FORWARD
- 等待任意键被按下
- 停止马达
以上表中的Motor方法,每个只调用了一次。
程序二 - 使用转速计NXT马达里面有一个内置的转速计在不断地跟踪马达当前转过的角度(单位为度)。本程序的目的是使用转速计来看一下马达会停得多快。
程序中用到的方法
类
|
方法名
|
说明
|
Motor
|
flt()
|
float的缩写,关闭马达供电,但不启动刹车
|
|
getTachoCount()
|
返回马达角度,单位:度
|
|
resetTachocount()
|
重置马达旋转角度为0
|
|
setSpeed(int speed)
|
设置马达旋转速度。 参数speed – 每秒转过的角度值。 可以被精确维持的最大速度大约是电池电压值的110倍。
|
|
int getRotationSpeed()
|
返回马达的实际速度,单位:度/秒
|
LCD
|
drawInt()
|
在屏幕上绘制整数
|
程序将会以如下流程运行:- 启动并正向转动马达A
- 等待马达转角达到360度
- 停止马达
- 等待马达实际停止
- 在屏幕上显示马达停止时实际转过的角度数
- 等待按键,以便让你有足够的时间读取屏幕
- 设置马达转速为720度/秒(默认转速为360度/秒)
- 重设马达转角归零
- 重复步骤1-6。
注:为了防止重复书写相同的代码,你可以写一个方法来执行1-6步,然后调用。
当你完成上面程序之后,试着将stop()方法替换为flt()方法再试一次。(flt是float的缩写,因为float是Java保留字,无法使用,所以使用flt来定义方法名。)flt()方法将停止马达供电,但允许其随着惯性继续转动。
你会看到,即便使用stop()方法进行刹车处理,马达也不会立即停止,而是因为惯性稍微转过一点点。
程序三 - 精确旋转控制Motor类里面包含一个校准器(regulator)线程,始终在运行。校准器有两个任务,其中之一是让马达在指定的角度处停止。本程序将测试rotate()方法的精确度。
程序中用到的方法
类
|
方法名
|
说明
|
Motor
|
rotate(angle)
|
转过由angle参数指定的角度。参数单位为角度。
|
|
rotateTo(angle)
|
旋转至由angle参数指定的角度。参数单位为角度。
|
|
rotateTo(angle, true)
|
旋转至由angle参数指定的角度 并重置马达旋转角度为0
|
程序将会以如下流程运行:- 显示Rotation字样,等待按键
- 按任意键后,旋转马达两圈后停止
- 在屏幕上显示从马达中读取的角度
- 将马达转回初始位置
- 在屏幕上第二行显示从马达中读取的角度
- 等待按键,以便让你有足够的时间读取屏幕
- 按任意键后,清屏
- 设置马达转速为800
- 重复步骤1-7。
注:为了防止重复书写相同的代码,你可以写一个方法来执行1-7步,然后调用。
译注:原文部分数字与例子程序不符,翻译时进行了修正。
你将观察到由于校准器的工作,通常实际转角与设定转角的误差在一度以内。校准器会计算马达刹车后会由于惯性产生的转角,并据此提前发出刹车指令。之后,它还会进行微调,以保证马达的实际停止位置尽可能接近设定值。
后续请看此帖:http://www.cmnxt.com/thread-3636-1-1.html