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

反应时间测试器

一.项目描述

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

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

设计思路:预计在按下k2后,在oled屏上显示开始信息,随后经过定义范围内的随机时间,让12个led灯中的一个随机亮起。接下来开始计时。当接收到来自k1按钮的反馈后,计算间隔时间,显示在oled屏上。计时器开始休眠,等到下一次k2按钮传来反馈,进入下一次循环。

二.硬件介绍

+J2ub1GEMhEfjAAAAAElFTkSuQmCC

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信号发生器)

功能及管脚映射表:

H5bq3Qj6XePiAAAAAElFTkSuQmCC

主要硬件:

wE0JoEzHeBaigAAAABJRU5ErkJggg==

WS2812B是一款智能控制LED光源,控制电路和RGB芯片集成在一个5050个组件的封装中。内部包括智能数字端口数据锁存器和信号整形放大驱动电路。还包括一个精密的内部振荡器和一个12V电压可编程恒流控制部分,有效地保证像素点光的颜色高度一致。

数据传输协议采用单一NZR通信方式。像素上电复位后,DIN端口接收控制器的数据,第一个像素采集初始的24位数据,然后发送给内部数据锁存器,另一个由内部信号整形放大电路整形的数据通过DO端口发送给下一个级联像素。每个像素传输后,信号减少24位。像素采用自动整形传输技术,使得像素级联数不受信号传输的限制,只依赖于信号传输的速度。

LED具有驱动电压低、环保节能、亮度高、散射角大、一致性好、功耗低、寿命长等优点。以上集成在LED上的控制芯片电路更加简单,体积小,安装方便。

5IADtjjQ5YAH4ECXAx6AA10OeAAOdDngATjQ5YAH4ECXAx6AA10OeAAOdDngATjQ5YAH4ECXAx6AA10OeAD+D+8BPTJYHKXtAAAAAElFTkSuQmCC

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?”

IMG_7504

按下k2,显示开始信息

IMG_7507

经过3-5秒,led灯随机亮起

IMG_7506

按下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后显示反应时间

wps

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

显示开始信息后,未及时请立屏幕上信息导致反应时间显示后字符重叠无法看清,加入oled.fill(0)后解决。

六.未来的计划或建议

本次的寒假一起练项目非日常有趣,既学习到了有用的知识,也体会到了学习新事物的快乐,但是还存在一些未解决的问题,比如如果在开始信息提示后,未在灯亮前便按下按钮,显示时间会错误,因为知识浅薄而不知道如何解决。以后我会更加努力学习有关python编程的知识,同时对于寒假一起练项目有一定的建议,鉴于寒假时期已经经过了一段时间的在校学习时间,可以提供一些更为复杂的内容,同时对于一些bug的修改提出要求。

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