反应时间测试器
一.项目描述
具体要求:随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间,这是心理学上的一个重要实验
实现方式:通过软件产生随机数,程序启动以后在随机数控制的时间下点亮板上的LED,被测试者按下按键以后,处理器计算从点亮灯到接收到按键之间的时间差,并将时间差通过USB显示在PC上,也可以将OLED用起来,在OLED上显示时间信息。
设计思路:预计在按下k2后,在oled屏上显示开始信息,随后经过定义范围内的随机时间,让12个led灯中的一个随机亮起。接下来开始计时。当接收到来自k1按钮的反馈后,计算间隔时间,显示在oled屏上。计时器开始休眠,等到下一次k2按钮传来反馈,进入下一次循环。
二.硬件介绍
STEP Pico是一款低成本,高性能的微控制器开发板,具有灵活数字接口(完全兼容Raspberry PiPico)。
硬件上,采用Raspberry Pi官方自主研发的RP2040微控制器芯片,搭载了ARMCortex MO+双核处理器,高达133MHz的运行频率,内置了264KB SRAM 和2MB闪存,还板载有多达26个多功能的GPIO引脚。
软件上,可选择树莓派提供的C/C++SDK,或者使用MicroPython进行开发,且配套有完善的开发资料教程,可方便快速入门开发并嵌入到产品中。
板卡硬件:
- 2个按键输入
- 4个单色LED
- 12个WS2812B RGB三色灯
- 1个姿态传感器
- 1个128*64 OLED显示屏
- 1个蜂鸣器
- 1个可调电位计(用于电压表)
- 1路音频信号输入(用于示波器)
- 8位R-2R电阻网络构成的DAC(用于DDS信号发生器)
功能及管脚映射表:
主要硬件:
WS2812B是一款智能控制LED光源,控制电路和RGB芯片集成在一个5050个组件的封装中。内部包括智能数字端口数据锁存器和信号整形放大驱动电路。还包括一个精密的内部振荡器和一个12V电压可编程恒流控制部分,有效地保证像素点光的颜色高度一致。
数据传输协议采用单一NZR通信方式。像素上电复位后,DIN端口接收控制器的数据,第一个像素采集初始的24位数据,然后发送给内部数据锁存器,另一个由内部信号整形放大电路整形的数据通过DO端口发送给下一个级联像素。每个像素传输后,信号减少24位。像素采用自动整形传输技术,使得像素级联数不受信号传输的限制,只依赖于信号传输的速度。
LED具有驱动电压低、环保节能、亮度高、散射角大、一致性好、功耗低、寿命长等优点。以上集成在LED上的控制芯片电路更加简单,体积小,安装方便。
SSD1306是一款带控制器的用于OLED点阵图形显示系统的单片CMOS OLED/PLED驱动器。它由128个SEG(列输出)和64个COM(行输出)组成。该芯片专为共阴极OLED面板设计。
SSD1306内置对比度控制器、显示RAM(GDDRAM)和振荡器,以此减少了外部元件的数量和功耗。该芯片有256级亮度控制。数据或命令由通用微控制器通过硬件选择的6800/8000系通用并行接口、I2C接口或串行外围接口发送。该芯片适用于许多小型便携式应用,如手机副显示屏、MP3播放器和计算器等。
三.实现的功能及图片展示
本项目实现要求的所有功能,每过3-5秒随机亮灯,按下k1后灯熄灭同时oled屏幕上显示反应时间,经过3秒后重复循环。此外,对原有功能进行了一定的改进,不再是自动重复循环,设定为按下k1显示时间后按下k2后开始新的一轮。同时在亮灯开始前屏幕上会显示“are you ready?”
按下k2,显示开始信息
经过3-5秒,led灯随机亮起
按下k1,测试结束,灯熄灭,显示反应时间
四.主要代码片段及说明
import ws2812b
import time
import random
from oled import oled
from button import button
from board import pin_cfg
from button import k2
from machine import Pin
调用函数模块
def print_ready():
oled.fill(0)
que = "are you ready?"
oled.text(que,0,32)
oled.show()
显示开始信息
def print_result(msg):
print(msg)
oled.fill(0)
oled.text(msg,0,32)
oled.show()
timer_start = 0
def k1_callback(pin):
ws2812b.off_all()
global timer_start
timer_reaction = time.ticks_ms() - timer_start
print_result("time was " + str(timer_reaction) + "ms")
k1 = button(pin_cfg.k1, k1_callback, trigger=Pin.IRQ_FALLING)
显示反应时间
while True:
if k2.value() == True:
print_ready()
time.sleep(random.uniform(3,5))
ws2812b.on(random.randint(1,12))
timer_start = time.ticks_ms()
time.sleep(3)
主函数:k2按下,显示开始信息,休眠3-5秒随机亮起灯,按下k1后显示反应时间
五.遇到的主要难题及解决方法
显示开始信息后,未及时请立屏幕上信息导致反应时间显示后字符重叠无法看清,加入oled.fill(0)后解决。
六.未来的计划或建议
本次的寒假一起练项目非日常有趣,既学习到了有用的知识,也体会到了学习新事物的快乐,但是还存在一些未解决的问题,比如如果在开始信息提示后,未在灯亮前便按下按钮,显示时间会错误,因为知识浅薄而不知道如何解决。以后我会更加努力学习有关python编程的知识,同时对于寒假一起练项目有一定的建议,鉴于寒假时期已经经过了一段时间的在校学习时间,可以提供一些更为复杂的内容,同时对于一些bug的修改提出要求。