LEGO NXC 编程快速入门_第1页
LEGO NXC 编程快速入门_第2页
LEGO NXC 编程快速入门_第3页
LEGO NXC 编程快速入门_第4页
LEGO NXC 编程快速入门_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Version 1.0 重庆大坪 刘刚 2008 年 7 月 图片来自 LEGO 官方网站 项目 A 动起来,机器人 在本项目中,我将借助我们的第一个程序,向大家演示机器人编程的基本思路。程序非 常的简单,控制机器人向前移动 8 秒钟,然后后退 8 移钟,最后停下来。 在开始编程之前,我们首先要构造好一个 Lego Mindstorms NXT 机器人。 为了使项目容易化以便进行演示,我们构造最简单的三轮机器人,命名为 MyRobot。 它的动力系统由三个马达来构成, 将右边的发动机连接到智能块的端口 A, 将左边的发动机 连接到端口 C,第三个马达连接到智能块的端口 B。 另外一个重要的准备

2、工作就是, 请确保已经正确地安装好 Mindstorms NXT Fantom 驱动 程序。 我们使用 BricxCC IDE 来对机器人进行编程,打开它,程序提示需要定位机器人。启动 机器人并点击 OK,BricxCC 将自动搜索并找到机器人,显示用户界面如下所示: 用户操作界面看起来与标准的文本编辑器非常相似。除了有常用的菜单和功能按钮外, 还有一些进行机器人编程的特设功能菜单, 比如将程序进行编译并下载给机器人的菜单, 或 者从机器人中获取信息的菜单等。 现在我们开始编写一个新程序,点击 New File(新文件)按钮创建一个空白的新窗口。 然后输入如下 NXC 程序代码: Task m

3、ain() OnFwd(OUT_A,60) ; / 启动马达 A,速度为 60%。 / 马达参数的值由 0 到 100,其中 100 为最快,0 为停留在原位 OnFwd(OUT_C,60) ; / 启动马达 C,机器人开始向前移动 Wait(8000) / 等待 8 秒钟。注意,是持续上面的动作的时间,而不是“停下来等待” ; OnRev(OUT_AC,60) ;/ 后退 Wait(8000) ; / 等待 8 秒钟 Off(OUT_AC) ; / 关闭马达 NXC 全称 Not eXactly C,它采用了与 C 语言非常类似的语法结构,这就意味着稍有编 程知识的人会很容易地学习 NXC。

4、同时,与通用的编程语言明显区别的是,因为 NXT 编译 器的原故,NXC 受到了许多方面的限制(所以它才叫 NXC,即“不完全 C”语言嘛) 。 在 NXC 中,程序由 task(任务)来组成,也就是说,每个程序可以有一个或多个任务, 但至少必须包括一个任务,那就是 main 任务。我们的第一个程序非常简单,只有一个任务, 那就是 main 任务。一个任务由若干命令组成,我们称之为语句,它位于所属任务的括号间; 每条语句以分号表示结束。 编写好程序后,开始进行编译,也就是说将 NXC 代码转换成二进制代码以便机器人能 够理解和执行。然后使用 USB 电缆将程序传送给机器人,也就是所谓的下载/d

5、ownloading。 编译并下载后,就可以运用程序了。找到 My Files OnBrick 菜单下的 Software files,然后点 击 run/运行。 项目 B 前进,转弯 我们将机器人的运动编程更进一步, 下面的程序让机器人前进一段距离, 然后利用停止 /倒退其中一个马达的方法,使机器人右转 90 度。 Task main() OnFwd(OUT_AC, 60) ; Wait(900) ; OnRev(OUT_C, 60) ; Wait(320) ; Off(OUT_AC) ; 取决于机器人所行走表面的材质,我们需要为 Wait()函数尝试不同的数据,以便确 保机器人能够正确完成

6、 90 度的转弯。为了使程序更具理解性,我们这样修改一下程序的设 计。 / 头两行定义了两个常量,这样不仅可以使程序更具可读性,而且还便于进行修改。 #define MOVE_TIME 900 / 预设移动的时间 #define TURN_TIME 320 / 预设转弯的时间 Task main() OnFwd(OUT_AC, 60) ; Wait(MOVE_TIME) ; OnRev(OUT_C, 60) ; Wait(TURN_TIME) ; Off(OUT_AC) ; 接下来,我们增加一点小小的难度,首先还是让机器人前进一段距离,然后随机地决定 左转或右转。程序如下: #define M

