基于STEP Pico实现一个反应测试器
本文介绍了使用STEP Pico开发反应测试器的过程和经验,并展示了测试器的功能和代码实现。
标签
嵌入式系统
测试
显示
2023寒假在家练
sans
更新2023-03-29
北京理工大学
449

2023寒假一起练平台-基于STEP Pico的嵌入式系统学习平台-制作一个反应测试器 项目描述

项目标题:制作一个反应测试器

项目要求:这个反应测试器的目的是为了测试被试者的反应速度。在测试中,程序会随机点亮板上的一个LED,被试者需要在尽可能短的时间内按下板上的一个按键。这个实验在心理学上扮演着非常重要的角色。

实现方式:为了实现这个反应测试器,我们需要使用软件来产生随机数。程序启动以后,LED会在随机数控制的时间下点亮。被测试者按下按键以后,处理器会计算从点亮灯到接收到按键之间的时间差,并将时间差通过USB显示在PC上。当然,我们也可以使用OLED来显示时间信息,让整个过程更加生动有趣。

总的来说,这个反应测试器是一项非常有意义的实验,它可以帮助我们更好地了解人类的认知和反应机制。我们期待着借助这个测试仪器,获得更深入的见解。

简单的硬件介绍

硬件名称:STEP Pic 扩展板

核心板:树莓派Pico核心模块 - 硬禾版本(STEP PICO)

Fpv5eQZPIYoasvEkcbVy6O3DDMP-FmpBH2Z1QZ1Ab5jjgaCcnq-SUTrg

硬件构成:

  • 2个按键输入

  • 4个单色LED

  • 12个WS2812B RGB三色灯

  • 1个姿态传感器

  • 1个128*64 OLED显示屏

  • 1个蜂鸣器

  • 1个可调电位计(用于电压表)

  • 1路音频信号输入(用于示波器)

  • 8位R-2R电阻网络构成的DAC(用于DDS信号发生器)

功能及管脚映射表:

FsoeE0SwrfZ8JGsoTLjkTCOP2jyk

硬件总结:

STEP Pico是一款成本低廉、性能卓越的微控制器开发板。它提供了灵活的数字接口,完全兼容Raspberry Pi Pico。硬件方面,STEP Pico采用了Raspberry Pi官方自主研发的RP2040微控制器芯片,搭载了ARM Cortex MO+双核处理器,运行频率高达133MHz,内置了264KB SRAM和2MB闪存,还板载有多达26个多功能的GPIO引脚,这使得STEP Pico在应用范围和性能上都有着广泛的优势。

软件方面,STEP Pico提供了多种开发方式,可选择使用树莓派提供的C/C++ SDK或使用MicroPython进行开发。并且,它还配套有完善的开发资料和教程,使得初学者可以方便快速地入门开发并嵌入到产品中。同时,通过利用和分享开源资源的意识,培养项目总结和展示的能力,进一步提高了开发者的技能水平。

STEP Pico不仅适用于嵌入式系统入门者,而且还可以用于电赛、控制、显示、数据采集等应用场景。使用STEP Pico可以了解电子系统的构成,学会一门与硬件直接相关的编程语言,自己动手完成有趣的项目,激发对电子的兴趣,培养自信心,同时还可以了解更多关于嵌入式系统的知识,提高自己的综合素质。

实现的功能及图片展示

实现的功能:

使用软件来产生随机数,程序启动以后,LED会在随机数控制的时间下点亮,被测试者按下按键以后,处理器会计算从点亮灯到接收到按键之间的时间差,并将时间差通过USB显示在PC上,同时也通过oled屏来显示。

功能实现流程展示:

设计流程图:

FoRE6hnH2GTp6IRIvQb1Cj1XnJ9T

 

