基于STEP Pico的嵌入式系统学习平台制作一个反应测试器
通过软件产生随机数,程序启动以后在随机数控制的时间下点亮板上的LED,被测试者按下按键以后,处理器计算从点亮灯到接收到按键之间的时间差,并将时间差通过USB显示在PC上,也可以将OLED用起来,在OLED上显示时间信息。
标签
嵌入式系统
PICO
2023寒假在家练
1120190810
更新2023-03-29
北京理工大学
684

项目总结报告

1.项目描述

本次“寒假在家一起练”活动中选择的是基于STEP Pico的嵌入式系统学习平台。我选择的是项目一——制作一个反应测试器。其具体要求如下:

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

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

2.设计思路

2.1开发板简介

图片包含 电路, 绿色, 盒子, 仪表  描述已自动生成

基于树莓派Pico的嵌入式系统学习平台专为嵌入式系统学习而设计,其可以通过C/C++以及MicroPython编程来学习嵌入式系统的工作原理和应用。本次的套件中含有如图所示的扩展板和核心板,其中扩展板上有按键、单色LED,RGB三色灯,姿态传感器,OLED显示屏,蜂鸣器,可调电位计,音频信号输入和DAC等可编程部件供学习者使用。该套件主要面向像我这样的从未接触过嵌入式系统的本科学生。核心板的管脚示意图及扩展板的管脚映射表如下所示:

x+87jhZxNHAMAAAAABJRU5ErkJggg==

表格  描述已自动生成

纵然在本项目配套课程中提供了多个库程序将这些管脚直接关联到了各个部件中使得我可以直接利用具象化的语言进行编程和开发(picospuch/eetree-mpy-lecture-code (gitee.com)),但查阅原始的示意图、阅读官方的SDK文档等仍然是深入学习嵌入式系统的必备技能,就本项目来说熟悉这些也可以帮助理解示例程序代码并快速上手开发板。

2.2程序设计

2.2.1环境搭建

由于是初次接触嵌入式系统,故而也选择了配套课程中使用的Thonny软件,并使用micropython进行开发。Thonny软件可于其官网www.thonny.org/进行下载,完成后安装即可使用。将开发板连接到电脑即可开始编程。

2.2.2程序设计思路

首先是对程序框架进行设计。我对于项目的设计思路可用如下流程图表示:

AygIM9lu9jEEAAAAAElFTkSuQmCC

2.2.3程序设计框架分析

一是观察开发板上需要用到的部件,分别是两个按键,灯以及OLED显示屏。在观察开发板时发现开发板上有两种灯,一种是单色LED灯,共4个;另一种是ws2812的RGB灯,共12个。我发现RGB灯具有更加明亮,发光面积更大,数量更多,易于观察的特点,故选取RGB灯作为项目开发的选项。注意到项目配套的课程仓库中有ws2812b.py,oled.py,button.py对应这些部件,还有board.py作为连接管脚的接口,这些都可以为项目的实现提供很大的帮助。

程序中主要包含以下内容:一是随机数的产生,包括亮灯前静止的随机时间,这是一个随机的实数,以及亮起的随机的灯的编号,这是一个随机的整数,可以调用random包来实现;二是按下键K1后必须立即中断正在进行的循环才能达到准确测试反应时间的目的,因此要借助button库中的callback命令来实现功能;三是对于反应时间的测量,即按下K1键的时刻减去灯亮起的时刻,需要调用time包来实现这一操作;四是我增加了对于是否在游戏中作弊的行为的判定,因此需要一个新的flag变量来满足需求;五是如何将测量结果准确无误的显示在oled显示屏上,这一步需要调用配套课程中的oled.py来辅助完成。

2.2.4程序设计

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

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

timer_start = 0

def k1_callback(pin):
    global timer_start, flag   
    if flag==0:
        print_result("cheat",10)
        flag=-1
    if flag==1:
        timer_reaction = time.ticks_ms() - timer_start # ticks_diff
        if timer_reaction>100:
            print_result("Your reaction",10)
            print_result("time was "+ str(timer_reaction) + "ms",20)
            #print_result(msg,y)
        else:
            print_result("cheat",10)
    ws2812b.off_all()
k1 = button(pin_cfg.k1, k1_callback, trigger=Pin.IRQ_FALLING)
k2 = button(pin_cfg.k2)
while True:
    if k2.value()==1:
        oled.fill(0)
        oled.show()
        flag = 0
        time.sleep(random.uniform(1,3))
        if flag==0:
            ws2812b.on(int(random.uniform(1,12.99)),"FF0000")
            timer_start = time.ticks_ms()
            flag = 1

搭建框架后,经过几次测试改进最终确定了如上图所示的代码。

主要调用的配套课程中的库程序代码片段:

class button:
    def __init__(self, pin, callback=None, trigger=Pin.IRQ_RISING, min_ago=200):
        #print("button init")
        self.callback = callback
            
        self.min_ago = min_ago
        self._next_call = time.ticks_add(time.ticks_ms(), self.min_ago)

        self.pin = Pin(pin, Pin.IN, Pin.PULL_UP)

        self.pin.irq(trigger=trigger, handler=self.debounce_handler)

        self._is_pressed = False

    def call_callback(self, pin):
        #print("call_callback")
        self._is_pressed = True
        if self.callback is not None:
            self.callback(pin)

这段代码提供了K1的callback功能。

from machine import Pin, SPI
from ssd1306 import SSD1306_SPI
import framebuf
from board import pin_cfg
 
spi = SPI(1, 100000, mosi=Pin(pin_cfg.spi1_mosi), sck=Pin(pin_cfg.spi1_sck))
oled = SSD1306_SPI(128, 64, spi, Pin(pin_cfg.spi1_dc),Pin(pin_cfg.spi1_rstn), Pin(pin_cfg.spi1_cs))

这段代码提供了oled上显示文字的功能。

2.3成果演示

将开发板连接到电脑,运行程序,在亮灯时,正常按下K1以及作弊时分别观察到了以下画面:

Z

9k=Z

同时,在PC端的面板中也可以看到相同结果:

文本  描述已自动生成

这表明程序设计达到了目标要求。

3.项目总结

3.1项目中遇到的难点和解决办法

项目中主要遇到的难点是之前从未接触过嵌入式系统和python语言程序设计,也因此在入门的时候遇到了语法错误、板子连接等问题。但随着对于项目配套课程的学习,这些问题都得到了化解(这里吐槽一下:在我拿到开发板后两天才将配套课程的优惠码发给我,这期间主要都是借一同参加的同学的光观看的)。凭借着配套课程中的库程序和示例程序,本次选择的项目对我还是相对简单的。

3.2未来的计划和建议

一是项目本身来说,我对于判定作弊的flag变量的使用仍有很大的优化空间。二是对于嵌入式系统开发来说,主要依靠他人提供的程序实例进行开发在长远看是行不通的,不学习C/C++的嵌入式开发也是行不通的。还是要进行更加深入的对于板子本身连线的学习才是正路。我对于嵌入式系统也就是将将看到门槛而已,希望未来还有机会继续学习。

附件下载
可编译程序.zip
解压后按说明使用
团队介绍
1120190810,李天琦,北理工学生
团队成员
1120190810
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号