基于Step Pico 制作的简易反应测试器
北京理工大学 胡凯风
一.项目介绍
基于Step Pico的嵌入式系统学习平台制作的简易反应测试器,具体任务为点亮树莓派板卡上十二个三色灯中的任意一个,测试者在三色灯被点亮后摁下按钮即可测得自己的反应速度,在PC端上显示出自己的反应时间。此测试在心理学上亦被当作一个重要实验。
该项目的具体实现方式为通过软件产生一个随机数,在此随机数的随机时间下,板卡上随机一枚三色灯会被点亮,与此同时处理器记录此刻为测试的起始时间。在三色灯亮起后,测试者应以最快速度按下相应的按钮,再按下按钮的同时处理器停止计时并记录此刻为测试的终止时间。随后处理器通过计算终止时间和起始时间的时间差来计算测试者的反应时间并通过USB显示在PC端的软件平台上。
二.设计思路
- 调用需要的函数功能:从board中调用pin_cfg,从button中调用k1按钮功能,从oled中调用板块显示器功能,调用ws2812b控制三色灯,调用时间和随机数功能。
- 增加实验需要的变量:起始时间,结束时间,休眠时间,亮灯序号和反应时间
- 利用oled屏来向测试者显示测试的每个阶段以及结束后的反应速度
- 利用随机数生成随机的休眠时间和随机的三色灯序号
- 在休眠时间后,用ws2812b中的on功能点亮相应序号的三色灯,同时oled屏提示测试者开始测试并记录起始时间
- 测试者按下按钮和立即记录结束时间并关闭三色灯
- 反应时间即结束时间减去起始时间的时间差,并将反应时间显示在oled和PC端上
三.硬件介绍
Step Pico是一款低成本高性能的微控制器开发板,具有灵活数字接口。硬件上,采用Raspberry Pi官方自主研发的RP2040微控制器芯片,搭载了ARM Cortex M0+双核处理器,高达133MHz的运行频率,内置了264KB SRAM和2MB闪存,还板载有多达26个多功能的GPIO引脚。软件上可选择C/C++SDK或者使用Micropython进行开发,可方便快速入门开发并嵌入到产品中。
基于Step Pico的嵌入式系统学习平台专为嵌入式学习设计可以通过C语言、C++和Micropython编程来学习嵌入式系统的工作原理与开发运用。本项目运用的树莓派Pico扩展版包含k1、k2两个输入按钮,4个单色LED灯,12个ws2812b三色灯、1个姿态传感器、1个oled显示屏、1个蜂鸣器、1个可调电位计、1路音频信号输入和8位R-2R电阻网络构成的DAC。本项目制作的反应测试器只需要用到其中的k1输入按钮、ws2812b三色灯和oled显示屏。
功能和管脚映射表如下图所示:
四.实现的功能及图片展示
准备阶段:oled显示屏显示反应测试器并要测试者做好准备
开始阶段:ws2812b三色灯随机亮起,oled屏显示测试开始
结束阶段:ws2812b三色灯熄灭,oled屏显示测试者反应速度
五.主要代码片段及说明
源代码展示:
from board import pin_cfg
from button import k1
from oled import oled
import ws2812b
import time
import random
react=0
rand=0
start=0
finish=0
cs_led=0
oled.text("Reaction Game",12,20)
oled.show()
ws2812b.off_all()
rand=random.uniform(2,5) #生成随机时间
cs_led=int(random.uniform(0,12)) #生成随机亮灯序号
time.sleep(rand) #等待生成的随机时长
ws2812b.on(cs_led) #根据生成的亮灯序号亮灯
oled.fill(0)
oled.show()
oled.text("Start",12,20)
oled.show()
start=time.ticks_ms() #记录起始时间
while True:
if k1.value():
finish=time.ticks_ms() #按下按钮后记录截止时间
oled.fill(0)
oled.show()
ws2812b.off(cs_led)
break
react=finish-start #计算时间差
oled.text("Reaction Speed",12,20) #oled上显示反应时间
oled.text("{:3.3f}s".format(react/1000),12,40)
oled.show()
print('Reaction Speed:'+str(react/1000)+'s') #PC端显示反应时间
time.sleep(1)
print('Finished')
生成随机时间与亮灯序号
开始阶段:等待休眠时长后亮灯并记录开始时间
结束阶段:按下k1后记录结束时间并灭灯
计算并显示反应时间
六.主要难题与解决方法
1.在一开始因为对oled显示屏的各种功能与使用不太熟悉,oled在显示完一开始的信息后便停止不动不会显示后续信息。再更加详细的研究了oled.py的有关内容后发现在输入第一段内容和第二段内容间没有加上oled.fill(0)和oled.show两句程序导致oled显示屏上的信息只会维持最初所发送的内容。
2.在调用ws2812b三色灯功能时疏忽了开关灯的on和off功能,没有明白函数后的括号内应该输入的数据形式导致随机序号开灯阶段反复实验了很多次也没有成功,后面在更加详细的钻研了ws2812b.py的on函数功能后才成功将cs_led随机开灯序号输入到了三色灯开关中。
七.未来规划与建议
本次项目让我第一次接触到了树莓派板卡并第一次拿到实际的板卡并操作实现功能。在亲手事件的过程中,我更加深入的将程序和硬件结合在一起并实现所需的功能。未来我也希望有机会更多的接触到这种项目,拓展自己的动手实践能力和程序编写能力,并且能在无人教导的情况下自己设计并实现板卡的功能。
对于反应测试器这个项目,我愚以为可以加入更多的功能,可以引入LED灯和另外一个按钮来完善此实验的完整性。例如使用LED灯的颜色来表明测试所处在的各种阶段,用另外一个按钮控制反应进入开始阶段,这样可以让测试者自行决定测试开始时间,更有助于测试者反应。此外甚至可以引入蜂鸣器,以声音为开始信号测试测试者的反应速度。