基于step pico制作反应测试器
一、项目介绍
1、制作一个反应测试器
具体要求:随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间,这是心理学上的一个重要实验。
二、设计思路、框图
1、先在大循环下使一号灯珠以红色闪烁呈现
2、接着修改延迟时间,设置亮的时间为10s,灭的时间由均匀分布随机产生
3、当1号灯珠点亮时,用全局变量记录此时时刻
4、当按键按下,利用中断方式查询服务,计算出反应时间,并立即显示在PC机和OLED屏幕
实现方式:通过软件产生随机数,程序启动以后在随机数控制的时间下点亮板上的LED,被测试者按下按键以后,处理器计算从点亮灯到接收到按键之间的时间差,并将时间差通过USB显示在PC上,也可以将OLED用起来,在OLED上显示时间信息。
三、软件流程图
四、简单的硬件介绍
1、button
GPIO内置上下拉,此实验选择K1连接GPIO12设置上拉、输入
按下时,弱上拉接地,输入0;未按下,输入1
2、RGB LED
WS2812b GPIO18 单总线控制
RGB颜色由24bit数来控制 前八位控制R 中间八位控制G 最后八位控制B
即红色就是ff0000,绿色就是00ff00,蓝色就是0000ff,白色就是ffffff。
3、OLED显示屏
SPI1_RSTn GPIO8 复位
SPI1_DorC GPIO9 数据位
SPI_SCK GPIO10 时钟信号位
SPI_MOSI GPIO11 主输出从输入模式设置
128*64bit屏幕(PAGE 0-7)
SCLK:时钟线
SDIN:数据线
D/C#:数据或命令线(低电平命令线,高电平数据线)
CS#:片选线(低电平有效)
时序解读:片选选中—>命令还是数据设置好---->设置时钟上升沿(SCLK拉低延时一段时间再拉高)期间把数据放到数据线上。
五、实现的功能及图片展示
实现的功能:ws2812b1号灯以红色闪烁,红灯亮10s,灭的时间随机产生,当红灯亮时,按下按键K1,在显示屏和PC机上显示出从灯亮到按键之间的反应时间,并在PC机可进行数据统计分析。
六、主要代码片段及说明
#自己定义的模块引入
import ws2812b
from oled import oled
from button import button
from board import pin_cfg
#micropython 里面自带的模块
import time
from machine import Pin
import random
#在上位机端和Oled屏幕上同时显示反应时间
def print_result(msg):
print(msg)
oled.fill(0) #清空上一次oled上显示的信息
oled.text("reaction:"+msg+"ms",0,32) #生成要打印的文本信息 msg 对于位置预设置
oled.show() #显示
def k1_callback(pin):
global timer_start #每一次开始亮红灯的初始时间 全局变量
timer_reaction = time.ticks_diff(time.ticks_ms(),timer_start) # ticks_diff
print_result(str(timer_reaction)) #调用函数,显示结果
k1 = button(pin_cfg.k1,k1_callback,trigger=Pin.IRQ_FALLING) #K1 实例化 利用回调函数 进行中断服务
timer_start = 0 #设置初值
while True:
ws2812b.off(1) #一号灯珠灭
time.sleep(random.uniform(3,5)) # t=均匀分布产生的随机数 延迟t
ws2812b.on(1,"#ff0000") #一号灯珠亮
timer_start = time.ticks_ms() #ms计数器
time.sleep(10) #延迟10s
七、遇到的主要难题及解决方法
1、如何以点亮1号LED RGB?
解决方法:通过查找网上的例程,调用以及研究硬核学堂里相关开源代码https://gitee.com/picospuch/eetree-mpy-lecture-code,加入模块,按照例程调用函数。
2、如何使LED RGB亮红灯?
解决方法:查找ws2812b的数据手册https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf,了解到其是单总线控制,并且用24bit控制颜色,前8bit控制RED,中间8bit控制GREEN,后8bit控制BLUE。当前8位全为1时,加入红色,用十六进制表示就是两位控制FF,所以红色就是#ff0000。
3、如何得到反应时间?
解决方法:软件方面,调用micropython内置模块time,用其中的毫秒计时器,记下亮红灯时间,按下按键,中断服务开始,用time.ticks_diff进行反应时间计算。
4、如何减少计算反应时间的误差?
解决方法:首先,就是利用中断的方式能够快速响应;其次,以前判断按键按下以松手为一次,即设置上升沿触发,而现在判断则以按下为一次,其设置下降沿触发,正确计算反应时间,减小误差。
5、上一次OLED屏幕上的显示未清空,导致显示叠加
解决方法:通过查找例程和不断地调试程序,发现通过最初添加oled.fill(0)去清空屏幕再来做显示操作。
八、未来的计划与建议
通过这个平台的学习,了解了micropyton这门简洁的嵌入式开发语言,以及嵌入式系统相关的概念,对RP2040这款芯片和相应的外设大致了解,在动手实操中体悟硬件构造和程序设计内涵,在github上调用他人代码,自己可以进行相应修改和上层开发,后期还可以将其与面包板结合,阅读了解国外的一些先进技术,做一些更有意思的小实验。遇到问题,硬件方面啃英文的数据手册;软件方面,语法可以从micropython里找;开发方面,学会找资料,调用他人模块。也可以结合机器学习技术,训练出蜂鸣器按键式模型,温度传感器模型等,将所有的外设通过软件和硬件方式,充分利用起来。未来的研发之路需要更多走进国外的网站,去了解一些先进的技术和知识,并在实操中不断的优化和体会,实现理论与实践相结合。