乐高 EV3 实验03 - 接触传感器,撞到就停

« 返回 LEGO 专题

实验03:接触传感器,撞到就停

这个实验做完你会得到什么

小车往前走,撞到障碍物立刻停下、后退一小段、播一声提示音,手机上同步显示碰撞次数。

这一篇的重点是 EV3 传感器的事件机制:不需要不停地去问”撞了没”, 打开一个属性开关,撞了它自己会通知你。

项目 说明
难度 ★★☆☆☆
用时 约 35 分钟
前置 实验02:差速小车遥控

一、器材与接线

器材 数量 接到
EV3 主机 + 两个大型马达 1 马达接 B、C
EV3 接触传感器 1 传感器接 S1

传感器装在车头前方,前面接一根横梁当保险杠,这样任何角度撞上去都能压到按钮。


二、界面组件

组件 命名 关键属性
按钮 按钮_出发 文本「出发」
标签 标签_碰撞 字号 32,文本「未碰撞」
标签 标签_次数 文本「碰撞次数:0」
EV3马达 EV3马达1 BluetoothClient = 蓝牙客户端1MotorPorts = BC
EV3接触传感器 EV3接触传感器1 BluetoothClient = 蓝牙客户端1SensorPort = 1PressedEventEnabled 勾选ReleasedEventEnabled 勾选
EV3声音 EV3声音1 BluetoothClient = 蓝牙客户端1

⚠️ PressedEventEnabled 必须勾选,否则 Pressed 事件永远不触发。 这是 EV3 传感器和前两个系列最大的区别:事件默认是关闭的,要在设计器里 (或代码里)显式打开。这是”传感器接对了、代码也写了、就是没反应”的头号原因。


三、分步搭代码块

第 1 步:先确认传感器能读到

when 按钮_测试.Click() {
  if EV3接触传感器1.IsPressed() {
    标签_碰撞.Text = "当前:按下"
  } else {
    标签_碰撞.Text = "当前:松开"
  }
}

中途验证:用手按住传感器再点「测试」,显示「按下」。这一步不通就别往下做 —— 检查 SensorPortBluetoothClient 属性。

IsPressed()主动查询(轮询),随时可以问。下一步用的事件是被动通知, 更省事也更及时,但需要先打开开关。

第 2 步:出发,撞到就停

global 次数 = 0

when 按钮_出发.Click() {
  EV3马达1.RotateSyncIndefinitely(40, 0)
  标签_碰撞.Text = "前进中…"
}

when EV3接触传感器1.Pressed() {
  EV3马达1.Stop(true)
  global 次数 = 次数 + 1
  标签_碰撞.Text = "撞到了!"
  标签_碰撞.TextColor = "&HFFE53935"
  标签_次数.Text = join("碰撞次数:", 次数)
  EV3声音1.PlayTone(50, 440, 300)
}

when EV3接触传感器1.Released() {
  标签_碰撞.Text = "已脱离障碍"
  标签_碰撞.TextColor = "&HFF212121"
}

中途验证:点「出发」车向前跑,撞到东西立刻停下、响一声、计数加一。

PlayTone(音量, 频率, 毫秒):音量 0~100,频率单位赫兹(440 是标准音 A), 时长毫秒。注意参数顺序是音量在前,不是频率。

第 3 步:撞到后自动后退

global 次数 = 0

when EV3接触传感器1.Pressed() {
  EV3马达1.Stop(true)
  global 次数 = 次数 + 1
  标签_次数.Text = join("碰撞次数:", 次数)
  EV3声音1.PlayTone(50, 440, 300)
  EV3马达1.RotateSyncInDuration(-40, 800, 0, true)
  EV3马达1.RotateSyncInDuration(40, 600, 100, true)
}

中途验证:撞到后车自动倒退约 0.8 秒,再原地转向约 0.6 秒 —— 一个最简单的避障行为。

RotateSyncInDuration(功率, 毫秒, 转向比, 是否刹车)阻塞式的:转完才继续下一条。 所以倒退和转向会依次执行,不用自己加延时。

想让它转完继续往前跑,在最后再加一条 RotateSyncIndefinitely但要小心: 那样会变成永动的避障小车,记得留一个停止按钮。

第 4 步:停止与收尾

when 按钮_停.Click() {
  EV3马达1.Stop(true)
  标签_碰撞.Text = "已停止"
}

when Screen1.BackPressed() {
  EV3马达1.Stop(true)
  蓝牙客户端1.Disconnect()
}

四、排错表

现象 原因与处理
撞了没反应,但 IsPressed 能读到 PressedEventEnabled 没勾选。这是最常见的一条
IsPressed 也读不到 SensorPort 和实际插的端口不一致;② BluetoothClient 属性没设;③ 传感器线松了
一次碰撞触发好几次 保险杠回弹造成多次按下。加一个”上次触发时间”判断,间隔小于 500 毫秒的忽略
车撞上去还在硬顶 Stop 前面漏了,或事件没触发(见第一条)
后退动作没执行完就停 RotateSyncInDuration 是阻塞的,中途被别的指令打断了
撞到才停,来不及 接触传感器只能”撞到才知道”。要提前避障用 实验05 超声波

五、下一步


相关文档

文档反馈