当前课程知识点:ARM微控制器与嵌入式系统 > 第五章 ARM微控制器的各种外设 > E6 挑战实验 > E6 挑战实验
各位同学大家好
我是清华大学工程物理系的曾鸣老师
欢迎大家继续回到我们
ARM微控制器与嵌入式系统MOOC课堂
那么这个单元呢
是我自己非常喜欢的一个单元
我叫做挑战性实验
这个单元在我们线上课程里
很难来考核大家
但是在我们过去8年10年
在清华开课的过程当中
这个单元是大家最后拿到学分
最最重要的一个单元
就是用一个挑战性的实验
让大家自己来融会贯通
完成一个创意的设计
那么我最早说过我们这个课呢
在清华开设的时候
一般不会考试
而是采用一种开放式设计的方式来考核
那么这种考核有规定动作有选定动作
如果我们在学校里的考核
老师会给出四个题目
大家可以选择当中的N个题目来完成
当然我会说最最最低要求
是要大于等于1道题
那么我们在平分的时候这四个任务
任务一任务二加起来
等于任务三或者等于任务四
然后鼓励大家进行自由的原创
那么对于这每一个任务的完成
会从它的工作量
会从它的技术含量
以及它的那个创意
那个想法棒不棒
来进行一个综合的评价
那么我给大家来看一看
老师规定动作的任务是哪些
再给大家提示提示
看看大家还能有什么样的想法
需要特别说明的是呢
在清华开设这样一门课程的时候
我会鼓励大家用自己的代码
自己的想法来设计实现这些功能
而且同样重要的是
我的考核除了呈现代码
呈现作品之外
还会要求每个同学到台前
来给大家讲一讲自己的设计
特别讲一讲自己设计的得意之处
也给大家讲一讲自己调试当中
最最郁闷和土鳖的那些情况
一个优秀的工程设计人员
不仅要善于设计
还要善于沟通和表达
把你的妙处给讲出来 对吧
那来看看我们的任务
任务是越来越难和越来越有意思的
第一个任务非常的简单
就是完成一个反映速度测试仪
那么它的基本模式就是说你数码管上
或者OLED管上显示一个倒计时
然后倒计时一结束
在随机的任何时候
突然量一个灯或者给一个信号
那么测试人员看到信号后按键
那么测试这个信号
给出到人按键之间的时间间隔
然后加以记录
并且在你的数码管或者OLED屏上加以显示
说你的反映时间是多少
然后你可以通过长按键重新开始 对吧
那么这样一个小小的任务
要想做漂亮做干净
我给大家一个小提示
比如说你要杜绝出现抢跑的情况
比如说提示信息还没给
我按了一下
就是抢跑 对不对
然后你要防止作弊
其实有很多同学都是倒计时3、2、1亮灯
那玩的次数多了就会知道
从3、2、1自己心里开始准备
直接按
那个反映时间就会很短
所以从倒计时结束到什么时候亮灯
中间应该是一个随机数
大家想想是不是这个道理
然后还有一点
我们人的反映时间的测试
大家应该有一个预估
大家中学可能学过膝跳反射
敲一下你的膝盖它会弹起
这中间是有一个时间间隔的
人的反应时间一般在
几十毫秒到百毫秒这种量级
所以注意设计你的定时模块
以合适的精度来测量这样一个时间间隔
既不能太精细
位数太多
也不能太粗略
任何人测上去都是一位或者两位数 对吧
所以这些提示完了大家会发现
这么一个简单的任务
要做的漂漂亮亮 特别好玩
其实还是有难度的
当然我还见过有同学把它做成彩灯的
OLED显示屏显示图案的
各种各样的加强版 增强版 花式的 对吧
这都是大家可以自由创意的
那么第二个任务呢
就更Common一些
就是大家来做一个功能完备的打盹闹钟
那么这个闹钟要求呢
如果计时精度到0.01秒
然后可以设置打盹的时间
比如说是0到30分钟
然后开始时这个钟应该是停止的
然后连续按键
它可以计时或者是继续重新计时
或者停止计时
那么如果闹铃完了以后
我们还可以通过拍击几个按键
让它进行打盹
比如再睡5分钟是吧
很多同学都很喜欢这个功能
然后对于这样一个闹钟的闹的方式
可以是简单的蜂鸣
可以是音乐
我们都学过PWM音乐 对不对
可以是音乐跟闪烁图像组合
大家可以自由的设计
那么如何把这样一种人机交互的操作
做的相对功能完善
最最简单的小到一个按键是否做防抖
大到一些功能在逻辑上是否会锁死
你可能学会画一画
这个人际交互这些按键之间的关系图
所以任务一任务二都相对简单
但是把它们做起来还是有一些难度的
任务三
开始好玩一点是个小游戏
我们可以做一个手指的
type type跳舞机小游戏 对不对
就像这张图所示
用两个指头变成两只腿
所以有很多同学我给大家之前展示过
用我们上面的数码管也行
用OLED显示屏也行
归根结底就是在屏幕上
随机产生一些特殊的符号
可以是上下左右
也可以是音符
然后随着它的持续
我们要把对应的这些符号给正确的按下去
那么要把这样一个功能做完善
LED产生的彩色灯光效果可以有
PWM产生的音乐当然也可以有
那么难点是我们如何产生
跟音乐有一定关联性的序列
而这个序列又有一定的随机性
这就涉及到了大家开动脑筋和设计算法
所以如果能够做成这样一个小游戏
我相信也是一个非常酷炫的综合设计
那么再给大家提示就这个随机数
既可以用我们在实验里
教会大家的方式
现在大家有了ADC
也可以用ADC采集采集环境光
采集采集运动传感器的值
然后来看一看
把这些值如何结合用起来
第四个任务就是做一个简易的计步器
那么这种建议的计步器呢
我们从加速传感器
可以不同获得当前加速度的值
但是我们可以通过连续的获得
或者是大家再读读芯片手册
给加速度传感器
设个阈值 设个中断
可以想办法让它实现计数功能
来数我们到底走了多少步
这个功能大家可以实现
然后如果有兴趣的同学
可以进一步拓展两到三个不同的功能
比如说设定目标的步数
步数走完了可以响音乐
告诉你今天任务完成 对不对
这很多同学都会尝试的
那么比如说我们可以设定一个
特殊的加速度的阈值或者测量
来识别出了走路以外有没有摔倒
又比如说我们知道了步数
是不是还可以做一点复杂的算法
让人能够输入一下
当前这个人的身高很体重
用一种比较智能的算法
把步数帮你算成消耗的卡路里
来显示在我们的小屏幕上
等等这样一系列的综合运动
都是大家可以加以设计的
那么老师给了这么四个选做的题目
如果在清华的课程
我会要求大家选做大于等于一个题
那么1和2合起来算一道题
3和4是单独的一道题
但是我更加期待和鼓励大家的呢
是把嵌入式系统
没有限制 自由发挥这一点给用足
我们手上有很多已有的
或者没有的设备
我们的板子上有加速度传感器
有OLED显示屏
有PWM音乐
有温度传感器
有光线传感器
而且大家会发现
即使是老师给的这四个任务
也是我们前面历次实验内容
函数封装的组合体
如果大家真的扎扎实实做完了
每一个基础实验
你其实手上已经拥有了一大堆函数
从显示到点灯
从音乐到采集物理量
你对它进行合理的组合
用更多心思关注你main函数如何编写上
一定能做出你的应用
而如果这些还不够你用
像我们刚才提到加速度传感器
OLED显示屏
我们仍然可以扩充无线电通讯模块
我们可以扩充手机的GSM短信模块
我们可以扩充进一步的湿度传感器
乃至各种各样的物理量传感器
而且我们还可以扩充GPS模块
那么这些对于嵌入式系统来讲
这就是它最大的乐趣之所在
你可以自由的使用我们板子上
扩充引脚加以扩充
用杜邦线用软线进行连接
来实现你要的功能
比如说曾老师的课上
就有两个女孩子用无线电通讯
实现了一个手持的
用微控制器实现的聊天机
在隔着几百米一公里的范围内
彼此可以用无线电发消息
那么再比方说在第一次课上
我给大家看过一段
在这个板子上
把一个超级玛丽小游戏写出来的同学
那么他是灵活使用了
我们前面实验用到的
OLED显示屏 按键 中断 音乐的播放
其实在后台还用到了时钟中断
对于这些任务之间的一些调配
那么看完这些小游戏
我们其实还有很多可以做的
比如在第一次实验课我还给大家举例过
有人上完我们的课程
做了一个检查血氧浓度仪的智能腕表
也许在那个时候你还不知道怎么做
但是在此时此刻
特别是学完了上一个章节的
比如说ADC光线传感器这些以后
我们会说血氧浓度仪的本质是什么
跟我们手戴腕表的心率一样
是不断通过皮肤吸收
或者是反射比较强的单色的光
用一个光色传感器连续ADC采样
得知这个反射光线的变化
随着一次一次的脉搏
随着血氧浓度的变化
测到的光线值的强弱会发生变化
通过ADC比较高精度的定标
我们可以把它还原到物理量上
还原到对血养浓度的测量上
再通过低功耗和二次设计
把它做成一个腕表那么大
这就是一个典型的从创新到创业的故事
那么在这个基础上
我给大家可以随便举很多例子
比如说大家如果用我们的微控制器
接一个磁感应的霍尔元件
在智能车上用的很多
大家可以自己做一个自行车的速度表
来测我的自行车轮子转了多少圈
在屏幕上显示现在自行车速
而如果大家使用激光和光敏元件
不止一个使用多个连在一起
让这些光敏元件输出值
二值化变成0和1
我们实际上得到了一组光线开关
那么曾老师课上
曾经有同学用一绺的激光发射器
和一绺的光敏传感器接在一组IO上
做了一个音乐竖琴
每当手指波动这个激光束
挡住激光束的时候
我们PWM被控制产生不同的音高
当然这个音乐竖琴
最后是要用干冰或者用电蚊香
产生足足的烟雾
你才能够清晰的向大家想象中
看到那一根一根闪亮亮的琴弦
但还是非常的酷炫
那么又比方说有同学
用ADC的输入值
和OLED屏幕的像素显示结合起来
自己做了一个采样率和分辨率都有限
但功能十分完备的迷你示波器
然后就像刚才所说的用红光的LED
和光敏的二极管加上ADC
我们可以做血液的脉搏
和血养浓度的测量仪
而如果把脉搏的测量
跟加速度的传感器测量结合起来
又跟我们现在大家能买到穿戴设备一样
又可以做一个非常高精度的
卡路里的估算的
健身的测量仪 对不对
然后还有的同学在我们课上玩过
说我们使用ADC加上高电阻或者电阻桥
来测量人体的高阻的变化 干嘛呢
做一个测谎仪
有同学演示的时候
比如说把自己做的测谎仪
让自己同学捏着
其实捏着两个电阻腿 然后来测
他是否有暗恋的对象
这都是在课堂上有同学玩过的内容
所以作为我们这样一门课程
我最最期待的挑战性实验
并不是我所布置的那样三四个任务
而是像我刚才说的ProjectX
这样一个无限的自由创意
虽然在线课程我没有办法
逐一检查大家的作品
但就像我这门课一开始所说
我更希望构筑一个开元硬件
与自由学习的生态
大家如果有好的创意 好的作品
可以跟我联系
也可以你们自己在网上公开
让大家分享起来
和把这样一种嵌入式系统
愉愉快快的玩耍起来
非常期待大家的无限创意
-1.1 课程概览
--1.1 课程概览
-1.2 如何学好嵌入式系统
-2.1 计算机的基本概念、发展历史
-2.2 从晶体管到CPU
-2.3 概念CPU、微控制器MCU和嵌入式系统
-2.4 八卦计算机史
-2.5 不同领域、不同系列的嵌入式系统
-2.6 ARM历史与MKL25Z128 MCU
--2.6 ARM历史与MKL25Z128 MCU【习题】
-3.1 CPU的基本结构和运行机制
-3.2.1 堆栈的概念
--3.2.1 堆栈的概念【习题】
-3.2.2 堆栈的概念-头脑体操
-3.3.1 ARM的体系结构
--3.3.1 ARM的体系结构【习题】
-3.3.2 ARM的体系结构-头脑体操
-3.4.1 中断的概念和机制
-3.4.2 中断子程的概念和编程
-3.5 复位、时钟、存储器和总线
--3.5 复位、时钟、存储器和总线【习题】
-3.6 小结:MCU的总体结构和程序运行机制
--3.6 小结:MCU的总体结构和程序运行机制【习题】
-4.1 第一种外设:IO
-4.2 IO外设的编程实操-点亮LED
-4.3 IO外设的进阶知识
-4.4 嵌入式开发的基本概念与工具链
-4.5 嵌入式开发的进阶知识
-4.6 嵌入式开发中的C语言(上)
--4.6 嵌入式开发中的C语言(上)【习题】
-4.7 嵌入式开发中的C语言(下)
--4.7 嵌入式开发中的C语言(下)【习题】
-E0.1 实验零 开发板的初步认识与工具链的安装
-E0.2 实验零 体验一个例程的编译与下载
-E0.3 实验零 编写第一个程序:点亮核心板LED
-E1 实验一 点灯秘籍
-5.1 ARM微控制器外设学习概述
-5.2.1 ARM微控制器外设:通讯
-5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)
--5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)
--5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)【习题】
-5.2.3 ARM微控制器外设:异步串行通讯UART的原理(下)
--5.2.3 ARM微控制器的外设:异步串行通讯UART的原理(下)
--5.2.3 ARM微控制器外设:异步串行通讯UART的原理(下)【习题】
-5.2.4 ARM微控制器外设:RS-232串口与USB虚拟串口
--5.2.4 ARM微控制器外设:RS-232串口与USB虚拟串口
-5.2.5 ARM微控制器外设:UART的寄存器编程(上)
--5.2.5 ARM微控制器外设:UART的寄存器编程(上)
-5.2.6 ARM微控制器外设:UART的寄存器编程(下)
--5.2.6 ARM微控制器外设:UART的寄存器编程(下)
--5.2.6 ARM微控制器外设:UART的寄存器编程(下)【习题】
-E2 实验二 UART编程实操
-5.3.1 ARM微控制器外设:IO的中断编程(上)
-5.3.2 ARM微控制器外设:IO的中断编程(下)
-5.4.1 ARM微控制器外设:定时器的原理
-5.4.2 ARM微控制器外设:定时器的编程
--5.4.2 ARM微控制器外设:定时器的编程【习题】
-E3 实验三 定时器中断编程实操
-5.5.1 ARM微控制器外设:PWM的原理
-5.5.2 ARM微控制器外设:PWM寄存器与编程
-5.5.3 ARM微控制器外设:PWM编程实例—电子音乐
--5.5.3 ARM微控制器外设:PWM编程实例—电子音乐
-E4 实验四 数码管显示编程实操
-5.6.1 ARM微控制器外设:SPI通讯简介
--5.6.1 ARM微控制器外设:SPI通讯简介【习题】
-5.6.2 ARM微控制器外设:SPI寄存器与编程
-5.6.3 ARM微控制器外设:SPI编程实例—OLED显示屏驱动
--5.6.3 ARM微控制器外设:SPI编程实例—OLED显示屏驱动
-5.7.1 ARM微控制器外设:I2C通讯简介
-5.7.2 ARM微控制器外设:I2C的通讯协议
-5.7.3 ARM微控制器外设:I2C寄存器与编程
--5.7.3 ARM微控制器外设:I2C寄存器与编程【习题】
-5.7.4 ARM微控制器外设:I2C编程实例—加速度传感器
--5.7.4 ARM微控制器外设:I2C编程实例—加速度传感器
-5.8.1 ARM微控制器外设:ADC简介
-5.8.2 ARM微控制器外设:ADC基础
-5.8.3 ARM微控制器外设:ADC寄存器与编程
-E5 实验五 ADC编程实操
-E6 挑战实验
--E6 挑战实验
-6.1 嵌入式系统的接口与设计
-6.2 嵌入式系统的实例