实际流程:

 

  1. 按照 OLED 屏幕上的指引,“请按 K2 开始游戏”,按下“K2”按钮即可开始测试。程序启动后会自动生成随机数。

    FmrDaMBZWUAjRJu775ojX9EjwuMM

  2. 按照 OLED 屏幕上的指引,“当灯亮起时请按下 K1”,当“K2”按钮被按下后,LED 灯会在指定的随机秒数后亮起,玩家需要在 LED 亮起后迅速按下“K1”。

    FkKoevdBwNZE32yTTUCl2_8mjLBz

  3. LED 灯亮起后,玩家需要迅速按下“K1”,之后 OLED 屏幕上会显示玩家的反应时间数据。同时,电脑上也输出了数据,单位为毫秒。玩家可以看到 OLED 屏幕上的指引,“3 秒后重新开始”,表示游戏将在 3 秒后重新启动。玩家可以重复执行 1-3 步骤,重新开始游戏。

FhFwc_51AlTlUiN2WsT8DkJLLP8fFuIueoqibUmOOC4l6ZcNpdppPiQO


主要代码片段及说明

程序通过随机点亮 LED 灯,测试被试者的反应速度。当“K2”按钮被按下后,LED 灯会在指定的随机秒数后亮起,玩家需要在 LED 亮起后迅速按下“K1”按钮。程序会计算从点亮灯到接收到按键之间的时间差,并将时间差通过 USB 显示在 PC 上。同时,程序还会通过 OLED 屏幕来显示玩家的反应时间数据。这段代码中定义了多个函数,包括控制 LED 灯亮灭的函数、控制 OLED 屏幕显示的函数、控制按钮的回调函数等。程序运行时会不断循环等待“K2”按钮被按下,一旦检测到按下事件,程序会进入等待“K1”按钮按下的状态,并点亮 LED 灯,开始测试反应时间。

引用的库文件

from oled import oled
from button import button
from board import pin_cfg
from led import r,g,b,y
import time
from machine import Pin
import random

控制led灯相关代码

def ledoff(): #全部灭灯
    y.off()
    r.off()
    g.off()
    b.off()
​
def ledon(): #led随机点灯
    a = random.randint(0,3) #生成随机数
    if a == 0:
        y.on()
    elif a==1:
        r.on()
    elif a==2:
        g.on()
    elif a==3:
        b.on()

控制oled屏相关代码

def tostart(): #开始界面
    oled.init_display() #清屏
    oled.text("please press ",0,10)
    oled.text("k2",50,20)
    oled.text("to start ",0,30)
    oled.text("this game",50,40)
    oled.show()
def wait(): #按下k2后界面
    oled.init_display() #清屏
    oled.text("please press ",0,10)
    oled.text("k1",50,20)
    oled.text("when lightup ",0,30)
    oled.show()
def toohurry(): #如果灯没亮就按下的报错界面
    oled.init_display()
    oled.text("too hurry !",0,12)
    oled.text("or",50,22)
    oled.text("please press k2",0,30)
    oled.text("to start ",30,40)
    oled.show()
def print_result(msg): #灯亮后正常按下后的正常输出界面
    print(msg)
    oled.init_display()
    oled.text("your time is",0,10)
    oled.text(f"{msg}  ms",50,30)
    oled.text("restart in 3s",0,50)
    oled.show()

主函数代码

lock = 0
timer_start=time.ticks_ms() #初始化
def k1_callback(pin):
    global timer_start
    global lock
    if not lock:
        toohurry()
        return
    timer_reaction = time.ticks_ms() - timer_start # ticks_diff
    print_result(str(timer_reaction))
    lock = 0
    time.sleep(3)
    tostart()
def k2_callback(pin):
    global lock2
    lock2 =1
k1 = button(pin_cfg.k1, k1_callback, trigger=Pin.IRQ_FALLING)
k2 = button(pin_cfg.k2, k2_callback, trigger=Pin.IRQ_FALLING)
ledoff()
tostart()
lock2 = 0
while 1: #循环等待
    if lock2:
        wait()
        time.sleep(random.uniform(0,2)) #随机亮灯
        ledon() #开灯
        lock = 1
        timer_start = time.ticks_ms() #对齐开始时间
        time.sleep(1)
        ledoff()
        lock2 = 0

