基于树莓派pico实现反应测试小游戏
基于树莓派pico实现了测量反应时间的小游戏,可以在闲暇之余测试你的反应时间,给生活增添一些小乐趣
标签
嵌入式系统
数字逻辑
显示
2023寒假在家一起练
周海川
更新2023-03-28
北京理工大学
421

1 项目需求

随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间。

2    硬件介绍及环境配置

硬禾学堂树莓派pico平台:硬禾学堂为树莓派制作了一个适配的平台,搭载了2个按键输入、4个单色LED、12个WS2812 RGB三色灯、1个姿态传感器、1个128*64OLED显示屏、一个蜂鸣器、一个可调电位计(用于电压表)、1路音频信号输入(用于示波器)以及8位R-2R电阻网络构成的DAC(用于DDS信号发生器)

树莓派pico:

Raspberry Pi Pico 是一款树莓派官方设计的低成本,高性能的微控制器开发板,具有灵活数字接口。硬件上,采用 Raspberry Pi 官方自主研发的 RP2040 微控制器芯片,搭载了ARM Cortex M0 + 双核处理器,高达 133MHz 的运行频率,内置了 264KB 的 SRAM 和 2MB 的内存,还板载有多达 26 个多功能的 GPIO 引脚。软件上,可选择树莓派提供的 C/C++ SDK,或者使用 MicroPython 进行开发,且配套有完善的开发资料教程,可方便快速入门开发,并嵌入应用到产品中。

       在本次项目中主要利用了2个按键输入、12个WS2812 RGB三色灯以及OLED显示屏。

视频中演示用到的板子他的原理图具体可参考:https://www.eetree.cn/wiki/_media/stepico1.0.pdf

 

 

配置环境thonny:

为官方推荐的开发软件,thonny页面简洁,基础功能齐全,简单易上手,非常适合初学者(比如我)。安装的教程网上比较多,这里推荐一个硬禾学堂的教学视频https://class.eetree.cn/live_pc/l_60fe7f4fe4b0a27d0e360f74

3 实现的功能及图片展示

  • 随机点亮一颗LED灯,在灯亮起时按下K1按键,这时LCD屏幕上就会显示从灯亮起到按下按键的时间,也就是你的反应时间。
  • 再按下K2按键可以使屏幕清屏,使下一次游戏显示的时间不会跟上一次显示的时间重合。使得游戏可以不断的进行下去。
  • Fvy_E82jRbh62sVTZgvJKXTMsElA

4 设计思路

  • 随机点亮LED模块。
  • 对按键定义相应的回调函数K1定义为触发按键,用于记录并显示反应时间。K2定义为清屏按钮。
  • 写入循环中,使得游戏能持续进行。

5 框图

FnC_bkoqH5dzuQK81HhWgO_rVbAX

6 主要代码片段及说明

import ws2812b
import time
from oled import oled
from button import button
from board import pin_cfg
from machine import Pin
import random
##调用库函数

def print_result(msg):
    print(msg)##在电脑端打印反应时间
    oled.text(msg,50,32)##在屏幕打印反应时间
    oled.show()##调用显示函数显示文本

timer_start=0
##定义变量用于记录时间

def k1_callback(pin):
    global timer_start
    ##定义全局变量
    timer_reaction=time.ticks_ms()-timer_start
    ##记录反应时间,调用按键记录函数减去0得到反应时间
    print_result(str(timer_reaction)+"ms")
    ##调用打印函数,将反应时间输出

##定义K2按键的回调函数
def k2_callback(pin):
    oled.fill(0)
    ##调用清屏函数

k1=button(pin_cfg.k1,k1_callback,trigger=Pin.IRQ_FALLING)
##K1的按键函数
k2=button(pin_cfg.k2,k2_callback,trigger=Pin.IRQ_FALLING)
##K2的按键函数

##定义循环
while True:
    time.sleep(random.uniform(2,3))
    ##随机休眠2到3秒,确保游戏能够正确测量出反应时间,防止肌肉记忆
    ws2812b.on(random.randint(1,12))
    ##随机点亮一颗LED灯,由随机生成的随机数确定
    timer_start=time.ticks_ms()
    ##将按键时间记录到变量里面
    time.sleep(2)
    ##等待2s防止过快进入下一次游戏
    ws2812b.off_all()
    ##关闭所有的灯
    time.sleep(3)
    ##等待进入下一次循环,开始新的游戏

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

    首先遇到的问题是第一次使用micropython来写代码,由于micropython与python还是有很大的区别,所以在写代码的过程中需要去查询相应的语法,进行编程。其次是需要阅读库函数,了解每个函数的作用,便于使用。

    其次一开始运用循环进行游戏的时候会在屏幕显示出重影,这是由于上一次游戏显示的文本没有清屏,为此我加入了K2按键使屏幕在下一次游戏会清屏。正确显示下一次游戏的反应时间。

8 未来的建议及计划

  • 可以将游戏改进,连续进行5次游戏,显示平均反应时间,这样可以保证游戏测量的准确性,并且将5次游戏的反应时间依次显示在屏幕上。
  • 可以加入背景音乐为游戏配音,让游戏进行的更有意思
  • 可以改进游戏形式加入双人模式,双人同时比拼反应时间,显示两个按键按下的时间,决出胜者,增加趣味性。
  • 这次使用树莓派pico进行项目的实现是我第一次接触这类软硬件结合的自己DIY的板子,在这块板子上集成了许多有意思的小模块,有例如电位计,也有例如发声模块。其背后原理及使用值得我深究。如音频模块,如果我愿意的话甚至可以自己写一首按照自己所编的旋律播放歌曲,这很有意义。同时在使用这板子的时候,能很大程度的激发我的学习兴趣,让我主动的去学习相关的内容,这对自我提升很有帮助。以后我将继续学习pico相关的知识,写出更多有意思的小程序。
  • Micropython也支持自己编写库函数,可以实现将原有的库函数优化,使代码更加简洁。
附件下载
test.py
代码
团队介绍
北京理工大学 19级电子信息工程本科生
团队成员
周海川
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号