2023寒假在家一起练(1)--基于STEP Pico的反应测试器
利用STEM Pico制作一个简易的反应时间测试器,在程序中可以多次测量反应时间。
标签
嵌入式系统
2023寒假在家练
STEM Pico
changchang
更新2023-03-29
北京理工大学
415

一.项目描述

2023寒假一起练项目我选择了基于STEP Pico的嵌入式系统学习平台,此平台的硬件板2个按键输入4个单色LED,12个WS2812B RGB三色灯,1个姿态传感器,1个128*64 OLED显示屏,1个蜂鸣器,1个可调电位计(用于电压表),1路音频信号输入(用于示波器),8位R-2R电阻网络构成的DAC(用于DDS信号发生器)我选择了项目一制作一个反应测试器,具体要求如下:

  • 随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间,这是心理学上的一个重要实验
  • 实现方式:通过软件产生随机数,程序启动以后在随机数控制的时间下点亮板上的LED,被测试者按下按键以后,处理器计算从点亮灯到接收到按键之间的时间差,并将时间差通过USB显示在PC上,也可以将OLED用起来,在OLED上显示时间信息。

在这个项目中,我做了如下改进:在PC段开始运行程序时,会一直检测按键k2的值。只有当k2被按下时程序才会开始产生随机数并开始之后的程序。同时在测得反应时间后又会重新检测k2的值以供多次使用。

二.设计思路

在这个项目中,我们首先要在硬件板中烧入一下几个模块以确保程序的正常运行:1.ws2812b,2.button 3.oled,4.board 5.time,6.time,7.machine,8.Led。

我首先定义一个函数用于在oled显示屏中现实相关信息,如游戏开始提示和最终反应时间。之后从button模块中导出k1和k2,并建立关于k1的回调函数(callback),并通过k1引脚来记录k1被按下的时间。相关的设计思路如下所示:

  1. 建立while循环,并在每一循环开始时检测k2的值是否为有效,若无效则进入下一循环,若有效则,则开始实现一下功能。
  2. k2有效,即k2被按下之后,红色的Led灯会亮表示游戏已经开始,要做好准备,同时程序会产生一个3到5之间的随机数t,程序在t时间后利用ws2812b模块使WS2812B RGB三色灯亮。同时记录时间t1.
  3. 在RGB三色灯亮之我们立即按下k1,此时程序运行k1的回调函数callback,记录被按下的时间t2.通过t1,t2我们便可以得到反应时间t3 = t2-t1,我们使用oled模块将反应时间记录在显示屏上。
  4. 在1s后WS2812B RGB三色灯会熄灭同时可以再次按k2进入下一轮的游戏中。

三.框图和软件流程

项目框图如下所示:

wps

四.简单的硬件介绍:

STEP Pico是一款低成本,高性能的微控器开发板,具有灵活的数字接口,完全兼容Raspberry Pi Pico。

硬件上,采用Raspberry Pi官方自主研发的RP2040微控制器芯片,搭载了ARM Cortex M0+双核处理器,高达1133MHz的运行频率,内置了264KB SRAM和2MB闪存,还板载又多达26个多功能的CPIO引脚。

软件上,可选择树莓派提供的C/C++SDK,或者使用MicroPyhon进行开发,并且配套有完善的开发资料教程,可方便快速入门开发并嵌入到产品中。

本模块未来兼容树莓派官方Pico的核心模块,在其基础上增加了4个WS2812彩色灯,一个电源指示器,以及一个复位键,USB端口也改成了Type C

核心板引脚图如下图所示:

8NB81Y04L2hhlfuMwBX1peTugmCIWYuulDkLfNd1v0tERHRFV3jKExH9X8mAAdEh5gBMJQNovbB1YA2xzHEnLi2A+O96XwCAtquoB96LkA4w6xYlOJCBDES4AkgpTVouT3Lw5Yax+eSctGheb5MUhQDeoBDEmEVHgAEVvJwsnQAM7nCHC0QcwQXjRsoSkT09iIg+cQzBRHQzSYABhbt4BtShoxZlAYWrJ4i7Fpf7rgMpe1B3d89SxAAxwBwwBHU0TVOW5WQ18NYN58xsMlVsZiEE8wwBTAF1BQQOn0xaAwhAmEwDewYcBmTzEB0qELCxHRHRjfAfRSBZA5FSqB0AAAAASUVORK5CYII=五.实现的功能及图片展示

