2023寒假在家练 基于STEP Pico的嵌入式系统学习平台制作反应测试器
测试反应时间的DIY装置,利用LED和按键记录响应时间,展示心理学实验中的关键指标。
标签
显示
MCU
2023寒假在家练
john
更新2023-03-29
386

板卡介绍

RP2040是由Raspberry Pi公司开发的微控制器芯片,具有双核ARM Cortex-M0+处理器,集成了264KB SRAM和2MB闪存,并提供了各种接口和外设,如UART、SPI、I2C、ADC、PWM、GPIO等。RP2040还支持多种编程语言和开发环境,包括MicroPython、C、C++和Rust,同时还提供了适用于Windows、Mac和Linux的SDK和工具链。由于其高性能、低功耗、丰富的接口和易于编程的特点,RP2040被广泛应用于物联网、机器人、自动化和嵌入式系统等领域。

开发环境介绍

  • Micropython: Micropython是Python语言的一个精简版,适用于嵌入式系统和微控制器。它提供了Python语言的大部分功能和标准库,能够让你在嵌入式系统中使用Python语言进行开发。

  • VSCode: VSCode是微软推出的轻量级集成开发环境,支持多种编程语言和扩展插件。它提供了丰富的功能,例如代码提示、代码高亮、代码自动补全、调试等,是开发Micropython的理想工具。

  • Mu-editor: Mu-editor是专门为Micropython开发设计的轻量级集成开发环境。它提供了简洁的用户界面和易于使用的功能,支持代码高亮、代码自动补全、REPL交互式命令行等。

  • Win10: Win10是微软推出的最新操作系统,是目前最流行的桌面操作系统之一。它提供了许多开发和编程工具,包括Python和Micropython。在Win10上,你可以使用VSCode和Mu-editor来进行Micropython的开发和调试。开发思路

我选择的题目是制作一个反应测试器,这个测试器会随机点亮板上的一个LED,被测试者需要按下板上的一个按键,处理器会计算从点亮LED到接收到按键之间的时间差,并将时间差通过USB显示在PC上或者在OLED上显示时间信息。

这个反应测试器的实现使用了rp2040硬件平台,并且使用了MicroPython编程语言进行编写。在硬件方面,使用了LED、按键和OLED等外设,并且使用了rp2040的GPIO口进行控制。在软件方面,编写了一段程序实现了随机数产生、LED点亮、按键响应、时间差计算等功能。通过这个项目,你能够学习到如何在rp2040硬件平台上使用MicroPython进行开发,以及如何使用GPIO口控制外设,同时也能够锻炼自己的反应速度。

这个项目使用了几种不同的技术来实现所需功能。以下是一些技术的简介:

  1. SPI: SPI (Serial Peripheral Interface) 是一种串行通信协议,用于连接微控制器和外部设备。在本项目中,SPI用于连接开发板和OLED显示屏,以便在屏幕上显示文本信息。

  2. 中断: 中断是一种信号机制,用于暂停当前正在执行的程序并跳转到另一个程序,以响应事件。在本项目中,当用户按下按钮时,中断被触发,从而启动一个定时器,并在计时结束时点亮LED灯。

  3. 按键检测: 按键检测是一种检测按键状态的技术,可以通过检测开关的状态来判断用户是否按下按钮。在本项目中,按键检测用于检测用户何时按下按钮,并触发中断以启动LED灯计时器。

  4. LED点亮: LED点亮是一种控制LED灯亮起或熄灭的技术。在本项目中,当用户按下按钮时,LED灯将被点亮,并在定时器计时结束后熄灭。

程序框图

FoIzFt-Z3_XweH52FKN6puTuYhkH

代码介绍

这段 MicroPython 代码实现了一个反应测试器的功能,包括随机点亮板上的一个 LED,按下板上的一个按键,显示从灯亮到按键之间的时间差。具体来说,代码中定义了两个回调函数,其中 callback() 函数在接收到指定的 GPIO 中断后,会调用计时器,倒计时一定的时间(在2-10秒之间随机选择),并点亮 LED。计时器倒计时结束后,LED 会熄灭,等待用户按下按键。在 callback_human() 函数中,计算从点亮 LED 到用户按下按键之间的时间差,并将这个时间差通过 OLED 显示屏显示出来。程序还定义了一个 OLED_TEXT 类,用于 OLED 显示屏的初始化和文本显示。

