找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

937

积分

0

好友

120

主题
发表于 前天 02:20 | 查看: 13| 回复: 0

本项目基于 Raspberry Pi Pico(RP2040) 微控制器,实现了一个功能完整的 反应速度测试器。系统会在随机时间点点亮板载 LED,用户在看到灯光后立即按下指定按键,程序将自动计算并实时显示从 LED 点亮到按键触发之间的精确时间差。

在实现上,该项目综合运用了 GPIO 控制、按键中断、随机数生成、高精度计时以及 OLED 显示驱动 等嵌入式开发基础模块,并加入了简单的防误触逻辑,以确保测量结果的准确性。

硬件平台介绍

项目使用的硬件是基于树莓派Pico的嵌入式学习平台,包含一块扩展板及一个核心模块。核心板采用了 Raspberry Pi 官方自主研发的 RP2040 微控制器芯片,搭载双核 ARM Cortex M0+ 处理器,运行频率高达 133MHz,内置 264KB SRAM 和 2MB 闪存,并提供了多达 26 个多功能 GPIO 引脚,非常适合进行此类需要精确时序控制与硬件交互的项目。

核心板引脚图

软件层面,开发者可以选择使用官方的 C/C++ SDK 或 MicroPython 进行编程。本项目采用 MicroPython 实现,得益于其简洁的语法和丰富的硬件库,能够快速完成原型开发。

项目设计思路

整个程序流程围绕点灯、按键检测与结果显示三个核心功能展开。系统启动后,首先在 OLED 屏上显示操作引导,等待用户按下启动键。随后,程序在随机延时后点亮随机一个 LED,并开始计时。用户看到灯光后按下反应键,程序立即停止计时,计算时间差并显示结果。程序流程图清晰地描述了这一逻辑。

程序流程图

功能实现详解

  1. 用户引导界面
    程序启动后,OLED 屏显示“Press K2 button to start”,提示用户开始测试。

    启动引导界面

    按下 K2 键后,屏幕更新为“Please press K1 button when the led light is on”,明确接下来的操作规则,等待约 2 秒后进入测试状态。

    操作提示界面

  2. 随机 LED 触发
    测试开始,四个彩色 LED 中的一个会在随机时间后被点亮,同时 OLED 屏清屏,确保用户注意力集中在灯光信号上。

    随机 LED 点亮效果
    随机 LED 点亮效果

  3. 结果显示
    当用户在 LED 亮起时正确按下 K1 键,OLED 屏将立即显示本次的反应时间,单位为毫秒 (ms)。

    反应时间显示

  4. 防误触设计
    为防止误操作影响结果,程序增加了判断逻辑。如果用户在 LED 未亮起时按下 K1 键,屏幕会显示“Error!”进行提示。

    错误提示界面

  5. 结束测试
    完成一次或多次测试后,再次按下 K2 按钮即可退出测试循环。

核心代码解析

1. 随机点灯与灭灯控制
通过 random 模块生成随机数来决定点亮哪个 LED,点灯和灭灯操作被封装为独立的函数。

from led import r, g, b, y

def Led_off(): # 灭灯
    y.off()
    r.off()
    g.off()
    b.off()

def Led_on(): # 随机点灯
    seed = random.randint(1, 4)
    if seed == 1:
        y.on()
    elif seed == 2:
        r.on()
    elif seed == 3:
        g.on()
    elif seed == 4:
        b.on()

其中,yrgb 是四个 Pin 对象,在 led.py 中定义,它们对应板上的四个 LED 引脚。

from board import pin_cfg
from machine import Pin

r = Pin(pin_cfg.red_led, Pin.OUT)
g = Pin(pin_cfg.green_led, Pin.OUT)
b = Pin(pin_cfg.blue_led, Pin.OUT)
y = Pin(pin_cfg.yellow_led, Pin.OUT)

2. 按键中断与时间计算
按键检测使用了中断机制,以实现毫秒级的精确响应。当 K1 键被按下时,触发回调函数计算反应时间。

from button import button
import time

lock = False
timer_start = 0 # 初始化计时起点

def Error(): # 防呆函数
    msg = "Error!"
    print(msg)
    oled.init_display()
    oled.text(msg, 0, 32)
    oled.show()

def k1_callback(pin):
    global timer_start
    global lock
    if not lock: # 如果灯没亮就按键
        Error()
        return
    # 计算反应时间
    timer_reaction = time.ticks_ms() - timer_start
    oled.text('Your reaction', 0, 20, 1)
    oled.text('time was ' + str(timer_reaction) + 'ms', 0, 40, 1)
    oled.show()
    Led_off() # 熄灭LED
    lock = False # 重置锁

# 实例化K1按键对象,设置下降沿触发中断
k1 = button(pin_cfg.k1, k1_callback, trigger=Pin.IRQ_FALLING)

3. OLED 屏幕驱动
OLED 显示基于 SSD1306 驱动芯片,使用 SPI 接口进行通信。

from machine import Pin, SPI
from ssd1306 import SSD1306_SPI
from board import pin_cfg

# 初始化 SPI 总线
spi = SPI(1, 100000, mosi=Pin(pin_cfg.spi1_mosi), sck=Pin(pin_cfg.spi1_sck))
# 实例化 OLED 对象
oled = SSD1306_SPI(128, 64, spi, Pin(pin_cfg.spi1_dc), Pin(pin_cfg.spi1_rstn), Pin(pin_cfg.spi1_cs))

项目总结与展望

本项目成功实现了基于 树莓派PicoMicroPython 的反应速度测试器,涵盖了从硬件初始化、信号触发、精确计时到结果显示的完整嵌入式开发流程。通过这个实践,可以深入理解 GPIO 控制、中断处理等核心概念。

项目仍有进一步的优化空间,例如:

  1. 在每次测试间隔增加 OLED 屏上的倒计时提示。
  2. 为按键动作添加声音反馈,提升交互体验。
  3. 实现多次测试自动计算并显示平均反应时间的功能,使测量更具统计意义。

这个项目展示了如何使用低成本、高性能的微控制器平台快速验证一个有趣的交互式硬件应用,为学习更复杂的嵌入式系统与云原生设备开发打下了良好的基础。




上一篇:Redis与MySQL数据一致性:高性能高可靠方案设计及面试解析
下一篇:联想ThinkStation P520工作站搭建All-in-One服务器方案与性价比指南
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 20:52 , Processed in 0.171467 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表