基于STEP Pico嵌入式系统学习平台制作一个反应测试器
随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间,这是心理学上的一个重要实验。
标签
嵌入式系统
树莓派RP2040
2023寒假在家练
RZY
更新2023-03-30
北京理工大学
544

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.设计框图

FmiAmthQY-1_1TFxcsb53-_0udyR

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.实现的功能

如下图所示,板子上电后只有电源指示灯亮起

FnzBgnMDAu06SOk5sB3PEvAN_PRf

如下图所示,开始运行代码后,黄色LED灯亮起,亮起时间由随机函数产生,时长在2至4秒

FkTFfElFDl9onsx07h7NTwZxFMKA

如下图所示,黄色LED灯亮,立即按下K1按键,黄色灯灭,同时OLED屏幕上显示出反应时间

Ft2P6TaokvTyJ1YekOQ3O-vsImj0

如下图所示,PC端也显示出反应时间

FmtgvIXEFg60A03ZkpiQ6heAPRo1

如下图所示,间隔6秒后开始下一次测量,绿色LED灯亮起,可以开始下一次测量

FkljYxvsFsj0IUgbAm4hDfabONUP

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语言,但是有过之前编程的基础,这次上手编程也不是很困难,代码内容也都能读懂。在之前的大部分学习中,涉及到编程的基本上都是一些只有软件或者是偏向于软件的内容,没有做过太多的硬件设计,所以通过这次项目完成,我开始喜欢上了硬件的设计,当我看到自己的代码上载到板子上,板子开始按照我的意愿开始工作时,一种莫名的成就感油然而生。这一次虽然只完成了一个项目,但是在今后的日子里,我会继续利用这次的软硬件设备继续完成更多的实验项目,并且可以尝试更多不同的软硬件组合来扩展自己的能力。

附件下载
reaction_game.zip
团队介绍
北京理工大学19级
团队成员
荣泽宇
北京理工大学在校学生,通信工程专业
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号