class OLED_TEXT:
    def __init__(self):
        spi = machine.SPI(
            1,
            baudrate=8000000,
            polarity=0,
            phase=0,
            sck=machine.Pin(10),
            mosi=machine.Pin(11),
        )
        # oled = ssd1306.SSD1306_SPI(128, 32, spi, machine.Pin(9), machine.Pin(8), machine.Pin(16))
        self.oled = ssd1306.SSD1306_SPI(
            128, 64, spi, machine.Pin(9), machine.Pin(8), machine.Pin(17)
        )
        self.clean()
    def clean(self):
        self.oled.fill(0)
        self.oled.show()
    def text(self, text, x,y):
        self.oled.text(text, x, y)
        self.oled.show()

程序初始化时,会定义三个 GPIO,分别用于 LED 和两个按键,设置一个计数器 count,用于统计用户按下按键的次数,以及一个全局变量 global_delay,用于存储随机生成的时间差。此外,程序还定义了两个函数 set_delay() 和 set_random(),用于设置时间差和生成随机时间差。程序中的主函数则是一个无限循环,等待用户按下按键,并处理用户的按键事件,统计按键次数,重置全局变量和计数器,以便进行下一轮测试。

def callback(pin):
    global interrupt_flag, debounce_time,global_delay
    if (time.ticks_ms()-debounce_time) > 100:
        interrupt_flag= 1
        debounce_time=time.ticks_ms()
        led.value(0)
        count_down()
        led.value(1)

def callback_human(pin):
    global debounce_time,debounce_time_k2
    if (time.ticks_ms()-debounce_time_k2) > 100:
        interrupt_flag= 1
        debounce_time_k2=time.ticks_ms()
        # set_random()
        # count_down()
        # update_screen()
        delay = debounce_time_k2-debounce_time
        print(delay)
        led.value(0)
        oled_obj.clean()

        oled_obj.text("sys delay:%s"%(global_delay*1000),0,0)
        oled_obj.text("yr  delay:%s"%(delay-3000-global_delay*1000),0,9)
        oled_obj.text("unit: ms",0,18)

        # print(global_delay)
        # time.sleep(global_delay/1000)
        # led.toggle()


pin1.irq(trigger=Pin.IRQ_FALLING, handler=callback)
pin2.irq(trigger=Pin.IRQ_FALLING, handler=callback_human)

总的来说,这段代码实现了一个简单的反应测试器,可以帮助心理学实验室和生物反应实验室测量反应时间和反应速度。

运行情况

当用户按下第一个按钮时,开发板上的LED会闪烁一次,并开始倒计时,直到倒计时结束。在倒计时过程中,开发板会在OLED屏幕上显示倒计时的数字。倒计时结束后,LED会亮起,并随机生成一个延迟时间,在延迟时间结束后再次开始等待用户按下第一个按钮。

当用户按下第二个按钮时,开发板会记录下按下按钮的时间,并在OLED屏幕上显示系统延迟和用户按下按钮的延迟时间(单位为毫秒),然后LED会亮起。

在开发板上运行完代码后,可以在OLED屏幕上看到倒计时的数字,以及在按下第二个按钮时显示的延迟时间信息。同时,LED的状态也会根据程序的逻辑进行闪烁和亮灭。

FnT0UGbqhzXwhgw5j_XOiYYLhn3jFrg5SPipwInrBFDV0u82kArOa_OaFnA_vA2wDlPhNxCj4Sue7oSm9ki8

Fg7vYsD79_y8aC4y_Yszqut3ov98遇到的问题和解决方案

在这个项目中可能会遇到一些问题,下面列出几个可能的问题以及对应的解决方法:

  1. 硬件连接问题:在连接硬件时,可能会出现连接错误或未连接的问题。需要仔细检查硬件连接是否正确,并确认硬件是否正常工作。

  2. 代码调试问题:在编写代码时,可能会出现一些错误,如语法错误或逻辑错误。可以使用 REPL 环境或调试工具来帮助识别和解决这些问题。

  3. 显示屏幕问题:可能会出现屏幕无法显示的问题,需要确认是否正确连接了屏幕以及是否使用了正确的驱动程序。

  4. 按钮响应问题:可能会出现按键无法响应的问题。这可能是由于硬件问题或代码问题导致的。可以检查硬件连接是否正确,以及确认代码是否正确编写。

  5. 中断响应问题:在使用中断时,可能会出现中断无法正常响应的问题。这可能是由于硬件问题或代码问题导致的。需要仔细检查代码逻辑,并确认硬件连接是否正确。同时,需要确保中断处理程序执行的时间不会太长。

以上是可能遇到的一些问题及其解决方法,当然还有其他可能出现的问题。在开发过程中,需要不断尝试和调试,逐步解决问题,最终实现预期的功能。

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