实验03:接触传感器,撞到就停
这个实验做完你会得到什么
小车往前走,撞到障碍物立刻停下、后退一小段、播一声提示音,手机上同步显示碰撞次数。
这一篇的重点是 EV3 传感器的事件机制:不需要不停地去问”撞了没”, 打开一个属性开关,撞了它自己会通知你。
| 项目 | 说明 |
|---|---|
| 难度 | ★★☆☆☆ |
| 用时 | 约 35 分钟 |
| 前置 | 实验02:差速小车遥控 |
一、器材与接线
| 器材 | 数量 | 接到 |
|---|---|---|
| EV3 主机 + 两个大型马达 | 1 | 马达接 B、C |
| EV3 接触传感器 | 1 | 传感器接 S1 |
传感器装在车头前方,前面接一根横梁当保险杠,这样任何角度撞上去都能压到按钮。
二、界面组件
| 组件 | 命名 | 关键属性 |
|---|---|---|
| 按钮 | 按钮_出发 |
文本「出发」 |
| 标签 | 标签_碰撞 |
字号 32,文本「未碰撞」 |
| 标签 | 标签_次数 |
文本「碰撞次数:0」 |
| EV3马达 | EV3马达1 |
BluetoothClient = 蓝牙客户端1、MotorPorts = BC |
| EV3接触传感器 | EV3接触传感器1 |
BluetoothClient = 蓝牙客户端1、SensorPort = 1、PressedEventEnabled 勾选、ReleasedEventEnabled 勾选 |
| EV3声音 | EV3声音1 |
BluetoothClient = 蓝牙客户端1 |
⚠️
PressedEventEnabled必须勾选,否则Pressed事件永远不触发。 这是 EV3 传感器和前两个系列最大的区别:事件默认是关闭的,要在设计器里 (或代码里)显式打开。这是”传感器接对了、代码也写了、就是没反应”的头号原因。
三、分步搭代码块
第 1 步:先确认传感器能读到
when 按钮_测试.Click() {
if EV3接触传感器1.IsPressed() {
标签_碰撞.Text = "当前:按下"
} else {
标签_碰撞.Text = "当前:松开"
}
}
中途验证:用手按住传感器再点「测试」,显示「按下」。这一步不通就别往下做 ——
检查 SensorPort 和 BluetoothClient 属性。
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 超声波 |
五、下一步
- 实验04:颜色传感器巡线 —— 让车自己沿黑线走
- EV3 超声波避障 —— 撞之前就知道有障碍
扫码添加客服咨询