7、OVE_TIME 900 #define TURN_TIME 320 Task main() While(true) OnFwd(OUT_AC, 60) ; Wait(MOVE_TIME) ; If(Random()>=0) OnRev(OUT_C, 60) ; Else OnRev(OUT_A,60) ; Wait(TURN_TIME) ; 备注:本教程的内容是如何使用 NXC 语言对机器人进行编程,它需要读者具备一些最基础 的编程知识(比如,知道什么是变量、表达式、程序的常见流程控制等等,针对这些内容 的讲解将不会出现在本教程中) 。 项目 C 马达控制高级篇当我们使用 Off (功

8、能函数时,马达会立即停下来,刹车并停在原来的位置上。如果 想要机器人平缓地停下来而不使用制动闸,就需要使用 Float (功能函数或 Coast (功能 函数。OnFwdReg (ports, speed, regmode OnRevRge (ports, speed, regmode Ports 参数为马达连接的端口号Speed 参数为移动的速度Regmode 参数的可选值有:OUT_REGMODE_IDLE 不运用 PID 规则OUT_REGMODE_SPEED 控制马达以恒定速度,即使它预先设置了数值OUT_REGMODE_SYNC 将端口所指定的一组马达同步常用的进行运动控制的高级命令

9、还有:RotateMotor (ports, speed, degrees rotateMotorEx (ports, speed, degrees, turnpct, sync, stop 其中 degrees 为旋转角度turnpct 为行驶百分比项目 D 遇到障碍物,我闪通过使用 NXT 传感器,能够使机器人与外部环境或事件作出相应的反应。首先,在开 始进行编程之前, 我们需要将一个触觉传感器添加到机器人的前端护栏上面, 然后将它连接 到 NXT 的输入端口 1。下面的程序代码将实现如下功能:让机器人前进,直到它碰撞到什么东西后便停下来。Task main(SetSensor (IN_1

10、, SENSOR_TOUCH ;/* 定义使用什么类型的传感器。其中 IN_1为传感器所连接的端口号,其它的参数还可以 为 IN_2, IN_3和 IN_4。 SENSOR_TOUCH表明使用的是什么类型的传感器,在本例中为触 觉传感器。 */OnFwd (OUT_AC, 60 ;Until(SENSOR_1= =1 ; / 如果碰到什么东西就跳出循环到下一条语句, 使机器人停下来 Off (OUT_AC ;更进一步,假设机器人碰撞到什么障碍物,我们让它后退一点,然后转弯,接下来继续 前进。程序代码如下所示:Task main(SetSensorTouch(IN_1 ;OnFwd (OUT_A

11、C, 75 ; / 前进While(true if (SENSOR_1= =1 / 碰撞障碍物OnRev (OUT_AC, 60 ; Wait (200 ; / 后退OnFwd (OUT_A, 60 ; Wait (200 ; / 转弯OnFwd (OUT_AC, 60 ; / 继续前进下面, 我们来看一个经典的应用实例, 就是让机器人能够沿着指定的黑线行走。 首先将 灯光传感器连接到输入端口 3,然后输入如下程序代码:#define THRESHOLD 38Task main(SetSensorLight(IN_3 ; / 将端口 3设置为灯光传感器OnFwd (OUT_AC, 60 ;Wh

12、ile (true If (Sensor (IN_3 >THRESHOLDOnRev (OUT_C, 60 ;Wait (100 ; / 为了能够使移动更加平滑 Until (Sensor (IN_3 <=THRESHOLD ; OnFwd (OUT_AC, 60 ; 图片来自 LEGO 官方网站项目 E 我听到了,我看到了在这里,我们还将演示声音传感器和超声波传感器的使用。假设有如下的情境, 机器人听到一个响声后开始前进, 直到听到另一个响声后停止移动。 首先,将声音传感器连接到端口 2。#define THRESHOLD 38#define SOUND SENSOR_2Task

13、 main(SetSensorSound(IN_2 ;While (true Until (SOUND > THRESHOLD ;OnFwd (OUT_AC, 60 ;Wait (320 ;Until (SOUND > THRESHOLD ;Off (OUT_AC ;Wait (320 ;在接下来的例子中,我们利用超声波传感器,使机器人能够“看到” 障碍物并在发生 碰撞之前避开它(这一点与触觉传感器不同,触觉传感器需要碰撞到才会触发相应事件 。 首先,将声音传感器连接到端口 4。#define NEAR 18 / 预设距离为 18cmTask main(SetSensorLowsp

14、eed(IN_4 ;While(true OnFwd (OUT_AC, 60 ;While (SensorUS (IN_4 >NEAR ;Off (OUT_AC ;OnRev (OUT_C, 90 ;Wait (600 ;项目 F 传感器高级篇SetSensor (功能函数做了两件事情:设置传感器的类型,以及传感器的操作方式。我 们将两者展开来有:SetSensorType (的主要参数有:SENSOR_TYPE_TOUCHSENSOR_TYPE_LIGHT_ACTIVESENSOR_TYPE_SOUND_DBSENSOR_TYPE_LOWSPEED_9V 超音波传感器SetSensor

15、Mode (有八种不同的操作方式:最重要的参数是 SENSOR_MODE_RAW,它指定一个从 0到 1023的数值SENSOR_MODE_BOOL 触觉传感器的缺省方式SENSOR_MODE_CELSIUS和 SENSOR_MODE_FAHRENHEIT是温度传感器SENSOR_MODE_PERCENT 对应于灯光传感器SENSOR_MODE_ROTATION 对应于旋转传感器SENSOR_MODE_EDGE和 SENSOR_MODE_PULSE 用于计数, ClearSensor (清除计数接下来我们来看第二个经典应用,利用 SENSOR_ROTATION确保机器人沿直线前进。 对于直线行

16、进而言, 要求两个轮子的速度一样, 但事实上马达不可以精确地以相同的速度运 作。 通过使用连接到机器人两个轮子上的旋转传感器, 我们可以察觉哪个轮子转得更快一些, 然后进行调节控制,以确定机器人沿直线行进。程序代码如下:Task main(SetSensor (IN_1, SENSOR_ROTATION ; ClearSensor (IN_1 ;SetSensor (IN_3, SENSOR_ROTATION ; ClearSensor (IN_3 ;While (true If (SENSOR_1 < SENSOR_3 OnFwd(OUT_A, 60 ; Float (OUT_C ;

17、Else if (SENSOR_1 > SENSOR_3 OnFwd(OUT_C, 60 ; Float (OUT_A ; Else OnFwd(OUT_AC,60 ; 项目 G 我是 K 歌之王不发出点声音,当我不存在呀,哼!LEGO NXT使用了 .rso 格式的声音文件。 在 BricxCC 软件中有一个将 .wav 文件转变为 .rso 文件的工具,它位于 Tools 菜单下的 Sound conversion。PlayFileEx (filename , volume, loop? / 播放声音的命令Filename 为指定的声音文件,V olume 音量大小,其数值从 0到

18、4。Loop 是否循环播放PlayToneEx (frequency , duration, volume, loop? ; / 播放音乐的命令Frequency 声音频率,单位为赫兹。Duration 持续时间。使用 BricxCC 中的组件 Brick Piano,我们可以非常轻松地创建音乐。 图片来自 LEGO 官方网站项目 H 一边走一边唱在 NXC 中,任务是同时执行的,也就是人们平常所说的并行运行(嘿嘿嘿,我们是 不是经常一边听音乐,一边聊 QQ ,还一边下载电影呀,这就是多任务并行运行,美其名谓 提高对资源的利用率 。在编写程序的过程中, 如果结构设计不好的话, 并行任务可能会造

19、成一些问题, 其中某 个任务会干涉另外的任务。假设我们有如下两个任务设定, 一个任务是让机器人沿街道行进; 另一个任务是使用触 觉传感器,当它碰到什么东西时,就后退一点并转动 90度。为了解决资源争抢的问题,我们使用 semaphor/旗语来保确机器人在任何时刻都只有一 个任务被执行,从而实现并行操作。完成上述任务的完整程序代码如下所示:Int sem; / 假定有一个变量 sem ,当它的数值为 0表示没有任务(资源是空闲的 Task move_square(While (true Until (sem= =0 ; sem=1;OnFwd (OUT_AC, 60 ;Sem=0;Wait (9

20、00 ;Until (sem= =0 ; sem=1;OnRev (OUT_C, 60 ;Sem=0;Wait (800 ;Task submain(SetSensor (SENSOR_1= =1Until (sem= =0 ; sem=1;OnRev (OUT_AC, 60 ; Wait (600 ;OnFwd (OUT_A, 60 , Wait (800 ;Sem=0;Task main(Sem=0;Precedes(move_square, submain ;项目 I 与机器人进行沟通我们可以使用电缆将计算机与机器人连接起来进行沟通, 还可以使用蓝牙技术对机器人 进行无线控制。通过彼此间

21、的通信,我们可以让多个机器人协同工作(或彼此战斗 ,还可 以使用两个 NXT 来创建一个大的更为复杂的机器人。对于旧版本的 RCX 而言,这非常简单,只需要发送 InfraRed 信息,所有的机器人都能 够接收到。 但对于 NXT 来说就全部不同了, 首先, 我们必须将两个或更多的 NXT (或 NXT 与计算机连接起来,通过使用 Bluetooth/蓝牙菜单,才能将信息发送给被连接的设备。 开始执行连接工作的 NXT 称之为 Master/主机, 它占用 o 号线; 其它被连接的称为 Slave/附机,分别占用 1、 2、 3号线。下面有两段程序, 一个是运行在主机上的, 一个是运行在从机上

22、的。 这些最基本的程序 演示了如何利用 NXT 无线网络在两个机器人间进行通讯。 为了协调主机与从机之间进行通讯 的同步问题,我们使用了十六进制数值 0xFF 作为 Ack 标识。/ 主机#define BT_CONN 1#define OUTBOX 5#define INBOX 1#define CLEARLINE(L TextOut(0, L, " "sub BTCheck(int connif (!BluetoothStatus (conn= =NO_ERRTextOut(5, LCD_LINE2, "Error"Wait(1000;Stop(tr

23、ue;task main(int ack;int i;BTCheck(BT_CONN;TextOut(10, LCD_LINE1,"Master sending"while(truei = Random(512;CLEARLINE(LCD_LINE3;NumOut(5, LCD_LINE3, i;ack = 0;SendRemoteNumber(BT_CONN, OUTBOX, i;until(ack= =0xFFuntil(ReceiveRemoteNumber(INBOX, true, ack = = NO_ERR;Wait(250;从 机 上 的 程 序 与 之 非

24、常 类 似 , 只 是 使 用 了 SendResponseNumber 功 能 函 数 替 代 SendRemoteNumber 罢了。从机只能发送信息给它的主机。/ 从机#define BT_CONN 1#define OUT_MBOX 1#define IN_MBOX 5sub BTCheck(int connif (!BluetoothStatus(conn= =NO_ERRTextOut(5, LCD_LINE2, "Error"Wait(900;Stop(true;task main(int in;BTCheck(0;TextOut(5,LCD_LINE1,&q

25、uot;Slave receiving"SendResponseNumber(OUT_MBOX, 0xFF; / 可以继续发送while(trueif (ReceiveRemoteNumber(IN_MBOX,true,in != STAT_MSG_EMPTY_MAILBOX TextOut(0, LCD_LINE3," "NumOut(5, LCD_LINE3, in;SendResponseNumber(OUT_MBOX, 0xFF;使用蓝牙通信技术还有许多非常酷的特征, 那就是主机可以直接控制它的从机。 在接下 来的例子中, 主机直接发送指令给从机, 命令它

26、播放音乐并进行移动。 在这里并没有任何从 机的程序,因为从机的 NXT 固件自己能够接收和管理那些指令信息。/ 主机#define BT_CONN 1#define MOTOR(p,s RemoteSetOutputState(BT_CONN, p, s, OUT_MODE_MOTORON+OUT_MODE_BRAKE+OUT_MODE_REGULATED, OUT_REGMODE_SPEED, 0, OUT_RUNSTATE_RUNNING, 0sub BTCheck(int connif (!BluetoothStatus(conn=NO_ERRTextOut(5, LCD_LINE2,"Error"Wait(900;Stop(true;task main(BTCheck(BT_CONN;RemotePlayTone(BT_CONN, 4000, 100;until(BluetoothStatus(BT_CONN= =NO_ERR;Wait(100;RemotePlaySoundFile(BT_CONN, "! Click.rso", false; until(BluetoothStatus(BT_CONN= =NO_ERR;Wait(600;RemoteResetMotorPosition

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论