乐高 NXT 对照篇 - 上一代砖头怎么用

« 返回 LEGO 专题

NXT 对照篇:上一代砖头怎么用

这一篇解决什么

手上是 LEGO MINDSTORMS NXT(上一代,橙色按钮那款)而不是 EV3 时, 前面六篇的思路完全适用,但组件名和方法名不一样

这篇给出一张对照表和几段可直接用的代码,让你能照着 EV3 系列做下来。

项目 说明
难度 ★★☆☆☆
用时 约 30 分钟
前置 EV3 实验01实验02(思路一致)

一、连接方式:和 EV3 完全一样

NXT 同样走经典蓝牙(SPP),同样要先在手机系统设置里配对,配对码同样是 1234

连接代码和 EV3 实验01 第 1 步一字不差,直接照抄:

when 列表选择器_设备.BeforePicking() {
  列表选择器_设备.Elements = 蓝牙客户端1.AddressesAndNames
}

when 列表选择器_设备.AfterPicking() {
  if 蓝牙客户端1.Connect(列表选择器_设备.Selection) {
    标签_状态.Text = "已连接"
  } else {
    标签_状态.Text = "连接失败"
  }
}

二、组件对照表

EV3 组件 NXT 组件 主要差异
EV3马达 Nxt电机驱动器 NXT 的是整车驱动接口(前进/后退/转弯),不是单马达控制
EV3接触传感器 Nxt接触传感器 几乎一样
EV3颜色传感器 Nxt颜色传感器 NXT 没有”模式”概念,方法直接分开
EV3超声波传感器 Nxt超声波传感器 一样
EV3陀螺仪传感器 NXT 没有官方陀螺仪
EV3声音 (用 Nxt指令发送器)  
EV3绘图 NXT 屏幕不支持远程绘图
EV3指令发送器 Nxt指令发送器 NXT 这个功能更多(文件操作、读端口)
Nxt光线传感器 EV3 把它并进了颜色传感器
Nxt声音传感器 EV3 没有这个

三、驱动:NXT 更简单

EV3 要自己算转向比,NXT 的 Nxt电机驱动器 直接给了语义化方法

when 按钮_前.TouchDown() {
  Nxt电机驱动器1.MoveForwardIndefinitely(50)
}

when 按钮_后.TouchDown() {
  Nxt电机驱动器1.MoveBackwardIndefinitely(50)
}

when 按钮_左.TouchDown() {
  Nxt电机驱动器1.TurnCounterClockwiseIndefinitely(40)
}

when 按钮_右.TouchDown() {
  Nxt电机驱动器1.TurnClockwiseIndefinitely(40)
}

when 按钮_停.Click() {
  Nxt电机驱动器1.Stop()
}

Nxt电机驱动器1DriveMotors 属性填驱动轮所在端口,默认 BC

走固定距离:

when 按钮_走一米.Click() {
  Nxt电机驱动器1.MoveForward(50, 1000)
}

MoveForward(功率, 距离) —— 距离单位是厘米还是毫米取决于 WheelDiameter 属性 的设置口径,先小距离试一次再放大。

NXT 的 Stop() 没有参数,EV3 的 Stop(useBrake) 有一个刹车参数,别抄混。


四、传感器:事件开关同样要打开

和 EV3 一样,NXT 传感器的事件默认是关闭的,要在设计器里勾上对应的 XxxEventEnabled 属性。这仍然是”接对了也没反应”的头号原因。

接触传感器

when Nxt接触传感器1.Pressed() {
  Nxt电机驱动器1.Stop()
  标签_状态.Text = "撞到了"
}

光线传感器(巡线用这个,不是颜色传感器)

when 计时器1.Timer() {
  var 亮度 = Nxt光线传感器1.GetLightLevel()
  标签_状态.Text = join("亮度:", 亮度)
  if 亮度 > 500 {
    Nxt电机驱动器1.TurnClockwiseIndefinitely(30)
  } else {
    Nxt电机驱动器1.TurnCounterClockwiseIndefinitely(30)
  }
}

NXT 光线传感器的量程和 EV3 不一样(通常是 0~1023 左右,不是 0~100), 所以阈值不能照抄 EV3 那篇。先读几个值看看范围再定阈值 —— 标定的方法见 EV3 实验04 第 2 步,思路通用。

GenerateLight 属性控制是否打开红光补光。巡线要打开,测环境光要关掉。

声音传感器(EV3 没有的)

when 计时器1.Timer() {
  var 音量 = Nxt声音传感器1.GetSoundLevel()
  标签_状态.Text = join("音量:", 音量)
  if 音量 > 60 {
    Nxt电机驱动器1.MoveForwardIndefinitely(40)
  }
}

拍手启动的小车,用这个几行就能做出来。

超声波

when 计时器1.Timer() {
  var 距离 = Nxt超声波传感器1.GetDistance()
  标签_状态.Text = join("距离:", 距离, " cm")
  if 距离 < 20 {
    Nxt电机驱动器1.Stop()
  }
}

五、查主机信息

when 按钮_信息.Click() {
  标签_信息.Text = join("电量 ", Nxt指令发送器1.GetBatteryLevel(), "\n名称 ", Nxt指令发送器1.GetBrickName(), "\n固件 ", Nxt指令发送器1.GetFirmwareVersion())
}

Nxt指令发送器 比 EV3 那个功能多:还能列文件、删文件、下载文件到主机、 读任意端口的原始值(GetInputValues)。做进阶项目时值得翻一翻组件文档。


六、排错表

现象 原因与处理
列表里没有 NXT 没在手机系统设置里配对,配对码 1234
连上了但不动 DriveMotors 属性和实际端口不一致(默认 BC
传感器事件不触发 对应的 XxxEventEnabled 属性没勾选
照抄 EV3 的代码报错 方法名不同,见第二节对照表;Stop() 无参数
巡线阈值不对 NXT 光线传感器量程与 EV3 不同,重新标定
走的距离不对 WheelDiameter 没按实际轮子设置
电量低时行为异常 NXT 用 6 节 5 号电池,电量低时马达明显无力,先换电池

七、下一步

NXT 没有陀螺仪和远程绘图,所以 实验05实验06 无法直接照做;其余四篇的思路和代码结构都通用,把组件名按对照表替换即可。


相关文档

文档反馈