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

下载本文档

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

文档简介

Version 1 0 重庆大坪 刘刚 2008 年 7 月 图片来自 LEGO 官方网站 项目项目 A 动起来 机器人动起来 机器人 在本项目中 我将借助我们的第一个程序 向大家演示机器人编程的基本思路 程序非 常的简单 控制机器人向前移动 8 秒钟 然后后退 8 移钟 最后停下来 在开始编程之前 我们首先要构造好一个 Lego Mindstorms NXT 机器人 为了使项目容易化以便进行演示 我们构造最简单的三轮机器人 命名为 MyRobot 它的动力系统由三个马达来构成 将右边的发动机连接到智能块的端口 A 将左边的发动机 连接到端口 C 第三个马达连接到智能块的端口 B 另外一个重要的准备工作就是 请确保已经正确地安装好 Mindstorms NXT Fantom 驱动 程序 我们使用 BricxCC IDE 来对机器人进行编程 打开它 程序提示需要定位机器人 启动 机器人并点击 OK BricxCC 将自动搜索并找到机器人 显示用户界面如下所示 用户操作界面看起来与标准的文本编辑器非常相似 除了有常用的菜单和功能按钮外 还有一些进行机器人编程的特设功能菜单 比如将程序进行编译并下载给机器人的菜单 或 者从机器人中获取信息的菜单等 现在我们开始编写一个新程序 点击 New File 新文件 按钮创建一个空白的新窗口 然后输入如下 NXC 程序代码 Task main 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 同时 与通用的编程语言明显区别的是 因为 NXT 编译 器的原故 NXC 受到了许多方面的限制 所以它才叫 NXC 即 不完全 C 语言嘛 在 NXC 中 程序由 task 任务 来组成 也就是说 每个程序可以有一个或多个任务 但至少必须包括一个任务 那就是 main 任务 我们的第一个程序非常简单 只有一个任务 那就是 main 任务 一个任务由若干命令组成 我们称之为语句 它位于所属任务的括号间 每条语句以分号表示结束 编写好程序后 开始进行编译 也就是说将 NXC 代码转换成二进制代码以便机器人能 够理解和执行 然后使用 USB 电缆将程序传送给机器人 也就是所谓的下载 downloading 编译并下载后 就可以运用程序了 找到 My Files OnBrick 菜单下的 Software files 然后点 击 run 运行 项目 B 前进 转弯 项目 B 前进 转弯 我们将机器人的运动编程更进一步 下面的程序让机器人前进一段距离 然后利用停止 倒退其中一个马达的方法 使机器人右转 90 度 Task main OnFwd OUT AC 60 Wait 900 OnRev OUT C 60 Wait 320 Off OUT AC 取决于机器人所行走表面的材质 我们需要为 Wait 函数尝试不同的数据 以便确 保机器人能够正确完成 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 MOVE 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 功能函数时 马达会立即停下来 刹车并停在原来的位置上 如果 想要机器人平缓地停下来而不使用制动闸 就需要使用 Float 功能函数或 Coast 功能 函数 OnFwdReg ports speed regmode OnRevRge ports speed regmode Ports 参数为马达连接的端口号 Speed 参数为移动的速度 Regmode 参数的可选值有 OUT REGMODE IDLE 不运用 PID 规则 OUT REGMODE SPEED 控制马达以恒定速度 即使它预先设置了数值 OUT REGMODE SYNC 将端口所指定的一组马达同步 常用的进行运动控制的高级命令还有 RotateMotor ports speed degrees rotateMotorEx ports speed degrees turnpct sync stop 其中 degrees 为旋转角度 turnpct 为行驶百分比 项目项目 D 遇到障碍物 我闪遇到障碍物 我闪 通过使用 NXT 传感器 能够使机器人与外部环境或事件作出相应的反应 首先 在开 始进行编程之前 我们需要将一个触觉传感器添加到机器人的前端护栏上面 然后将它连接 到 NXT 的输入端口 1 下面的程序代码将实现如下功能 让机器人前进 直到它碰撞到什么东西后便停下来 Task main SetSensor IN 1 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 AC 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 38 Task main SetSensorLight IN 3 将端口 3 设置为灯光传感器 OnFwd OUT AC 60 While true If Sensor IN 3 THRESHOLD OnRev OUT C 60 Wait 100 为了能够使移动更加平滑 Until Sensor IN 3 THRESHOLD OnFwd OUT AC 60 Wait 320 Until SOUND THRESHOLD Off OUT AC Wait 320 在接下来的例子中 我们利用超声波传感器 使机器人能够 看到 障碍物并在发生 碰撞之前避开它 这一点与触觉传感器不同 触觉传感器需要碰撞到才会触发相应事件 首先 将声音传感器连接到端口 4 define NEAR 18 预设距离为 18cm Task main SetSensorLowspeed 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 TOUCH SENSOR TYPE LIGHT ACTIVE SENSOR TYPE SOUND DB SENSOR TYPE LOWSPEED 9V 超音波传感器 SetSensorMode 有八种不同的操作方式 最重要的参数是 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 确保机器人沿直线前进 对于直线行进而言 要求两个轮子的速度一样 但事实上马达不可以精确地以相同的速度运 作 通过使用连接到机器人两个轮子上的旋转传感器 我们可以察觉哪个轮子转得更快一些 然后进行调节控制 以确定机器人沿直线行进 程序代码如下 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 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 为指定的声音文件 Volume 音量大小 其数值从 0 到 4 Loop 是否循环播放 PlayToneEx frequency duration volume loop 播放音乐的命令 Frequency 声音频率 单位为赫兹 Duration 持续时间 使用 BricxCC 中的组件 Brick Piano 我们可以非常轻松地创建音乐 图片来自 LEGO 官方网站 项目项目 H 一边走一边唱一边走一边唱 在 NXC 中 任务是同时执行的 也就是人们平常所说的并行运行 嘿嘿嘿 我们是 不是经常一边听音乐 一边聊 QQ 还一边下载电影呀 这就是多任务并行运行 美其名谓 提高对资源的利用率 在编写程序的过程中 如果结构设计不好的话 并行任务可能会造成一些问题 其中某 个任务会干涉另外的任务 假设我们有如下两个任务设定 一个任务是让机器人沿街道行进 另一个任务是使用触 觉传感器 当它碰到什么东西时 就后退一点并转动 90 度 为了解决资源争抢的问题 我们使用 semaphor 旗语来保确机器人在任何时刻都只有一 个任务被执行 从而实现并行操作 完成上述任务的完整程序代码如下所示 Int sem 假定有一个变量 sem 当它的数值为 0 表示没有任务 资源是空闲的 Task move square While true Until sem 0 sem 1 OnFwd OUT AC 60 Sem 0 Wait 900 Until sem 0 sem 1 OnRev OUT C 60 Sem 0 Wait 800 Task submain SetSensor SENSOR 1 1 Until 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 与机器人进行沟通与机器人进行沟通 我们可以使用电缆将计算机与机器人连接起来进行沟通 还可以使用蓝牙技术对机器人 进行无线控制 通过彼此间的通信 我们可以让多个机器人协同工作 或彼此战斗 还可 以使用两个 NXT 来创建一个大的更为复杂的机器人 对于旧版本的 RCX 而言 这非常简单 只需要发送 InfraRed 信息 所有的机器人都能 够接收到 但对于 NXT 来说就全部不同了 首先 我们必须将两个或更多的 NXT 或 NXT 与计算机 连接起来 通过使用 Bluetooth 蓝牙菜单 才能将信息发送给被连接的设备 开始执行连接工作的 NXT 称之为 Master 主机 它占用 o 号线 其它被连接的称为 Slave 附机 分别占用 1 2 3 号线 下面有两段程序 一个是运行在主机上的 一个是运行在从机上的 这些最基本的程序 演示了如何利用 NXT 无线网络在两个机器人间进行通讯 为了协调主机与从机之间进行通讯 的同步问题 我们使用了十六进制数值 0 xFF 作为 Ack 标识 主机 define BT CONN 1 define OUTBOX 5 define INBOX 1 define CLEARLINE L TextOut 0 L sub BTCheck int conn if BluetoothStatus conn NO ERR TextOut 5 LCD LINE2 Error Wait 1000 Stop true task main int ack int i BTCheck BT CONN TextOut 10 LCD LINE1 Master sending while true i Random 512 CLEARLINE LCD LINE3 NumOut 5 LCD LINE3 i ack 0 SendRemoteNumber BT CONN OUTBOX i until ack 0 xFF until ReceiveRemoteNumber INBOX true ack NO ERR Wait 250 从机上的程序与之非常类似 只是使用了 SendResponseNumber 功能函数替代 SendRemoteNumber 罢了 从机只能发送信息给它的主机 从机 define BT CONN 1 define OUT MBOX 1 define IN MBOX 5 sub BTCheck int conn if BluetoothStatus conn NO ERR TextOut 5 LCD LINE2 Error Wait 900 Stop true task main int in BTCheck 0 TextOut 5 LCD LINE1 Slave receiving SendResponseNumber OUT MBOX 0 xFF 可以继续发送 while true if ReceiveRemoteNumber IN MBOX true in STAT MSG EMPTY MAILBOX TextOut 0 LCD LINE3 NumOut 5 LCD LINE3 in SendResponseNumber OUT MBOX 0 xFF 使用蓝牙通信技术还有许多非常酷的特征 那就是主机可以直接控制它的从机 在接下 来的例子中 主机直接发送指令给从机 命令它播放音乐并进行移动 在这里并没有任何从 机的程序 因为从机的 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 0 sub BTCheck int conn if BluetoothStatus conn NO ERR TextOut 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 BT CONN OUT A true until BluetoothSta

温馨提示

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

评论

0/150

提交评论