板卡介绍
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口控制外设,同时也能够锻炼自己的反应速度。
这个项目使用了几种不同的技术来实现所需功能。以下是一些技术的简介:
-
SPI: SPI (Serial Peripheral Interface) 是一种串行通信协议,用于连接微控制器和外部设备。在本项目中,SPI用于连接开发板和OLED显示屏,以便在屏幕上显示文本信息。
-
中断: 中断是一种信号机制,用于暂停当前正在执行的程序并跳转到另一个程序,以响应事件。在本项目中,当用户按下按钮时,中断被触发,从而启动一个定时器,并在计时结束时点亮LED灯。
-
按键检测: 按键检测是一种检测按键状态的技术,可以通过检测开关的状态来判断用户是否按下按钮。在本项目中,按键检测用于检测用户何时按下按钮,并触发中断以启动LED灯计时器。
-
LED点亮: LED点亮是一种控制LED灯亮起或熄灭的技术。在本项目中,当用户按下按钮时,LED灯将被点亮,并在定时器计时结束后熄灭。
程序框图
代码介绍
这段 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的状态也会根据程序的逻辑进行闪烁和亮灭。
遇到的问题和解决方案
在这个项目中可能会遇到一些问题,下面列出几个可能的问题以及对应的解决方法:
-
硬件连接问题:在连接硬件时,可能会出现连接错误或未连接的问题。需要仔细检查硬件连接是否正确,并确认硬件是否正常工作。
-
代码调试问题:在编写代码时,可能会出现一些错误,如语法错误或逻辑错误。可以使用 REPL 环境或调试工具来帮助识别和解决这些问题。
-
显示屏幕问题:可能会出现屏幕无法显示的问题,需要确认是否正确连接了屏幕以及是否使用了正确的驱动程序。
-
按钮响应问题:可能会出现按键无法响应的问题。这可能是由于硬件问题或代码问题导致的。可以检查硬件连接是否正确,以及确认代码是否正确编写。
-
中断响应问题:在使用中断时,可能会出现中断无法正常响应的问题。这可能是由于硬件问题或代码问题导致的。需要仔细检查代码逻辑,并确认硬件连接是否正确。同时,需要确保中断处理程序执行的时间不会太长。
以上是可能遇到的一些问题及其解决方法,当然还有其他可能出现的问题。在开发过程中,需要不断尝试和调试,逐步解决问题,最终实现预期的功能。