一、项目简介
制作一个反应测试器
二、项目要求
随机点亮板上的一个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()
五、效果和流程展示
准备界面
亮灯并按下按键
输出反应时间
重新进行测试
六、遇到的主要难题
初始时对按键和管脚不太了解,需要阅读芯片手册对芯片布局首先有一个大致的认知,之后在编程中才能对其进行运用。
嵌入式板卡编程要结合硬件,对不同的板卡运用要参考不同板卡的命名方式和运用方式,比如在编写LED灯随机亮起的部分的时候就出现了一个bug,计数器正常运行的情况下没有灯亮起,但按下按键依然能输出反应时间,于是对问题进行排查,首先检查是否LED灯出现问题,编写LED灯控制代码,使其全部亮起,没有发现错误,之后使其逐一亮起,这时发现十二号灯不亮,检查代码发现是自己对ws2812b中LED灯的操作没有了解透彻,随机数的编号应该为1~12而不是0~11,将这一点改正之后问题随之解决。
第一个项目总体来说还是非常简单的,主要是需要在编程时阅读几个文件中的代码,了解如何调用oled屏,LED灯,蜂鸣器等扩展硬件,完成主要内容编写后可以做一些修饰工作,比如调一下灯的颜色,灯的亮度等等。了解了这些其实本次寒假练的第三个和第六个项目都可以完成了,播放音乐和节日彩灯,我自己也尝试来完成这两个项目,节日彩灯项目中还可以加上oled屏幕上的输出图案,让设计出的项目更加美观,播放音乐也可以自己扩展一下音律库从而播放出更多的音乐。初始给的参考代码中已经有我和我的祖国的编曲,如果想要做更多其他的自己喜欢的音乐,可以在网上找到音乐编码器来操作。
完成这些我还简单看了一下另外的几个题目,其中交通信号灯的控制和反应测试器相差不多,可以通过对代码进行调整后实现。电压控制器则需要再对板卡做一些了解,要知晓电位计的输入输出怎么获取,ADC的调用等。水平仪则需要知晓姿态传感器的输出怎么获取,在这个项目里不仅可以使用oled屏显示,也可以结合板子上的12个LED灯来做显示。定时报警的时钟可以在例程中加入蜂鸣器程序来实现,可以直接整点播报项目三的音乐。不过以上都只是我简单看了项目后的大致思路,没有实际动手去编程,在实际操作中还会遇到各种各样的问题,需要一一调试来解决。下次有机会我想要在做一个FPGA的项目,学习一些逻辑电路相关的知识。感想硬核学堂给了我一次和其他同学一起学习和交流的机会。
七、主要代码展示
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