基于STEP Pico的嵌入式系统学习平台制作测量反应时间程序
STEP Pico是一款低成本、高性能的微控制器开发板,具有灵活数字接口。使用MicroPython进行开发,完成了反应时间的测量程序。
标签
树莓派
嵌入式系统
2023寒假在家练
北理工Arno
更新2023-03-29
北京理工大学
609

1 开发环境

      作为官方推荐的开发软件,thonny页面简洁,基础功能齐全,简单易上手。硬禾课堂提供了代码仓库,可以基于这些开源代码完成项目的功能所需。此项目需要button、board、oled、machine库,提前在GitHub库中下载并复制到Pico中。

      树莓派是一种开源硬件平台,可用于开发各种嵌入式系统和项目。硬禾学堂树莓派pico平台:硬禾学堂为“寒假一起练”制作了一个平台,在此平台上可以查阅Pico相关的接口、引脚的功能。并且提供了大量的关于MicroPython编程相关的知识辅助我们完成项目。

      板卡硬件包含了树莓派Pico扩展板 x1、硬禾版本树莓派Pico核心模块- STEP Pico x1。具体包括为2个按键输入、4个单色LED、12个WS2812B RGB三色灯、1个姿态传感器、1个128*64 OLED显示屏、1个蜂鸣器、1个可调电位计(用于电压表)、1路音频信号输入(用于示波器)、8位R-2R电阻网络构成的DAC(用于DDS信号发生器)。

      本模块为兼容树莓派官方Pico的核心模块,在其基础上增加了4个WS2812彩色灯,1个电源指示灯、以及一个复位按键,USB端口也改成了Type C。

2Q==

图1 核心板引脚图

2 完成的功能及达到的性能

2.1测量反应时间

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

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

wADBAIAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADrZrCu1DtPgAAAAASUVORK5CYII=

图2 测量反应时间入场动画图

      采用外部中断,下降沿触发模式,在未按下k1键时处于高电平,LED灯亮后立即按下k1键后,计算灯亮和下降沿之间的时间差,并作为所要测量的反应时间。在实测中,时间精度是1ms,本人的反应时间可以达到100ms以内。

2.2代码功能

      通过OLED屏幕展示入场动画;如图2所示。当按下K1按钮时,计算反应时间并通过OLED屏幕展示测试结果;当按下K2按钮时,停止测试并点亮WS2812B灯带显示测试结束;在测试过程中,先通过WS2812B灯带点亮黄色灯,等待一段随机时间后,熄灭灯光并等待8秒再次开始新的测试。

2.3程序解释

Fo1WOn2z1QayjSWHzTeCDpm-OvVV

      此程序是一个反应游戏程序,它测试用户的反应时间。在游戏开始前,程序会显示 "Reaction Game" 的入场动画,并在 OLED 屏幕上显示相应的提示信息。

      游戏开始后,LED 灯带会呈现黄色,表示游戏即将开始,此时程序会随机生成一个时间间隔,等待该时间间隔后,LED 灯带会呈现红色,表示玩家需要尽快按下按钮以测量其反应时间。当玩家按下按钮后,程序会计算反应时间并在 OLED 屏幕上显示结果。玩家还可以按下第二个按钮来提前结束游戏。

      在代码中,k1_callback 函数处理玩家按下第一个按钮时的逻辑,包括计算反应时间并在 OLED 屏幕上显示结果;k2_callback 函数处理玩家按下第二个按钮时的逻辑,包括结束游戏并在 OLED 屏幕上显示结果。red_light 和 yellow_light 函数分别用于控制 LED 灯带的颜色。

      程序通过循环不断地等待玩家按下按钮来测量反应时间,当玩家按下第二个按钮时,程序会结束循环并结束游戏。

9k=

图3 测试反应时间OLED屏幕显示结果

2Q==

图4 按下K2后测试结束画面

3 关键代码

import ws2812b
import time
from oled import oled
from button import button
from board import pin_cfg
from machine import Pin
import random

      首先需要初始化,这段代码导入了多个模块,用于控制硬件组件,比如 OLED 屏幕、按钮和 WS2812B LED 灯带,同时还导入了内置模块 time、random、board 和 machine。

k1 = button(pin_cfg.k1, k1_callback, trigger=Pin.IRQ_FALLING)

      PIN类irq函数为外部中断函数, 参数trigger为中断触发条件,设置为边缘触发或者电平触发。此处是下降沿触发,保证了在按下时就记录时间。

      k1绑定了树莓派的引脚"pin_cfg.k1"。在按钮对象上注册了回调函数"k1_callback",当按钮被按下时,回调函数将被触发。"trigger=Pin.IRQ_FALLING"参数表示使用下降沿触发,即当按钮从高电平变为低电平时触发回调函数。

