1.项目介绍:
项目名:制作一个反应测试器
具体要求:随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间,这是心理学上的一个重要实验。
实现方式:通过软件产生随机数,程序启动以后在随机数控制的时间下点亮板上的LED,被测试者按下按键以后,处理器计算从点亮灯到接收到按键之间的时间差,并将时间差通过USB显示在PC上,也可以将OLED用起来 ,在OLED上显示时间信息。
2.软件介绍:
MicroPython:其是Python3编程语言的一个完整软件实现,用C语言编写,被优化于运行在微控制器之上。MicroPython是运行在微控制器硬件之上的完全的Python编译器和运行时系统。提供给用户一个交互式提示符来立即执行所支持的命令。除了包括选定的核心Python库,MicroPython还包括了给予编程者访问低层硬件的模块。
Thonny:作为官方推荐的开发软件,thonny页面简洁,基础功能齐全,简单易上手,非常适合初学者。同时,调试的时候显示变量的值。例如在循环运行的过程中,可以在代码中直接高亮显示当前变量的值,让学生更容易了解变量的变化和计算过程。更直观的让学生理解循环及变量。Thonny还拥有简单的UI模式。在设置中,可以用Simple UI模式,只剩下工具栏、代码编辑器和Shell窗口,简洁界面让学生无压力,更聚焦编程语言的学习。
3.硬件介绍:
使用平台:
*基于树莓派Pico(STEP Pico)的嵌入式系统学习板
产品包含:
*树莓派Pico扩展板x1
*硬禾版本树莓派Pico核心模块-STEP Pico x1
*Type-C数据线x1
用到的板卡硬件:
*2个按键输入
*4个单色LED
*12个WS2812B RGB三色灯
*1个128*64 OLED显示屏
核心芯片:
树莓派RP2040:双核Arm CortexMO+内核,可以运行到133MHZ,264KB内存,性能强大、高度灵活的可编程I0可用于高速数字接口-片内温度传感器、并支持外部4路模拟信号输入,内部ADC采样率高达500Ksps、12位精度,支持MicroPython、C、C+编程。
4.实现的功能流程
程序运行时,OLED屏幕显示“are u ready?”,提示反应测试即将开始。按下k2键,OLED屏幕显示“hold on”,提示反应开始,即将亮灯。数秒后板上随机亮起一个LED,同时OLED屏幕显示“now”,提示测试者立马按下k1键。测试者按下k1键后,OLED屏幕显示反应时间,同时thonny的shell窗口记录测试结果,此时实验完成一轮。如果测试者还想连续测试,可以按下k2键重新测试,并连续记录测试结果。
5.实现思路与具体代码说明 5.1思路流程图
5.2程序代码说明:
5.2.1导入需要使用的库函数。图中【oled】、【ws2812b】、【board】、【led】均为Gitee网站提供的开源库,【time】与【random】为python自带库。
5.2.2初始化定义后续使用变量名,显示提醒测试者测试初始化完成,可以开始测试反应时间
5.2.3外层循环,测试者按下k2键时,打印“hold on”提示测试者还未开始,随机息屏1-3秒后随机在1-12号led灯中选取一位点亮。点亮同时打印“now!”提醒测试者。其中两次获取随机数依靠random库的uniform函数。之后使用time库的ticks函数记录反应开始时间,精确到毫秒。
5.2.4内层循环,测试者按下k1按键后,立马记录结束时间,同时熄灭先前点亮的led灯,并跳出内层循环。此后,计算测试者反应时间,打印在OLED屏幕上,同时打印在shell窗口,记录下此次测试的反应时间。单轮测试完成后,由于仅仅跳出内层循环,当测试者再次按下k2键时,外层重新进入循环,保证能连续多次测试,记录连续的测试时间。
6.主要困难与未来建议:
本次项目选择的较为简单,基本是入门学习python编程语言的项目,但还是收获丰富。学习microPython,了解了嵌入式开发的基本流程和工作内容,学会了独立思考和论坛交流讨论并驾齐驱的重要性。由于自己是电子信息工程专业,大部分学习方向都是拿pycharm做偏向软件的项目,本次软硬件相结合的项目体验还是十分新奇的,当然自己未有过开发硬件相关的经验,面对硬件板所需的库有很多不了解的函数,在电子森林提供的资料连接和论坛查阅的贴子中还是逐渐理解并简单掌握了原理与逻辑,同时本次项目给我一个机会将大一大二学习过的数电课本知识与实际应用结合起来,帮助我对数字电路逻辑有了新的理解和认知。
总而言之,本次项目的学习过程十分有趣,从刚开始观看平台直播课程的一无所知;刚拿到板子时的不知所措;刚接触到新函数的不知所云,再到后面慢慢学会掌握,直到自己的代码能跑起来并完成任务要求,感触良多。在开发的过程中,学到的检索、读函数以及修改bug能力比起成果而言更为珍贵。未来建议电子森林项目能做更多的宣传推广,促进新时代青年开发激情。
源代码:
from button import k1,k2
from board import pin_cfg
from led import r,g,b,y
from oled import oled
import time
import ws2812b
import random
react_time=0
begin_time=0
end_time=0
ran_led=0
oled.text("are u ready?",12,20)
oled.show()
ws2812b.off_all()
while True:
if k2.value():
oled.fill(0)
oled.show()
ran_led=int(random.uniform(1,12))
oled.text("hold on",12,20)
oled.show()
time.sleep(random.uniform(1,3))
oled.fill(0)
oled.show()
oled.text("now!",12,20)
oled.show()
ws2812b.on(ran_led)
begin_time=time.ticks_ms()
while True:
if k1.value():
end_time=time.ticks_ms()
oled.fill(0)
oled.show()
ws2812b.off(ran_led)
break
react_time=end_time-begin_time
oled.text("reaction time",12,20)
oled.text('{:3.3f}s'.format(react_time/1000),12,40)
oled.show()
print('your reaction time is:'+str(react_time/1000)+'s')