基于STEP Pico的嵌入式系统设计反应测试器
反应测试器基于STEP Pico的嵌入式系统,经验证,可按预设正常工作。
标签
嵌入式系统
反应测试器
2023寒假在家练习
zyxxx
更新2023-03-30
北京理工大学
278

一.项目描述

 

1.项目介绍

 

本项目是基于STEP Pico的嵌入式系统,应用micropython语言,自主设计完成一款反应测试器。该项目所使用的硬件设备——基于STEP Pico的嵌入式系统,STEP Pico是一款低成本,高性能的微控制器开发板,具有灵活数字接口。该开放板在硬件上采用Paspberry Pi官方自主研发的RP2040微控制器芯片,搭载了ARM Cortex M0+双核处理器,高达133MHz的运行频率,内置了264KB SRAM和2MB闪存,还板载有多达26个多功能的GPIO引脚。软件上可选择树莓派提供的C/C++SDK或者使用MicroPython进行开发。而本项目所使用的开发软件是官方推荐的thonny,所采用的设计语言就是MicroPython。该开发软件页面简洁,基础功能齐全,简单易上手,该设计语言也比较通俗易懂,逻辑简单,非常适合初学者。本项目设计的反应测试器是一款用于测试测试者反应时间的游戏,随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间,这是心理学上的一个重要实验。

 

2.设计思路

 

首先在PC端的thonny开发软件上编写程序,编写完成之后连接开发板和PC端,将编写好的程序完成上载和编译,并在开发板上测试程序的正确性。首先点击点击PC端的运行键,代码开始在开发板上运行,此时间隔1到5秒的随机时间,红色、黄色、绿色和蓝色的LED灯会通过1到5的随机数根据不同的区间随机点亮一种颜色的LED灯,测试者在看到灯亮的同时迅速点击开发板上的k1按键,按下按键并松开之后,OLED显示屏上会显示出反应测试时间,即是本次测试中测试者通过该反应测试器测得的反应时间,然后间隔3s后开始下一轮测试。

 

3.软件流程图

FmlVD_5Wew6aJkILJoGFST9s5mE-

二.硬件简介

 

作为一个嵌入式系统的学习平台,首先要基于核心芯片的核心板的特点以及嵌入式系统的关键知识点来定义这款学习平台:树莓派Pico/RP2040的基本特性:板上通过MicroUSB供电,能过够给扩展板提供3.3V的直流电压、26根IO用于扩展,支持SPI、I2C、PWM、PIO、板上一颗单色LED可用于基本的测试、40Pin 邮票孔、双列直插孔的方式连接扩展板、面包板。嵌入式系统入门要掌握的知识要点:数字输入 - 单IO(按键)、总线(传感器)、模拟输入 - 可调电压信号源、输出显示、控制 - 单IO(电平、PWM)、总线(单总线、I2C、SPI)、中断、查询、内存分配、DMA。学习板的功能、性能要求:能够体验输入、输出的外设,尤其是典型总线的连接、能够构建多种有趣、有技术含量的项目、声音的输入和输出、主要显示器件的使用 - LED、OLED、WS2812、能够使用到PIO功能并体现其优势的外设。

 

三.实现功能及图片展示

 

该反应测试器可以测试出测试者的反应时间并将反应时间分别显示在开发板的OLED屏和PC端上。

 

图片展示如下:

FiaOu4j71MtgMWOw7c3ArDbOfGIwFnMwEjx_4l7aWQPmzLN8ZggLAzft

 

四.主要代码片段

 

1.顶层代码

from oled import oled
from button import button
from board import pin_cfg
from machine import Pin

import time
import random

该部分主要是调用一些顶层代码和写好的函数库

 

2.全局变量

timer_start = 0

这三个全局变量分别代表测试时间开始时刻的记录。

 

3.print函数

def print_result(msg):
    print(msg)
    oled.text(msg,32,32)
    oled.show()

该部分定义函数print_result的功能,该函数的功能实输出结果,可以同时在开发板的OLED显示屏和PC端的thonny上显示输出结果。

 

4.k1按键调回函数

def k1_callback(pin):
    oled.fill(0)
    global timer_start
    timer_reaction = time.ticks_ms() - timer_start
    print_result(str(timer_reaction) + "ms")

 

按下k1按键之后的调回函数,该函数执行在k1按键松开之后的命令(即下降沿到临时)。首先清空OLED显示屏上的内容,然后计算当前时刻(即按下并松开k1按键的时刻)和灯亮时刻的时间差。 

 

5.主循环函数

while True:
    oled.fill(0)
    led_red = Pin(pin_cfg.red_led,Pin.OUT)
    led_yellow = Pin(pin_cfg.yellow_led,Pin.OUT)
    led_blue = Pin(pin_cfg.blue_led,Pin.OUT)
    led_green = Pin(pin_cfg.green_led,Pin.OUT)
    led_red.off()
    led_yellow.off()
    led_blue.off()
    led_green.off()
    random_time = random.uniform(1,5)
    time.sleep(random.uniform(1,5))
    if random_time > 1 and random_time <= 2 :
        led_yellow.on()
    if random_time > 2 and random_time <= 3 :
        led_red.on()
    if random_time > 3 and random_time <= 4 :
        led_green.on()
    if random_time > 4 and random_time <= 5 :
        led_blue.on()
    timer_start = time.ticks_ms()
    time.sleep(3)

 

对OLED显示屏和LED灯的初始状态做定义,产生一个1到5的随机数,根据随机数所处的不同区间四种颜色中对应区间的一种颜色LED灯灯灭1到5秒的随机时间亮起,并记录灯亮起的时间,最后间隔3s时间。

 

6.button函数调用

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

 

调用顶层文件中的button函数,在k1按键松开时触发,即下降沿。

 

五.主要难题及解决方法

 

首先是开发软件thonny的使用,虽然该开发软件操作简单,但是由于是第一次使用,还是不够熟练,在不断的调试过程中逐渐熟悉。 

 

六.未来的计划和建议

 

我希望硬禾学习平台的教学视频可以更加注重在操作细节的讲解方面,而不是直接给出源代码。

在未来的学习过程中,我会继续学习使用STRP Pico开发板,并争取将其余有趣的项目也逐个完成,并自己使用开发板做一些创新。

 

七.整体代码

from oled import oled
from button import button
from board import pin_cfg
from machine import Pin

import time
import random

timer_start = 0

def print_result(msg):
    print(msg)
    oled.text(msg,32,32)
    oled.show()

def k1_callback(pin):
    oled.fill(0)
    global timer_start
    timer_reaction = time.ticks_ms() - timer_start
    print_result(str(timer_reaction) + "ms")
    

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

while True:
    oled.fill(0)
    led_red = Pin(pin_cfg.red_led,Pin.OUT)
    led_yellow = Pin(pin_cfg.yellow_led,Pin.OUT)
    led_blue = Pin(pin_cfg.blue_led,Pin.OUT)
    led_green = Pin(pin_cfg.green_led,Pin.OUT)
    led_red.off()
    led_yellow.off()
    led_blue.off()
    led_green.off()
    random_time = random.uniform(1,5)
    time.sleep(random.uniform(1,5))
    if random_time > 1 and random_time <= 2 :
        led_yellow.on()
    if random_time > 2 and random_time <= 3 :
        led_red.on()
    if random_time > 3 and random_time <= 4 :
        led_green.on()
    if random_time > 4 and random_time <= 5 :
        led_blue.on()
    timer_start = time.ticks_ms()
    time.sleep(3)

 

附件下载
reaction_time_test_game.py
团队介绍
张雨馨-北京理工大学
团队成员
zyxxx
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号