FvCjsp4uZlZhNyeikHoY5tMLNako      在嵌入式系统中,引脚扮演着非常重要的角色,它们用于连接外部设备,如传感器、执行器等,并通过编程来控制它们的行为。树莓派的引脚可以用来执行多种任务,例如控制LED、读取按钮状态、读取传感器数据等。 "button"模块是一个方便的工具,可以用于读取按钮状态并在按钮被按下时执行特定的操作。

def print_result(msg):
    global x
    global y  # oled屏幕字符的起始坐标
    length = int(len(msg))
    if length > 16:
        oled.text(msg[x:x + 16], 0, y)
        y = y + 12  # 12是行间距
        x = x + 16
        oled.show()
        oled.text(msg[x:length], 0, y)
        oled.show()
        x = 0
        y = 20
    else:
        oled.text(msg, 0, y)
        oled.show()

      定义OLED屏幕的输出格式,实现不同长度的换行和位置选择。

def k1_callback(pin):
    global test_finished
    global timer_start
    timer_reaction = time.ticks_ms() - timer_start
    oled.text("-Reaction-Game-",0,0)
    oled.show()
    print_result("Your reaction time was " + str(timer_reaction) + "ms!")
   
def k2_callback(pin):
    global test_finished
    red_light()
    test_finished = 1

      此段定义了按键K1、K2的用途,K1是继续实现反应时间的测量,K2是结束测试。

 timer_start = time.ticks_ms()

      这行代码创建了一个名为"timer_start"的变量,并将其初始化为当前时间的毫秒数。在这个代码片段中,这个变量被用于记录游戏开始的时间,以便在玩家按下按钮时计算出玩家的反应时间。

      在嵌入式系统中,时间管理非常重要。它是许多应用程序的核心,例如计时器、时钟、测量等。树莓派提供了一个内置的计时器,可以轻松地测量时间间隔。 "time"模块包含许多有用的功能,例如"ticks_ms()",它返回当前时间的毫秒数。通过获取时间戳并在不同的时间戳之间进行计算,我们可以测量时间间隔,例如在这个反应游戏中测量玩家的反应时间。

time.sleep(random.uniform(3, 5))

      生成随机数,完成下一次反应时间的测量。此处是利用平均分布生成3—5秒的时间间隔。再按下k2键之前将会一直处于反应时间测量的循环里。

4 未来计划

      树莓派是一种小型、低功耗的计算机,它的强大性能和灵活性使其成为嵌入式开发的理想选择。在这个寒假借助硬禾课堂的这次机会学习树莓派嵌入式开发,并在这个过程中收获了很多。在这里,我想分享我的学习心得以及未来的计划。

      首先,学习树莓派嵌入式开发需要具备一定的编程和电子知识。对于我这样的初学者来说,最好的方式是通过一些在线课程或书籍进行学习。在学习的过程中,我学会了如何使用 GPIO 来控制硬件组件、如何使用 Python 进行编程等。其次,我发现实践非常重要。树莓派是一种非常实用的开发板,可以很容易地进行实验和调试。我制作了一个简单的反应时间测量和交通信号灯模型。这些实践项目帮助我深入了解嵌入式系统,并且让我意识到我可以在这个领域做出很多有趣的事情。

      未来,我计划继续学习树莓派嵌入式开发,并尝试更复杂的项目。我想使用树莓派来控制一些机器人或无人机,并实现一些自主控制的功能。我还想深入学习机器学习和人工智能,并将其应用到树莓派嵌入式系统中,实现更为复杂的任务。

      总之,学习树莓派嵌入式开发是一项很有意义的事情,它可以让我深入了解计算机系统和硬件组件,并在实践中不断提升自己。在未来,我相信我可以用这种知识和技能做出很多有用的项目,并为社会做出一些贡献。

 

软硬件
元器件
WS2812B
WS2812B是一款智能控制LED光源,它将控制电路和RGB芯片集成到5050组件包中。它包括智能数字端口数据锁存器和用于放大驱动器的信号整形电路。它还包括一个内部精密振荡器和一个恒流5电压控制端口,以确保一致的像素点光颜色高度。这些可以添加到全彩面板、条状全彩软灯、led装饰照明和不规则视频室内外led屏幕。
附件下载
reaction_game.py
团队介绍
陈宏 北京理工大学 信息与电子学院
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号