项目 6:智能窗帘(60 分)
任务描述
用电机、驱动模块及多种传感器(按键、遥控、语音等)设计智能卷帘。包含三个子任务,分别实现:
- 按键控制:按键开关控制正/反转 1 秒
- 遥控控制:遥控器按键长按控制正/反转(松开即停)
- 语音控制:语音命令控制正/反转 1 秒
鼓励用一套程序实现多个任务。
核心:电机的正反转控制,以及通过不同传感器(数字输入、模拟遥控信号、语音识别)实现同一被控对象(电机)的多样化人机交互。
所需硬件
- Steamania JoyKit V2(主控制器)
- 直流电机模块
- 电机驱动模块(L298N 或类似)
- 按键模块(2 个按键:正转/反转)
- 红外遥控模块
- 语音识别模块(可选)
核心任务
任务 1:按键控制(20 分)
- 按下正转按键 → 电机正转 1 秒
- 按下反转按键 → 电机反转 1 秒
任务 2:遥控控制(20 分)
- 长按遥控正转按键 → 电机正转(松开即停)
- 长按遥控反转按键 → 电机反转(松开即停)
任务 3:语音控制(20 分)
- 说"打开窗帘" → 电机正转 1 秒
- 说"关闭窗帘" → 电机反转 1 秒
参考方案
程序代码
; 智能窗帘程序
; 实现按键、遥控和语音控制电机
; 初始化 - 第 000-005 行
000 C1 0001 0000 ; 启用按键输入
001 C2 0001 0000 ; 启用红外遥控
002 C4 0001 0000 ; 启用语音识别(可选)
003 C9 0001 0000 ; 启用电机控制
004 0E 0000 0010 ; 跳转到第 010 行的主循环
; 主循环 - 检查所有输入 - 第 010-03F 行
010 04 0001 0020 ; 如果按键按下(R01 > 0),跳转到按键控制
011 04 0002 0030 ; 如果遥控按下(R02 > 0),跳转到遥控控制
012 04 0003 0040 ; 如果检测到语音(R03 > 0),跳转到语音控制
013 D9 0000 0000 ; 停止电机(无输入)
014 0E 0000 0010 ; 跳转回第 010 行(继续监控)
; 按键控制 - 第 020-02F 行
020 04 0064 0024 ; 如果 R01 > 100(正转按键),跳转到正转
021 04 00C8 0028 ; 如果 R01 > 200(反转按键),跳转到反转
022 0E 0000 0010 ; 无效按键,返回主循环
024 D9 0001 0000 ; 电机正转
025 02 03E8 0000 ; 延时 1000 毫秒(1 秒)
026 D9 0000 0000 ; 停止电机
027 0E 0000 0010 ; 返回主循环
028 D9 0002 0000 ; 电机反转
029 02 03E8 0000 ; 延时 1000 毫秒(1 秒)
02A D9 0000 0000 ; 停止电机
02B 0E 0000 0010 ; 返回主循环
; 遥控控制 - 第 030-03F 行
030 04 000A 0034 ; 如果 R02 == 10(遥控按键 A),正转
031 04 0014 0038 ; 如果 R02 == 20(遥控按键 B),反转
032 0E 0000 0010 ; 无效遥控,返回主循环
034 D9 0001 0000 ; 电机正转(按住时)
035 04 000A 0034 ; 检查按键是否仍按住
036 02 0064 0000 ; 延时 100 毫秒
037 0E 0000 0034 ; 继续按住
038 D9 0002 0000 ; 电机反转(按住时)
039 04 0014 0038 ; 检查按键是否仍按住
03A 02 0064 0000 ; 延时 100 毫秒
03B 0E 0000 0038 ; 继续按住
; 语音控制 - 第 040-04F 行
040 04 0001 0044 ; 如果 R03 == 1(语音"打开"),正转
041 04 0002 0048 ; 如果 R03 == 2(语音"关闭"),反转
042 0E 0000 0010 ; 无语音命令,返回主循环
044 D9 0001 0000 ; 电机正转
045 02 03E8 0000 ; 延时 1000 毫秒(1 秒)
046 D9 0000 0000 ; 停止电机
047 0E 0000 0010 ; 返回主循环
048 D9 0002 0000 ; 电机反转
049 02 03E8 0000 ; 延时 1000 毫秒(1 秒)
04A D9 0000 0000 ; 停止电机
04B 0E 0000 0010 ; 返回主循环
详细解释
初始化(第 000-005 行)
第 000 行:C1 0001 0000
- 启用按键输入模块
- 物理按键控制所必需
第 001 行:C2 0001 0000
- 启用红外遥控模块
- 遥控操作所必需
第 002 行:C4 0001 0000
- 启用语音识别模块
- 语音命令控制的可选模块
第 003 行:C9 0001 0000
- 启用电机控制模块
- 电机操作所必需
第 004 行:0E 0000 0010
- 跳转到第 010 行的主循环
主循环 - 输入监控(第 010-014 行)
第 010 行:04 0001 0020
- 条件跳转:如果按键按下(R01 > 0),跳转到按键控制
第 011 行:04 0002 0030
- 条件跳转:如果遥控按下(R02 > 0),跳转到遥控控制
第 012 行:04 0003 0040
- 条件跳转:如果检测到语音(R03 > 0),跳转到语音控制
第 013 行:D9 0000 0000
- 停止电机(无活动输入)
第 014 行:0E 0000 0010
- 继续监控循环
任务 1:按键控制(第 020-02B 行)
第 020 行:04 0064 0024
- 条件跳转:如果 R01 > 100(正转按键阈值)
- 按键值 > 100 表示正转按键按下
第 021 行:04 00C8 0028
- 条件跳转:如果 R01 > 200(反转按键阈值)
- 按键值 > 200 表示反转按键按下
第 024 行:D9 0001 0000
- 电机正转
- 指令
0xD9控制电机方向
第 025 行:02 03E8 0000
- 延时 1000 毫秒(1 秒)
- 按键控制的固定持续时间
第 026 行:D9 0000 0000
- 停止电机
任务 2:遥控控制(第 030-03B 行)
第 030 行:04 000A 0034
- 条件跳转:如果 R02 == 10(遥控按键 A 代码)
- 遥控器为每个按键发送特定代码
第 031 行:04 0014 0038
- 条件跳转:如果 R02 == 20(遥控按键 B 代码)
第 034 行:D9 0001 0000
- 按住按键时电机正转
第 035 行:04 000A 0034
- 检查按键是否仍按住
第 036 行:02 0064 0000
- 延时 100 毫秒
第 037 行:0E 0000 0034
- 如果按键按住则继续
关键区别:遥控控制使用"按住并持续"逻辑 - 电机仅在按键按住时运行。
任务 3:语音控制(第 040-04B 行)
第 040 行:04 0001 0044
- 条件跳转:如果 R03 == 1(语音命令"打开")
- 语音模块将命令映射到寄存器值
第 041 行:04 0002 0048
- 条件跳转:如果 R03 == 2(语音命令"关闭")
第 044 行:D9 0001 0000
- 电机正转 1 秒
第 045 行:02 03E8 0000
- 延时 1000 毫秒
第 046 行:D9 0000 0000
- 停止电机
关键概念
1. 电机控制
使用指令 0xD9 进行电机控制:
D9 0001 0000= 正转D9 0002 0000= 反转D9 0000 0000= 停止
2. 输入优先级
程序按顺序检查输入:
- 按键控制(最高优先级)
- 遥控控制
- 语音控制(最低优先级)
3. 控制模式
- 按键模式:固定 1 秒持续时间
- 遥控模式:按住时持续(点动)
- 语音模式:固定 1 秒持续时间
4. 传感器集成
多个传感器可以控制同一执行器:
- 按键:数字输入(R01)
- 遥控:模拟/数字输入(R02)
- 语音:数字输入(R03)
评估标准
| 标准 | 优秀 (5) | 良好 (4) | 合格 (3) | 需改进 (2) |
|---|---|---|---|---|
| 按键控制 | 可靠的按键操作 | 小问题 | 工作但有延迟 | 按键不工作 |
| 遥控控制 | 平滑的按住控制 | 小延迟 | 工作不一致 | 遥控不工作 |
| 语音控制 | 准确的语音识别 | 偶尔错误 | 识别有限 | 语音不工作 |
| 电机控制 | 平滑的正反转 | 小问题 | 操作粗糙 | 电机工作不正常 |
| 集成 | 所有 3 种模式无缝工作 | 小集成问题 | 模式分别工作 | 集成失败 |
| 代码质量 | 整洁、模块化代码 | 良好结构 | 代码能工作但混乱 | 代码不工作 |
扩展挑战
- 位置检测:添加限位开关检测完全打开/关闭位置
- 自动关闭:使用光传感器在日落时自动关闭窗帘
- 障碍物检测:如果检测到障碍物则停止电机(电流检测)
- 定时:编程在特定时间打开/关闭窗帘
- APP 控制:添加蓝牙/WiFi 用于智能手机控制
相关文档
- 指令集总结 - 完整指令集概述