基于step pico制作反应测试器
基于step pico制作反应测试器小实验,可测试我们的反应能力,同时在完成项目的过程中,学习嵌入式开发基础知识,学习嵌入式开发语言micropython,同时可以对树莓派RP2040有所了解,同时可以利用它来完成更多有趣的小实验。
标签
嵌入式系统
测试
显示
2023寒假在家练
zmb
更新2023-03-28
北京城市学院
424

基于step pico制作反应测试器

一、项目介绍

1、制作一个反应测试器

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

 

二、设计思路、框图

1、先在大循环下使一号灯珠以红色闪烁呈现

2、接着修改延迟时间,设置亮的时间为10s,灭的时间由均匀分布随机产生

3、当1号灯珠点亮时,用全局变量记录此时时刻

4、当按键按下,利用中断方式查询服务,计算出反应时间,并立即显示在PC机和OLED屏幕

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

FkL7_y0IVxmMhhSML7R0mLZzX81T

 

三、软件流程图

Fl9xg_2Puh9CVfStYDkqAU1O-07J


四、简单的硬件介绍

Fq7ECMRfZQmKymjA0EjX1hYCakmX

 

1、button

Fi0hS86vax2pv_4NVib2kPmv5nVk

GPIO内置上下拉,此实验选择K1连接GPIO12设置上拉、输入

按下时,弱上拉接地,输入0;未按下,输入1

FgGWtS3geWHZLSO5rmy75RwTe4j7

2、RGB LED

FsAW1oVAQDiCjXcd6fZ3ltuLcqqN

WS2812b GPIO18 单总线控制  

RGB颜色由24bit数来控制 前八位控制R 中间八位控制G 最后八位控制B

即红色就是ff0000,绿色就是00ff00,蓝色就是0000ff,白色就是ffffff。

3、OLED显示屏

Ft8mNA9Jhlho4evEeEi2UXlDBy3-

SPI1_RSTn GPIO8  复位

SPI1_DorC GPIO9 数据位

SPI_SCK GPIO10 时钟信号位

SPI_MOSI GPIO11 主输出从输入模式设置

128*64bit屏幕(PAGE 0-7)

FscjV7w3kyOm8RC4ptZQeAGYL427

SCLK:时钟线
SDIN:数据线
D/C#:数据或命令线(低电平命令线,高电平数据线)
CS#:片选线(低电平有效)

时序解读:片选选中—>命令还是数据设置好---->设置时钟上升沿(SCLK拉低延时一段时间再拉高)期间把数据放到数据线上。

 

五、实现的功能及图片展示

实现的功能:ws2812b1号灯以红色闪烁,红灯亮10s,灭的时间随机产生,当红灯亮时,按下按键K1,在显示屏和PC机上显示出从灯亮到按键之间的反应时间,并在PC机可进行数据统计分析。

Fl700YDpe_JYAvz7MQyx0jWRe7n0

FipCkcLGisQneT5h9zelKFw51j4Y

六、主要代码片段及说明

#自己定义的模块引入
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里找;开发方面,学会找资料,调用他人模块。也可以结合机器学习技术,训练出蜂鸣器按键式模型,温度传感器模型等,将所有的外设通过软件和硬件方式,充分利用起来。未来的研发之路需要更多走进国外的网站,去了解一些先进的技术和知识,并在实操中不断的优化和体会,实现理论与实践相结合。

附件下载
项目源代码.zip
相关的数据手册和软件学习资料.zip
团队介绍
北京城市学院 李亮
团队成员
李亮
北京城市学院 物联网工程专业
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号