基于step-pico制作一个反应测试器
本项目基于树莓派PICO开发板实现一个反应测试器,完成LED显示,按键响应以及随机数的应用等多个内容,实现了在oled屏显示反应时间的功能,完成了题目中的全部要求。
标签
嵌入式系统
树莓派PICO
2023寒假在家练
反应测试
努力努力再努力
更新2023-03-29
北京理工大学
389
  • 项目介绍

    制作一个反应测试器,随机点亮板子上的一个led,按下板子上的一个按键,在显示屏上显示出从灯亮到按键之间的时间,该时间即为反应时间。

  • 设计思路

    利用ws2812b.py完成led灯的状态控制。

    利用库函数random来实现随机时间的产生,使用time.tick_ms()函数完成时间差的计算,灯亮时开始计时为time_start,按下开关k1减去初始时间即为反应时间。

    利用button.py、board.py实现对k1按键的状态检测。

    利用oled.py实现对oled屏幕的显示功能。
  • 流程图Fp8psVKiYBCMB9uxUjntSgx3jecv
  • 简单的硬件介绍

    本项目所使用的硬件资源为基于STEP PICO的嵌入式系统学习平台,核心板芯片为双核ARM Cortex M0+内核,频率为133MHZ,内存264kb。扩展板包含两个按键输入,4个单色LED以及12个ws2812b三色灯,姿态传感器,128*64OLED显示屏,蜂鸣器、可调电位计、1路音频信号输入以及8位R-2R电阻网络所构成的DAC。

    下图为step pico的引脚图。

    FleQp5jLQPWLLbQv_ijlH7Sxsseo
  • 实现的功能本项目实现了LED灯的显示,按键响应以及随机数的应用等多个内容,同时实现了在oled屏显示反应时间的功能。
  • 图片展示

FijzypCTaI5myKHO-RnhDqQJJAakFh6AO0PJxcjlAyfoIco6RedauEirFoAc_08T4CRSOSn17-0rbfXFGtYJ

         我的反应时间再0.2-0.3s之间,有待提升。

  • 环境配置:

    跟随老师的直播教程安装了thonny这一开发软件,操作简单,适合初学者快速上手,不必再环境学习上花费过多时间。

    对于树莓派pico这一嵌入式系统的开发,也可以使用C语言/C++进行编写,使用micropython的优势在于简单易于理解,而使用C语言/C++完成树莓派的编程则效率更高,C/C++的编程可以再VScode上通过安装扩展包的方式来完成。

  • 主要代码片段及说明:

    由于本项目较为简单,主函数的基本思路在上述已介绍过,这里主要讲一下关于random函数以及time.tick_ms()的相关用法。

    random函数

    random.random(): 返回随机生成的一个浮点数,范围在[0,1)之间

    random.uniform(a, b): 返回随机生成的一个浮点数,范围在[a, b)之间

    random.randint(a,b):生成指[a,b]内的整数

    random.randrange([start],stop[,step]):用于从指定范围内按指定基数递增的集合中获取一个随机数。

    random.choice():从指定的序列中获取一个随机元素

    random.shuffle(x[,random]):用于将一个列表中的元素打乱,随机排序

    总之,random的函数用法很多,需要哪个用哪个就ok

    time.tick_ms()

    返回不断递增的毫秒计数器,在某些值后会重新计数。

    其他类似ticks_ms()的函数: time.ticks_us():返回微秒。 time.ticks_cpu():相比前面的函数具有更高精度(返回CPU时钟)。

    关于time的函数有很多,此处不再列举,有需要可以到官网了解。

    #reaction_game.py
    
    from oled import oled
    import ws2812b
    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,32,0)
        oled.show()
    
    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)
    
    while True:
        oled.fill(0)
        oled.show()
        ws2812b.off_all()
        time.sleep(random.uniform(3,5))
        ws2812b.on(random.randint(1,13),"871F78")#紫色灯好看捏
        timer_start = time.ticks_ms()
        time.sleep(5)
    

    另外,在主函数中调用了许多已经编写好的文件,如board.py、button.py、oled.py、ssd1306.py等,均可以从gitee中直接获取,这也彰显了一个合格的电子人要学会利用各种平台资料来帮助自己高效完成代码的编写工作。

  • 补充说明

    关于python及micropython的区别与联系:

    MicroPython 是Python3编程语言的一个完整软件实现,用C语言编写,被优化于运行在微控制器之上。MicroPython是运行在微控制器硬件之上的完全的Python编译器和运行时系统。提供给用户一个交互式提示符(REPL)来立即执行所支持的命令。除了包括选定的核心Python库,MicroPython还包括了给予编程者访问低层硬件的模块。

    微控制器通常以C编程,可以直接访问和控制寄存器来使用外围设备,为目标微控制器进行交叉编译和构建固件代码,并使用合适的编程器进行烧录,而MicroPython集成了所有这些步骤。借助MicroPython,用户完全可以通过Python脚本语言实现硬件底层的访问和控制,比如说控制LED灯泡、LCD显示器、读取电压、控制电机、访问SD卡等。

    与桌面版本的Python不同,MicroPython是微控制器的精简版本,因此它并非支持所有Python的库和功能。

  •  总结与未来的计划算是第一次真正接触嵌入式系统,使用这个真的很适合初学者进行入门,感谢老师细致的视频课程讲解,不仅让我学会了很多新知识,同时一步一步实操演练也锻炼了我的程序编写思维。未来将使用这块板子进行更多的功能实现,使用C语言对该块板子进行编程,了解并学习更多关于嵌入式系统的相关内容。感谢硬禾提供了这次寒假练的机会,以后也将持续关注并向周围同学进行宣传推广。
附件下载
项目一完整代码.zip
团队介绍
个人项目
团队成员
努力努力再努力
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号