硬件模块通电并运行程序后如下图所示,此时未按k2,电路板oled屏显示“press k2 to start”,及按下k2后开始此游戏。

IMG_256

在按下k2后,led中红色灯亮起,同时程序会生成一个随机数a.

IMG_256

过完a秒之后电路板伤的RDG三色灯会亮起,同时我们立即按下k1,程序会得出我们的反应时间:

44F476DCE99363A80862CD9B0C4CDDCE

程序将得到的反应时间显示在oled屏幕上:

7D8D7BD428E65B41188C2C14AF577277

六.主要代码片段及说明

相关代码如下:

      

import time  
import ws2812b  
from button import k1,k2  
from oled import oled  
from button import button  
from board import pin_cfg  
from machine import Pin  
from led import r  
import random  
timer_start = 0  

此代码片段导入了相关的模块,同时定义了一个变量timer_star,该变量会用来测出RGB三色灯亮起的时间。

    def print_result(msg):  
    print(msg)  
    oled.text(msg,0,32)  
    oled.show()  

定义了oled屏幕显示信息的函数。

    def k1_callback(pin):  
    global timer_start  
    time_reaction = time.ticks_ms() - timer_start  
    print_result("time is "+str(time_reaction) + "ms")  

定义了k1的回调函数,在其中time.ticks_ms()会记录回调函数运行时的时间,及k1按下的时间。timer_start是RGB三色灯亮起的时间,二者相减即可得到反应时间。

   k1 = button(pin_cfg.k1,k1_callback,trigger=Pin.IRQ_FALLING)  

定义了k1的引脚信息,在电平下降时触发,运行k1的callback函数。

print_result("press k2to start")  
while True:  
    if k2.value() == True:  
        oled.fill(0)  
        oled.show()  
        r.on()  
        time.sleep(random.uniform(3,5))  
        ws2812b.on_all()  
        timer_start = time.ticks_ms()  
        time.sleep(1)  
        ws2812b.off_all()  
        r.off()  

一直循环指导k2被按下,k2的value为真时会进入下一步。Led的红色灯亮起,说明程序已经生成了随机数并开始计数,在计数完成之后RGB三色灯亮起,玩家需要立即按下k1,此时k1引脚得到电平信号开始调用回调函数,并计算出反应时间。1秒后RGB三色灯熄灭,程序又返回到循环之中等待下一个ke信号

总代码如下:

import time  
import ws2812b  
from button import k1,k2  
from oled import oled  
from button import button  
from board import pin_cfg  
from machine import Pin  
from led import r  
import random  
timer_start = 0  
  
  
  
def print_result(msg):  
    print(msg)  
    oled.text(msg,0,32)  
    oled.show()  
  
def k1_callback(pin):  
    global timer_start  
    time_reaction = time.ticks_ms() - timer_start  
    print_result("time is "+str(time_reaction) + "ms")  
      
      
k1 = button(pin_cfg.k1,k1_callback,trigger=Pin.IRQ_FALLING)  
  
print_result("press k2to start")  
while True:  
    if k2.value() == True:  
        oled.fill(0)  
        oled.show()  
        print_result("")  
        r.on()  
        time.sleep(random.uniform(3,5))  
        ws2812b.on_all()  
        timer_start = time.ticks_ms()  
        time.sleep(1)  
        ws2812b.off_all()  
        r.off()

.遇到的难题及解决方法

在编程过程中遇到了一些难题,例如oled显示屏显示一个信息后,再次利用oled.text和oled.show函数后显示下一个信息时,前后两个信息会叠加显示再屏幕上。进过查阅资料后可知,利用oled.fill(0)和oled.show()函数可以实现屏幕的清零。

八.未来的计划

反应时间的测量知识利用这个硬件模块所有功能中很小的一部分,在未来的计划中,我希望自己能够多学习相关的知识。利用Raspberry Pi Pico开发板的功能,做出更多更有趣的功能。

 

 

 

 

 

 

 

 

 

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