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 无法直接照做;其余四篇的思路和代码结构都通用,把组件名按对照表替换即可。
扫码添加客服咨询