寒假在家一起练1 基于STEP Pico制作一个反应测试器
随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间,这是心理学上的一个重要实验
标签
嵌入式系统
Micopython
2023寒假在家练
想要发paper
更新2023-03-29
北京理工大学
445

一、项目简介

 制作一个反应测试器

二、项目要求

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

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

三、设备信息

板卡硬件:

2个按键输入

4个单色LED

12个WS2812B RGB三色灯

1个姿态传感器

1个128*64 OLED显示屏

1个蜂鸣器

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

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

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

四、实验路线

程序主要使用函数time.ticks_ms进行总体计时,测试开始后,通过调用ws2812b文件中的on函数, 并设置一个1到12的随机数,实现随机点亮板上的LED灯,

    ws2812b.on(int(random.uniform(1, 12)), "#111111")
    time.sleep(3)

在看到灯亮后,测试者按下k1按键,计算其中耗费的时间在oled屏上打印输出,之后进行下一轮测试。

    reactiontime = time.ticks_ms() - starttime
    reactiontime = reactiontime - 5000
    oled.fill(0)
    oled.text("Reaction Time : ", 5, 25)
    oled.text(str(reactiontime) + 'ms', 45, 35)
    oled.show()

并且每次完成测试后要记录下一次测试开始的时间,方便后续计算反应消耗的时间。

    ws2812b.off_all()
    starttime = time.ticks_ms()

FjDgHjtOuiFv11L_g9-I87cjMpgk

五、效果和流程展示

准备界面

FjsRFCdPVcdK_urVVo7EuoCDnlByFovS3krZ6ZgOGdKnzkRrEYCoj4At

亮灯并按下按键

Fv41k1bFPk9_quIqmDAF-r4yeSFi

输出反应时间

FhLJs4oeHELFlx2v-XUtOrVl8BLs

重新进行测试

FpO31TtvT_cNb6Q1uv15Xi-T4U2L

六、遇到的主要难题

初始时对按键和管脚不太了解,需要阅读芯片手册对芯片布局首先有一个大致的认知,之后在编程中才能对其进行运用。

嵌入式板卡编程要结合硬件,对不同的板卡运用要参考不同板卡的命名方式和运用方式,比如在编写LED灯随机亮起的部分的时候就出现了一个bug,计数器正常运行的情况下没有灯亮起,但按下按键依然能输出反应时间,于是对问题进行排查,首先检查是否LED灯出现问题,编写LED灯控制代码,使其全部亮起,没有发现错误,之后使其逐一亮起,这时发现十二号灯不亮,检查代码发现是自己对ws2812b中LED灯的操作没有了解透彻,随机数的编号应该为1~12而不是0~11,将这一点改正之后问题随之解决。

第一个项目总体来说还是非常简单的,主要是需要在编程时阅读几个文件中的代码,了解如何调用oled屏,LED灯,蜂鸣器等扩展硬件,完成主要内容编写后可以做一些修饰工作,比如调一下灯的颜色,灯的亮度等等。了解了这些其实本次寒假练的第三个和第六个项目都可以完成了,播放音乐和节日彩灯,我自己也尝试来完成这两个项目,节日彩灯项目中还可以加上oled屏幕上的输出图案,让设计出的项目更加美观,播放音乐也可以自己扩展一下音律库从而播放出更多的音乐。初始给的参考代码中已经有我和我的祖国的编曲,如果想要做更多其他的自己喜欢的音乐,可以在网上找到音乐编码器来操作。

完成这些我还简单看了一下另外的几个题目,其中交通信号灯的控制和反应测试器相差不多,可以通过对代码进行调整后实现。电压控制器则需要再对板卡做一些了解,要知晓电位计的输入输出怎么获取,ADC的调用等。水平仪则需要知晓姿态传感器的输出怎么获取,在这个项目里不仅可以使用oled屏显示,也可以结合板子上的12个LED灯来做显示。定时报警的时钟可以在例程中加入蜂鸣器程序来实现,可以直接整点播报项目三的音乐。不过以上都只是我简单看了项目后的大致思路,没有实际动手去编程,在实际操作中还会遇到各种各样的问题,需要一一调试来解决。下次有机会我想要在做一个FPGA的项目,学习一些逻辑电路相关的知识。感想硬核学堂给了我一次和其他同学一起学习和交流的机会。

七、主要代码展示

FtzHHPj06FqJxSuoTNRDMANwLQ57

from button import button
from board import pin_cfg
from oled import oled
from machine import Pin
import random
import time
import ws2812b

starttime = 0


def k1_callback(pin):
    global starttime
    reactiontime = time.ticks_ms() - starttime
    reactiontime = reactiontime - 5000
    print(reactiontime)
    oled.fill(0)
    oled.text("Reaction Time : ", 5, 25)
    oled.text(str(reactiontime) + 'ms', 45, 35)
    oled.show()


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

    j = 0
    while j < 50:
        oled.fill(0)
        oled.text("Ready", 45, j)
        oled.show()
        time.sleep(0.1)
        j = j + 5
    k = 0
    while k < 50:
        oled.fill(0)
        oled.text("Go", 55, k)
        oled.show()
        time.sleep(0.1)
        k = k + 5
    oled.fill(0)
    oled.show()

    ws2812b.on(int(random.uniform(1, 12)), "#111111")
    time.sleep(3)

    ws2812b.off_all()
    starttime = time.ticks_ms()
    oled.fill(0)
    oled.show()
    i = 3
    while i > 0:
        oled.text("Reset game", 25, 25)
        oled.text(str(i) + 's', 55, 35)
        oled.show()
        time.sleep(1)
        oled.fill(0)
        oled.show()
        i = i - 1
附件下载
制作一个反应测试器.rar
团队介绍
个人
团队成员
想要发paper
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号