1.项目需求
随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间,这是心理学上的一个重要实验。
2.设计思路
2.1项目背景:
人的反应时间是指人体接收到外界刺激之后迅速做出反应的时间。正常人反应时间在300毫秒左右。30岁以后会有所下降。运动员经过特定练习,对特定刺激(发令枪)的反应时间可以缩短到150-180毫秒,人类反应时间的极限目前科学界公认为100毫秒。跑步比赛发令枪响到起跑如果反应时间短于100ms,也就是0.1s,就会被判定为抢跑。
所以测量人的反应时间是一个很重要的心理学实验,如何测量反应时间也有各种各样的方法,本项目是为了设计一个基于STEP Pico嵌入式学习平台的测量反应时间的电子仪器。
2.2设计思路
利用板卡上的LED灯实现外界刺激,再利用板卡上的按键和计时器实现对人的反应时间的测量,再利用OLED屏幕即时显示测量结果。
通过软件产生随机数,程序启动以后在随机数控制的时间下点亮板上的LED,被测试者按下按键以后,处理器计算从点亮灯到接收到按键之间的时间差,并将时间差通过USB显示在PC上,也可以将OLED用起来,在OLED上显示时间信息,并且每隔一段时间可以重复上述测量。
3.设计框图
4.硬件介绍
4.1板卡简介
基于树莓派Pico的嵌入式系统学习平台专为嵌入式系统学习而设计,其可以通过C/C++以及MicroPython编程来学习嵌入式系统的工作原理和应用。
4.2板卡硬件
- 2个按键输入
- 4个单色LED
- 12个WS2812B RGB三色灯
- 1个姿态传感器
- 1个128*64 OLED显示屏
- 1个蜂鸣器
- 1个可调电位计(用于电压表)
- 1路音频信号输入(用于示波器)
- 8位R-2R电阻网络构成的DAC(用于DDS信号发生器)
4.3STEP Pico简介
STEP Pico是一款低成本、高性能的微控制器开发板,具有灵活的数字接口(完全兼容Raspberry Pi Pico)。
硬件上,采用Raspberry Pi官方自主研发的RP2040微控制器芯片,搭载了ARM Cortex M0+双核处理器,高达133MHz的运行频率,内置了264KB SRAM和2MB闪存,还板载有多达26个多功能的GPIO引脚。
软件上可选用树莓派提供的C/C++SDK,或者使用MicroPython进行开发,且配套有完善的开发资料教程,可以方便快速地入门开发并嵌入到产品当中去。
4.4板载资源
本模块为兼容树莓派官方Pico的核心模块,在其基础上增加了4个WS2812彩色灯,一个电源指示灯,以及一个复位键,USB端口也改成了Type-C。
5.实现的功能
如下图所示,板子上电后只有电源指示灯亮起
如下图所示,开始运行代码后,黄色LED灯亮起,亮起时间由随机函数产生,时长在2至4秒
如下图所示,黄色LED灯亮,立即按下K1按键,黄色灯灭,同时OLED屏幕上显示出反应时间
如下图所示,PC端也显示出反应时间
如下图所示,间隔6秒后开始下一次测量,绿色LED灯亮起,可以开始下一次测量
6.主要代码段展示
def print_result(msg):
print(msg)
oled.text(msg, 20, 32)
oled.show()
oled.fill(0)
这是OLED屏幕上的显示代码,因为OLED屏幕是一个128*64的屏幕,为了使得显示出来的文本信息更加美观,所以我将文本框的显示位置设定在了横坐标为20,纵坐标为32的位置。在每次显示出反应时间结果,开始下一次测量之时会清空当前OLED屏幕内容并且进行下一次显示。
timer_start = 0
def k1_callback(pin):
global timer_start
timer_reaction = time.ticks_ms() - timer_start
r.off()
y.off()
b.off()
g.off()
print_result(str(timer_reaction) + "ms")
k1 = button(pin_cfg.k1, k1_callback, trigger = Pin.IRQ_FALLING)
这里定义了一个全局变量timer_start用来记录灯亮的时间,也就是反应测试开始的时间。因为测量反应时间需要使用中断和服务响应的机制,所以这里不能使用import k1的形式,因为这种形式是使用队列的方式获取k1,而我们需要使用中断的方式获取k1,所以需要定义一个k1的callback,也就是按下按键马上会执行的一个回调函数。因为中断的优先级比较高,并且独立于后面的大循环,所以不需要担心运行起来之后执行不到的问题。
中断有多种触发条件,比如说上升沿触发和下降沿触发。我们这里使用的是下降沿触发,也就是按下按键的时候变成低电平。再次记录此时的计时器时间,并且与之前记录的测量开始时间做差值,得出最终的反应时间,并且显示在PC和OLED屏幕上。按下按键的同时关闭LED灯。
因为人的反应时间是毫秒级别的,所以这里使用毫秒为单位来计算反应时间。
while True:
t = random.uniform(0,4)
if 0 <= t < 1:
time.sleep(random.uniform(2,4))
r.on()
elif 1 <= t < 2:
time.sleep(random.uniform(2,4))
y.on()
elif 2 <= t < 3:
time.sleep(random.uniform(2,4))
b.on()
else:
time.sleep(random.uniform(2,4))
g.on()
timer_start = time.ticks_ms()
time.sleep(6)
这里是主循环,当循环开始时,由函数random()随机产生一个在2到4之间的数字,用来控制随机点亮一个LED灯,按下k1后循环中断,同时灯灭,得出反应时间。一次循环为6秒钟,几秒钟之后开始下一次测量。
7.学习心得
这是我第一次使用STEP Pico独立完成设计项目,虽然这个设计难度不高,但是通过这一次的学习,我对MicroPython有了初步的了解。之前我只使用过C语言、C++、Matlab和Verilog语言,没有使用过Python语言,但是有过之前编程的基础,这次上手编程也不是很困难,代码内容也都能读懂。在之前的大部分学习中,涉及到编程的基本上都是一些只有软件或者是偏向于软件的内容,没有做过太多的硬件设计,所以通过这次项目完成,我开始喜欢上了硬件的设计,当我看到自己的代码上载到板子上,板子开始按照我的意愿开始工作时,一种莫名的成就感油然而生。这一次虽然只完成了一个项目,但是在今后的日子里,我会继续利用这次的软硬件设备继续完成更多的实验项目,并且可以尝试更多不同的软硬件组合来扩展自己的能力。