基于树莓派PICO实现反应测试器
本项目将基于硬禾学堂树莓派pico平台,制作一个反应测试器。我们将随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间。
标签
嵌入式系统
树莓派PICO
2023寒假在家练
qcy
更新2023-03-29
北京理工大学
448

项目1 - 制作一个反应测试器

一、任务要求:

本项目将基于硬禾学堂树莓派pico平台,制作一个反应测试器。我们将随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间。

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

二、环境配置

  1. Thonny:

本项目使用Thonny作为开发软件。Thonny作为一款专门面向初学者的Python IDE,它被官方推荐,同时基础功能齐全、页面简洁,且支持Windows、Linux等多个平台,对于我这种新人来说十分容易上手。实际使用时我也感觉上手很快,没有什么难度。

  1. 硬禾学堂树莓派pico平台:

本项目使用的硬件是基于硬禾学堂树莓派Pico的嵌入式系统学习平台,平台包括硬禾版本树莓派pico核心模块和扩展板。树莓派pico核心板块是一款高性能、低成本的微控制器开发板,具有灵活的数字接口,硬件上采用树莓派官方自主研发的RP2040微控制器芯片,搭载了ARM CortexM0+双核处理器,高达133赫兹的运行频率,内置了264KB的SRAM和2 MB 闪存,还板载有多达26个多功能的GPIO引脚。硬件开发软件可以选择microPython、C语言或者使用C++SDK,可以让我们快速入门实现开发。

功能及管脚映射表:

9KEu1P2b7XsAAAAASUVORK5CYII=

核心板引脚图:

vYjWC4QGwaDstZtQOIVRuViD7B29KhZieSBkNCQioisbMyEREV0BFmOVAAKVZeHK9F7RvHjSGxCFCdKrCRrAGphlzQxXa+W8AqYXTT2ggFVY+FcvdRRcXKgveNMcS0REdEXgHjNERHRlWJqOXtmqZfkEJW+e7AJElr1cGnrZUhaP9W2+O7rsUKBLlUHzqs9V32z7GxYJiYjoisdMSEREREREdPXiOy1ERERERERXL2ZCIiIiIiKiqxczIRERERER0dWLmZCIiIiIiOjqxUxIRERERER09WImJCIiIiIiunoxExIREREREV29mAmJiIiIiIiuXsyEREREREREVy9mQiIiIiIioqsXMyEREREREdHVi5mQiIiIiIjo6sVMSEREREREdPX6f2Rw1lw8pS5nAAAAAElFTkSuQmCC

三、程序实现

  1. 设计思路:

要想成功完成这个项目,需要做到以下几点:

(1)随机时间后点亮LED灯:在本次反应测试中,LED灯点亮所花费的时间需要被设置成随机的,程序中可以通过random.uniform()函数来产生一个随机数作为LED灯在测试开始后随机点亮的时间,由此可以实现LED灯在随机时间后点亮。

(2)随机点亮一个LED灯:树莓派pico中有四种不同颜色的LED灯,分别是红色、黄色、蓝色、绿色。每次测试需要随机点亮一个LED灯,于是在程序中使用random.randint()函数产生一个随机整数,通过产生的随机整数来控制每次测试点亮的LED灯,从而实现在测试中随机点亮不同颜色的LED灯。

(3)计算LED灯从点亮到按下按键之间的时间差:程序中调用time.ticks_ms()函数来计时。start记录LED灯点亮时的数值,在按下按键k1后返回time.ticks_ms()与start的差值,即得LED灯从点亮到按下按键之间的时间差。

  1. 流程图:

wps

3.源代码:

from led import r,g,b,y#调用库函数
from oled import oled
from button import button
from board import pin_cfg
import time
from machine import Pin
import random

def off_all():#关闭所有灯
    r.off()
    g.off()
    b.off()
    y.off()
def on_random(num):#随机点亮小灯
    if num==1:
        r.on()
    if num==2:
        g.on()
    if num==3:
        b.on()
    if num==4:
        y.on()
    
def result(m): #在显示屏上输出反应时间
    print(m)
    oled.text(m,0,32)
    oled.show()
    
start=0

def k1_callback(pin): #按钮k1
    global start
    oled.fill(0)
    react=time.ticks_ms()-start #计算反应时间
    result("time:"+str(react)+"ms")
    off_all()
    
k1=button(pin_cfg.k1,k1_callback,trigger=Pin.IRQ_FALLING)

while True:
    y.on()
    time.sleep(1)
    r.on()
    time.sleep(1)
    g.on()
    time.sleep(1)
    b.on()
    time.sleep(1)
    oled.fill(0)
    off_all()#关闭所有灯
    num=random.randint(1,5)#产生随机数
    time.sleep(random.uniform(3,5)) 
    on_random(num) #随机点亮小灯
    start=time.ticks_ms()
    time.sleep(10)
    start=0
    

 

4.实现的功能以及实物图:

本程序代码实现了反应测试器要求实现的全部功能。在运行程序后,黄、红、绿、蓝四个LED灯会依次点亮,代表测试即将开始。之后,测试器在3到5秒的随机时间后会点亮红、黄、蓝、绿四个LED中的随机一个,灯亮的同时程序就会开始计时,受试者在接收到灯亮信号后按下按键k1,k1按下瞬间记录的时间,即为受试者的反应时间,此时LED灯熄灭,反应时间显示在OLED上。若想继续进行下一轮测试,则只需等待10秒后,黄、红、绿、蓝四个LED灯会再次依次点亮,代表测试又一次开始。

4fd87cb41d41279384087d7cb27174b

d0e69c346c5dc2c9ae436816d76db31

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

本实验在平台赠送的microPython编程课程的指导下进行的比较顺利,课程讲述的十分详细,能让我很快上手开始项目,但是在完成项目的过程中我还是遇到一些问题。那就是该项目虽然能够多次重复测试,但OLED显示屏上的数据却没有重置,这就导致了测试中较新的反应时间数据叠加在较旧的显示数据上,于是无法读出任何数据。在这时我意识到,新的测试开始后先前的OLED输出应该要清空。经过查阅资料,我找到了一个解决方法。我让OLED显示较新的数据前应先清除较旧数据之后再输出,这下问题得以顺利解决。

四、总结

本项目难度不高,适合像我这样的新手完成,我也基本实现了目标,按照规定做出了一个反应测试器。我在今后还想继续学习有关嵌入式系统的内容,尝试把其他稍难一些的项目也一一完成,希望这样能够强化自己在嵌入式系统与编程领域的能力。

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