实验06:屏幕表情与音效
这个实验做完你会得到什么
手机上点几个按钮,EV3 屏幕上画出笑脸/哭脸,主机喇叭弹出一小段旋律, 再点一下显示主机电量和固件版本。
前五篇都在让机器人”动”,这一篇让它”表达” —— 做互动作品、儿童教学时特别有用。
| 项目 | 说明 |
|---|---|
| 难度 | ★★☆☆☆ |
| 用时 | 约 35 分钟 |
| 前置 | 实验01:连上机器人 |
一、器材清单
| 器材 | 数量 | 说明 |
|---|---|---|
| EV3 主机 | 1 | 不需要马达和传感器,只用主机自带的屏幕和喇叭 |
二、界面组件
| 组件 | 命名 | 关键属性 |
|---|---|---|
| 按钮 | 按钮_笑脸 / 按钮_哭脸 / 按钮_清屏 |
|
| 按钮 | 按钮_旋律 |
文本「弹一段」 |
| 按钮 | 按钮_信息 |
文本「查看主机信息」 |
| 标签 | 标签_信息 |
多行显示 |
| EV3绘图 | EV3绘图1 |
BluetoothClient = 蓝牙客户端1 |
| EV3声音 | EV3声音1 |
BluetoothClient = 蓝牙客户端1 |
| EV3指令发送器 | EV3指令发送器1 |
BluetoothClient = 蓝牙客户端1 |
EV3 屏幕是 178×128 的单色屏,坐标原点在左上角。颜色参数只有两个值: 1 = 黑(画上去)、0 = 白(擦掉)。
三、分步搭代码块
第 1 步:画一个笑脸
when 按钮_笑脸.Click() {
EV3绘图1.FillScreen(0)
EV3绘图1.DrawCircle(1, 60, 40, 8, true)
EV3绘图1.DrawCircle(1, 118, 40, 8, true)
EV3绘图1.DrawLine(1, 60, 85, 80, 95)
EV3绘图1.DrawLine(1, 80, 95, 98, 95)
EV3绘图1.DrawLine(1, 98, 95, 118, 85)
标签_状态.Text = "画好了笑脸"
}
中途验证:EV3 屏幕上出现两只实心眼睛和一张上扬的嘴。
FillScreen(0)是用白色填满 = 清屏,每次重画前先清一次,否则会和上一幅叠在一起。
DrawCircle(颜色, x, y, 半径, 是否填充)、DrawLine(颜色, x1, y1, x2, y2)。 嘴巴是三段直线拼的 —— 这块屏幕没有画弧的方法。
第 2 步:换个表情
when 按钮_哭脸.Click() {
EV3绘图1.FillScreen(0)
EV3绘图1.DrawCircle(1, 60, 40, 8, true)
EV3绘图1.DrawCircle(1, 118, 40, 8, true)
EV3绘图1.DrawLine(1, 60, 100, 80, 88)
EV3绘图1.DrawLine(1, 80, 88, 98, 88)
EV3绘图1.DrawLine(1, 98, 88, 118, 100)
EV3声音1.PlayTone(50, 200, 600)
}
when 按钮_清屏.Click() {
EV3绘图1.FillScreen(0)
}
中途验证:哭脸的嘴角朝下,同时响一声低沉的音。
笑脸和哭脸只差嘴巴那三条线的 y 坐标 —— 把中间两点抬高、两端点压低就成了哭脸。
第 3 步:弹一段旋律
global 音符 = list(262, 294, 330, 349, 392, 440, 494, 523)
global 第几个 = 0
when 按钮_旋律.Click() {
global 第几个 = 0
计时器1.TimerEnabled = true
}
when 计时器1.Timer() {
global 第几个 = 第几个 + 1
if 第几个 > length(音符) {
计时器1.TimerEnabled = false
标签_状态.Text = "弹完了"
} else {
EV3声音1.PlayTone(60, 音符[第几个], 250)
标签_状态.Text = join("第 ", 第几个, " 个音")
}
}
加一个 计时器1,计时器启用取消勾选、间隔 300。
中途验证:点「弹一段」,EV3 依次弹出 do-re-mi-fa-so-la-si-do 一个音阶。
PlayTone(音量, 频率, 毫秒)—— 音量在前,别写反。 频率就是音高:262 是中央 C,523 是高八度的 C。计时器间隔要比音长稍大(300 > 250),不然上一个音还没响完就被下一个打断, 听起来是糊在一起的。
第 4 步:查主机信息
when 按钮_信息.Click() {
标签_信息.Text = join("电量 ", EV3指令发送器1.GetBatteryVoltage(), " V\n固件 ", EV3指令发送器1.GetFirmwareVersion(), "\n硬件 ", EV3指令发送器1.GetHardwareVersion())
}
中途验证:显示电池电压(满电约 8 V 左右)和固件版本号。
电量低是很多”怪问题”的真凶:马达转不动、动作不准、蓝牙老掉线 —— 排查前先看一眼电压。
EV3指令发送器还有一个KeepAlive(分钟),可以防止主机自动休眠断连。
四、排错表
| 现象 | 原因与处理 |
|---|---|
| 屏幕没反应 | ① BluetoothClient 属性没设;② 没连上(先看实验01);③ EV3 停在了某个菜单界面,回到主界面再试 |
| 画的图重叠在一起 | 每次画之前没 FillScreen(0) 清屏 |
| 图形画到屏幕外 | 屏幕只有 178×128,坐标别超 |
| 颜色参数填 2、3 没效果 | 单色屏只有 0(白)和 1(黑) |
| 旋律糊成一片 | 计时器间隔小于等于音长,把间隔调大 |
| 声音很小 | PlayTone 第一个参数是音量(0~100),调到 80 试 |
| 一会儿就断连 | 主机自动休眠。用 KeepAlive 或在 EV3 设置里关掉休眠 |
五、下一步
- 实验07:NXT 对照篇 —— 手上是上一代砖头的话看这篇
- 把表情和 实验03 碰撞 结合:撞到就显示哭脸并叫一声
扫码添加客服咨询