项目总结报告
- 项目介绍
本次我参加的是电子森林硬禾课堂2023寒假在家练的项目一——基于STEP Pico的嵌入式系统学习平台。基于树莓派Pico的嵌入式系统学习平台专为嵌入式系统学习而设计,其可以通过C/C++以及MicroPython编程来学习嵌入式系统的工作原理和应用。我在其中完成的是做一个反应测试小游戏软件,制作一个反应测试器,具体要求:随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间,这是心理学上的一个重要实验。实现方式:通过软件产生随机数,程序启动以后在随机数控制的时间下点亮板上的LED,被测试者按下按键以后,处理器计算从点亮灯到接收到按键之间的时间差,并将时间差通过USB显示在PC上,也可以将OLED用起来,在OLED上显示时间信息。
2. 设计思路
通过随机数分类使led灯随即点亮,再通过按钮的中断反馈记录时间,最后通过oled将时间显示。
3.框图和软件流程图
框图
软件流程图
4.简单的硬件介绍
STEP Pico是一款低成本,高性能的微控制开发板,具有灵活数字接口(完全兼容Raspberry Pi Pico)。硬件上,采用Raspberry Pi官方自主研发的RP2040微控制器芯片,搭载了ARM Cortex M0+双核处理器,高达133MHz的运行频率,内置了264KB SRAM和2MB内存,还板载有多达26个多功能的GPIO引脚。软件上,可选择树莓派提供的C/C++SDK,或者使用 Micropython进行开发,且配套有完善的开发资料教程,可方便快速地入门开发并嵌入到产品中。
RP2040是树莓派基金会推出的第一款微控制器,相信会有更多新的型号陆续推出,而且新的型号也会依照同样的命名规则来标定其内核以及存储器的规格。树莓派Pico的两个Cortex-M0+处理器内核以48MHz(每秒4800万个周期)运行,如果程序中需要更高的性能,可以在软件中将其更改为133MHz(每秒1.33亿个周期)甚至更高。微控制器的RAM与处理器内核本身内置在同一芯片中,采用六个单独的存储库的形式,总共264kB(264,000 字节)的静态RAM (SRAM)。 RAM用于存储我们编写的程序及其所需的数据。
RP2040包括30个多功能通用输入/输出(GPIO)引脚,在Pico核心模块上引出了其中的26个到板边的邮票孔或通孔的管脚上,1个连接到板载LED。这26根用于连接外部器件的管脚中,其中三个GPIO引脚连接到模数转换器(ADC),而另一个ADC通道连接到片上温度传感器。
RP2040包括两个UART、两个SPI和两个I2C总线,用于连接传感器、显示器、数模转换器 (DAC) 等外部硬件设备。微控制器还包括可编程输入/输出 (PIO),让程序员可以在软件中定义新的硬件功能和总线。
官方的Pico板上采用了一个MicroUSB连接器,硬禾版本的Pico采用了USB Type-C连接器,它提供到RP2040微控制器的UART-over-USB串行链路通信并可以通过它对RP2040进行编程和交互,对核心模块的供电也是通过这个USB接口。插入电缆时按住BOOTSEL按钮会将微控制器切换到USB大容量存储设备模式加载新固件,硬禾版本的Pico核心模块在板上附加了一个复位按键(Run), 同时按下RUN和BOOTSEL两个按键即可以完成切换USB大容量存储设备模式加载新固件。
RP2040还包括一个精确的片上时钟和定时器,使其能够跟踪时间和日期。时钟可以存储年、月、日、星期、小时、分钟和秒,并且只要有电就会自动跟踪经过的时间。
最后,RP2040包括用于硬件调试目的的单线调试(SWD)端口,引出到Pico底部的三个引脚。
5.实现的功能及图片展示
实现led灯的随机点亮,实现oled灯显示反应时间。
6.主要代码片段及说明
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):
print(msg)
oled.text(msg,0,32)
oled.show()
time.sleep(3)
oled.fill(0)#打印反应时间
timer_start = 0
def k1_callback(pin):
global timer_start
timer_reaction = time.ticks_ms() - timer_start # ticks_diff
print_result(str(timer_reaction) + "ms")
k1 = button(pin_cfg.k1, k1_callback, trigger=Pin.IRQ_FALLING)#按键反馈
y = Pin(pin_cfg.yellow_led,Pin.OUT)
r = Pin(pin_cfg.red_led,Pin.OUT)
g = Pin(pin_cfg.green_led,Pin.OUT)
b = Pin(pin_cfg.blue_led,Pin.OUT)#四个led灯的变量
while True:
t = random.uniform(0,4)
if 0 <= t < 1:
y.on()
time.sleep(random.uniform(3,5))
y.off()
elif 1 <= t < 2:
r.on()
time.sleep(random.uniform(3,5))
r.off()
elif 2 <= t < 3:
g.on()
time.sleep(random.uniform(3,5))
g.off()
else:
b.on()
time.sleep(random.uniform(3,5))
b.off()#通过随机数使led灯随即点亮
timer_start = time.ticks_ms()
time.sleep(10)
7.遇到的主要难题及解决方法
问题一:实例的代码中,亮起的是12个白色的灯,要求当中需要亮起led灯。
解决方法:找到四个颜色的led灯对应的变量名,通过on和off函数对四个led灯进行开关控制
问题二:如何随机使led灯亮起
解决方法:通过一个0-4的随机数进行四次分类,每1就代表一个颜色的灯亮起
问题三:如何使oled清零从而显示下一次按键的反应时间
解决方法:用oled.fill函数清空oled屏幕
8.未来的计划或建议
未来计划研究更多与micropython相关的嵌入式平台,其既具有趣味性又具有很高的学习价值。