基于STEP Pico制作反应测试器
基于树莓派Pico制作反应测试器,随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时
标签
树莓派PICO
2023寒假在家练
反应测试器
stark
更新2023-03-29
北京理工大学
347

1 项目需求

随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间,这是心理学上的一个重要实验

2 环境配置

2.1 thonny

Thonny是一个面向python初学者的优秀的python IDE,其由爱沙尼亚的Tartu大学开发,专为学习和教学编程而设计,针对初学者学习Python语言优化了很多工具上的方式和方法,其易于上手,内置了python3.7,只需安装程序就可开始编程;查看变量也相当方便,可以清晰看到变量的地址和变量之间的引用;调试简单,只需按住Ctrl+F5就可以逐步运行程序,不需要断点;单步执行函数调用会打开一个新窗口,其中包含单独的局部变量表和代码指针帮助初学者充分理解函数调用的工作原理从而更好理解递归;高亮显示语法错误,让初学者十分容易发现没有闭合的引号和括号等最常见的初学者语法错误;可以在代码补全的帮助下浏览 API。

2.2 硬禾学堂树莓派Pico板卡

硬禾学堂树莓派Pico板卡专为嵌入式系统学习而设计,其可以通过C/C++以及MicroPython编程来学习嵌入式系统的工作原理和应用,板卡由STEP Pico和树莓派Pico扩展板组成,板卡硬件包括2个按键输入、4个单色LED、12个WS2812B RGB三色灯、1个姿态传感器、1个128*64 OLED显示屏、1个蜂鸣器、1个可调电位计(用于电压表)、1路音频信号输入(用于示波器)、8位R-2R电阻网络构成的DAC(用于DDS信号发生器),本次项目主要用到按键、WS2812B RGB三色灯和128*64 OLED显示屏。

FvYhSLtdG2lUaYYabbPtg-ZZ1jdg

图2-1 树莓派Pico功能及管脚映射表

FsjT8e2WsId3o8-AxBTpwtqviiWf

图2-2 核心板引脚图

3 完成的功能及达到的性能

3.1 测量反应时间

程序为循环进行,在一轮循环中,经过3到5秒的随机延时后,树莓派Pico板子上自带的编号为1到12的12个WS2812B RGB三色灯中将随机抽取一个灯亮起,灯亮起时程序开始计时,亮起后按下树莓派Pico板子上的K1按键中断程序,得到的灯亮到按下按键之间的时间差就是我们测量得到的反应时间。

3.2 显示反应时间

在一轮循环中测得反应时间后,测得的反应时间将会通过USB显示在PC上,与此同时测得的反应时间也会在树莓派Pico板子上自带的OLED显示屏上显示,显示为time:测得的反应时间ms,如下图所示。

FoBaydgdaLgbIZ_KZxr9Cn86V97b

图3-1 在树莓派Pico板子OLED显示屏上显示反应时间

4 实现思路

随机点亮板子上的一个LED:使用可以产生随机整数的函数random.randint来产生一个一到十二的随机整数,从而在十二个WS2812B RGB灯中随机选取一个灯亮起,实现随机点亮板子上的一个LED的功能。

随机延时点亮板子上的一个LED:使用可以产生随机数的函数random.uniform来产生一个随机数以决定在延时多长时间后随机点亮板子上的一个LED。

测试反应时间:板子内置的时钟可以给我们提供准确的当前时间,通过调用函数time.ticks_ms()即可读取毫秒计时器的当前时间的读数。在随机延时一段时间后随机点亮板子上的一个LED,此时调用函数time.ticks_ms()记录下毫秒计数器当前时间,按下按键做出反应后,再次读取当前时间,通过将当前毫秒计数器时间减去随机点亮板子上的一个LED时记录下的毫秒计数器记录时间,即可得到一个时间差值,这个时间差值就是我们要测的反应时间。

5 实现过程

5.1 程序流程图

FjiqMim2bcpW_qr2hHJDyhxCC1hB

图5-1 程序流程图

5.2 程序实现

本人之前没有学习过树莓派Pico相关知识,通过学习购买树莓派Pico板卡赠送的课程对树莓派Pico相关功能和MicroPython语言有了初步的认识和了解。Thonny这款python IDE本身也十分简便好用易上手,同样也帮助我更快入门MicroPython编程。由于自己之前没有做过MicroPython语言相关的项目,购买树莓派Pico板卡赠送的开源文件和文档给了我不少帮助,让我得以在短时间内完成这一项目。

这次反应测试器项目需要用到WS2812B RGB灯、OLED显示屏、按键,通过调用Gitee上已有的WS2812B RGB灯、OLED显示屏和按键的相关配置文件,我们可以很轻松的通过几行代码即可调用这些模块工作,并且快速更改像WS2812B RGB灯工作的亮度、工作灯的选取或灯的颜色等相关参数,从而高效快速的完成编写反应测试器的项目要求。这里再次感谢为我们无私奉献开源配置文件的大佬们,让我这个之前没有树莓派Pico相关编程经验的人得以快速入门并完成一个小项目,领略到嵌入式开发的乐趣。

下面结合代码来讲解一下反应测试器的实现方法

5.2.1 首先进行初始化,导入之后要用到的配置模块

import ws2812b
from oled import oled
from button import button
from board import pin_cfg

import time
from machine import Pin
import random

这里我们要导入的模块ws2812b用来调用WS2812B RGB相关的函数,模块oled用来调用OLED相关控制函数,模块button用来调用按键k1相关函数,模块board用来定义pin_cfg类。

5.2.2 OLED屏幕显示

def print_result(msg):
    print(msg)
    oled.text(msg,0,32)
    oled.show()
    time.sleep(3)
    oled.fill(0)
    oled.show()

控制输出的反应测试器结果在OLED屏幕上的显示位置为屏幕正中间的一行上,屏幕显示结果3秒后刷新屏幕,等待显示下一次的反应测试结果。

5.2.3 主函数循环

while True:
    time.sleep(random.uniform(3,5))
    ws2812b.on(random.randint(1,12))
    timer_start = time.ticks_ms()
    time.sleep(5)
    ws2812b.off_all()
    time.sleep(5)

函数不断循环实现每隔一段时间开始一次反应测试。在一个循环中先使用time.sleep函数随机延时3到5秒,使用ws2812b.on函数随机打开一个WS2812B灯,同时记录下当前时间并记为timer_start,然后延时5秒关闭LED灯,关闭LED灯后再延时5秒结束当前循环,进入下一次循环。

5.2.4 计算反应时间

def k1_callback(pin):
    global timer_start
    timer_reaction = time.ticks_ms() - timer_start
    print_result("time:"+str(timer_reaction)+"ms")
k1 = button(pin_cfg.k1,k1_callback,trigger=Pin.IRQ_FALLING)

按下按键后用当前时间减去之前记录的LED灯亮时的时间timer_start,即可得到测得反应时间,并将其输出到OLED屏幕进行显示。

6 遇到的主要难题及解决方法

由于是第一次使用树莓派Pico,不清楚OLED屏幕的显示相关知识,导致输出的结果会叠加到一起,从而了解到OLED屏幕需要进行清屏。通过使用oled.fill(0)函数实现清屏,解决了显示重叠的问题。

7 未来的计划或建议

此次项目已经成功实现了反应测试器的功能,未来计划进一步完善程序,加入控制条件来控制程序的主循环的进行,实现随时开启和关闭反应测试活动。

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