这段代码实现了一个反应测试器的主要功能,可以测试被试者的反应速度。程序会随机点亮板上的一个LED,被试者需要在尽可能短的时间内按下板上的一个按键。测试者在按下按键后,处理器会计算从点亮灯到接收到按键之间的时间差,并将时间差通过USB显示在PC上,同时也通过oled屏来显示。

代码中定义了多个函数,包括控制 LED 灯亮灭的函数、控制 OLED 屏幕显示的函数、控制按钮的回调函数等。程序运行时会不断循环等待“K2”按钮被按下,一旦检测到按下事件,程序会进入等待“K1”按钮按下的状态,并点亮 LED 灯,开始测试反应时间。

过程中的一些思考

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

由于硬件构成较为复杂,需要涉及到多个GPIO口的控制,因此在编写程序时很容易出现逻辑错误。为了解决这个问题,我们在编写代码时采用了模块化编程的方式,将不同的功能分别封装成函数,以便于调试和维护。此外,我们还充分利用了开源社区提供的各种资源和资料,通过学习和借鉴开源代码的方式来提高开发效率和质量。这些措施都为我们成功完成这个项目提供了有力支持。

比如在最开始的时候遇见了如何对oled屏幕进行操作的问题,好在开源库中有已经封装好的oled代码,文件为oled.py,该文件为ssd1306.py的封装,而ssd1306则是封装的oled屏幕的api。如果想要清屏,则需要阅读ssd1306.py,好在使用的类进行了封装,代码简洁易懂,轻松找到了清屏的方法。

其次,在最开始的时候由于对硬件编程不太熟悉导致连接设备后始终无法将代码上传至pico,在网上搜索了不少攻略,收获丰富,对硬件方面的知识不再是一片白纸。

未来的计划或建议:

在未来,我希望能够进一步完善这个反应测试器的功能,例如增加更多的测试模式和难度级别,以满足不同用户的需求。同时,我也计划开发更多基于STEP Pico的应用,包括控制、显示、数据采集等方面,以拓展其应用范围。我希望通过不断的学习和实践,不断提高自己的技能水平。

最近的新闻和发展情况:

近年来,嵌入式系统技术得到了迅速发展,成为了各行各业中不可缺少的一部分。在这个背景下,越来越多的厂商和社区开始推出基于嵌入式系统的开发板和工具,以满足不同用户的需求。例如,树莓派基金会推出了多个型号的树莓派开发板,其中包括基于ARM Cortex-M0+处理器的树莓派 Pico,而这个开发板正是我们在这篇文章中介绍的主角。除此之外,Arduino、Micro:bit、ESP32等也都是非常流行的嵌入式系统开发板,它们都具有各自的特点和优势,可以用于不同的应用场景和领域。

关于STEP Pico的发展和应用,目前还没有太多的新闻和报道。然而,我们相信,随着嵌入式系统技术的不断发展和应用的不断推广,STEP Pico将会成为一个非常流行和受欢迎的开发板,为人们带来更多的创新和发展机遇。同时,我们也期待着更多的开发者和爱好者能够加入到这个领域中来,共同推动嵌入式系统技术的发展和应用,为社会和人类的进步做出更大的贡献。

总结

本文介绍了使用STEP Pico开发反应测试器的过程和经验,并展示了测试器的功能和代码实现。通过这个项目,我们学习了如何使用Python编写嵌入式系统程序,如何控制GPIO口和外设,如何使用开源资源和资料来提高开发效率和质量。我们还讨论了嵌入式系统技术的发展和应用,以及STEP Pico在其中的作用和前景。希望这篇文章能够对嵌入式系统开发者和爱好者有所启发和帮助,同时也欢迎大家分享自己的经验和见解,一起推动嵌入式系统技术的发展和应用。

附件下载
pico.7z
解压后内为源代码
团队介绍
冯三山-北京理工大学
团队成员
冯三山
本站昵称是 sans
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号