项目1 - 制作一个反应测试器
一、任务要求:
本项目将基于硬禾学堂树莓派pico平台,制作一个反应测试器。我们将随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间。
具体实现方式为,通过软件产生随机数,程序启动以后在随机数控制的时间下点亮板上的LED,被测试者按下按键以后,处理器计算从点亮灯到接收到按键之间的时间差,并将时间差通过USB显示在PC上,也可以将OLED用起来,在OLED上显示时间信息。
二、环境配置
- Thonny:
本项目使用Thonny作为开发软件。Thonny作为一款专门面向初学者的Python IDE,它被官方推荐,同时基础功能齐全、页面简洁,且支持Windows、Linux等多个平台,对于我这种新人来说十分容易上手。实际使用时我也感觉上手很快,没有什么难度。
- 硬禾学堂树莓派pico平台:
本项目使用的硬件是基于硬禾学堂树莓派Pico的嵌入式系统学习平台,平台包括硬禾版本树莓派pico核心模块和扩展板。树莓派pico核心板块是一款高性能、低成本的微控制器开发板,具有灵活的数字接口,硬件上采用树莓派官方自主研发的RP2040微控制器芯片,搭载了ARM CortexM0+双核处理器,高达133赫兹的运行频率,内置了264KB的SRAM和2 MB 闪存,还板载有多达26个多功能的GPIO引脚。硬件开发软件可以选择microPython、C语言或者使用C++SDK,可以让我们快速入门实现开发。
功能及管脚映射表:
核心板引脚图:
三、程序实现
- 设计思路:
要想成功完成这个项目,需要做到以下几点:
(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灯从点亮到按下按键之间的时间差。
- 流程图:
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灯会再次依次点亮,代表测试又一次开始。
5.遇到的主要难题及解决方法:
本实验在平台赠送的microPython编程课程的指导下进行的比较顺利,课程讲述的十分详细,能让我很快上手开始项目,但是在完成项目的过程中我还是遇到一些问题。那就是该项目虽然能够多次重复测试,但OLED显示屏上的数据却没有重置,这就导致了测试中较新的反应时间数据叠加在较旧的显示数据上,于是无法读出任何数据。在这时我意识到,新的测试开始后先前的OLED输出应该要清空。经过查阅资料,我找到了一个解决方法。我让OLED显示较新的数据前应先清除较旧数据之后再输出,这下问题得以顺利解决。
四、总结
本项目难度不高,适合像我这样的新手完成,我也基本实现了目标,按照规定做出了一个反应测试器。我在今后还想继续学习有关嵌入式系统的内容,尝试把其他稍难一些的项目也一一完成,希望这样能够强化自己在嵌入式系统与编程领域的能力。