乐高 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电机驱动器1 的 DriveMotors 属性填驱动轮所在端口,默认 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 无法直接照做;其余四篇的思路和代码结构都通用,把组件名按对照表替换即可。


相关文档

文档反馈