项目介绍:
本期很高兴参加硬禾学堂举办的寒假一起练活动,这个寒假因硬禾学堂,使用STEP Pico开发板,通过直播,录播方式学习MicroPython的编程开发。
此次我们使用到的开发板是硬禾学堂自行设计的开发板-STEP Pico
STEP Pico的外设非常丰富
板卡硬件:
- 2个按键输入
- 4个单色LED
- 12个WS2812B RGB三色灯
- 1个姿态传感器
- 1个128*64 OLED显示屏
- 1个蜂鸣器
- 1个可调电位计(用于电压表)
- 1路音频信号输入(用于示波器)
- 8位R-2R电阻网络构成的DAC(用于DDS信号发生器)
本期任务要求:
项目1 - 制作一个反应测试器
具体要求:随机点亮板上的一个LED,按下板上的一个按键,在显示屏上显示出从灯亮到按键之间的时间,这是心理学上的一个重要实验
实现方式:通过软件产生随机数,程序启动以后在随机数控制的时间下点亮板上的LED,被测试者按下按键以后,处理器计算从点亮灯到接收到按键之间的时间差,并将时间差通过USB显示在PC上,也可以将OLED用起来,在OLED上显示时间信息。
设计思路:
此次我们通过题目分析,设计一个反应测试器。为了显示效果更加突出,本次采用板载的ws2812彩灯作为反应时间测试灯,左面的白色按键KEY1,作为用户的按键,按下去即可知道自己的反应时间,已ms为单位。
硬件分析:
WS2812需要独立的引脚,进行传输信号,因此在初始化之前,将使用的的引脚定义好。
OLED 屏幕用于显示反应时间。方便查看每一次的反应时间
KEY1作为用户按键,为了不会干扰主程序,按键的判断采用中断方法,当用户按键按下时。记录按键的时间,并且完成计算:初始时间-按下时间=反应时间
并且将反应时间显示在OLED屏幕上。
此次硬件框图如图所示:
硬件框图
软件流程如图所示:
软件流程图
首先在写程序之前,先把需要本次使用的外设库引入到我们的程序中:
其中包含了按键库,oled屏幕,ws2812库,还有一个用于随机的random函数。
from button import button
from board import pin_cfg
from oled import oled
from machine import Pin
import random
import time
import ws2812b
板载有12颗WS2812灯,为了显示随机性,我们将每次显示不同位置的灯光作为用户的参考,随机地址为1-12。并且加入了随机的时间,随机时间为1-3S,这个时间用于灯光的延长。达到了动态随机的效果。
ws2812b.on(int(random.uniform(1,12)),"#00FF00")#产生随机LED位置
time.sleep(int(random.uniform(1,3)))#产生随机时间
记录时间的标志位
timer_start = time.ticks_ms()#开始计时时间等于现在计时时间
采用中断方式来获取用户按下的时间,并且计算反应时间,并通过oled输出到屏幕上
按键中断函数
#K1中断函数
k1 = button(pin_cfg.k1,k1_callback,trigger=Pin.IRQ_FALLING)
计算反应时间
1、通过串口输出
2、通过oled屏幕显示
# 结束计时
# 反应时间=开始计时-按键按下
def k1_callback(pin):
global timer_start
timer_reaction = time.ticks_ms() - timer_start
timer_reaction = round((timer_reaction-3000)/1000,2)#取小数点后两位
print(timer_reaction)
oled.fill (0)
oled.text("Reaction Time:",5,25)
oled.text(str(timer_reaction) + 'S',45,35)
oled.show()
为了更好的游戏效果,我加入了重置游戏的界面,可以提醒即将开始下一轮的游戏倒计时
for i in range(3,0,-1):
oled.text("Reset game",25,25)
oled.text(str(i) + 'S',55,35)
oled.show()
time.sleep(1)#下一轮游戏时间
oled.fill(0)
oled.show()
硬件介绍
ws2812:WS2812是一款智能控制LED光源,其控制电路和RGB芯片集成在一个5050组件的封装中。内部包括智能数字端口数据锁存器和信号整形放大驱动电路。
0.96寸oled: 0.96’OLED(4Pin)模块采用SSD1306为主芯片,像素为128*64,通讯方式可选择SPI或IIC(地址默认0x78),引脚完全兼容IIC(即在设置为IIC模式时,可只接4根线),默认是4-Wire SPI通讯模式,自发光自由视角,功耗低。
STEP Pico:STEPPicO是一款低成本,高性能的微控制器开发板,具有灵活数字接口(完全兼容RaspberryPiPico)。硬件上,采用RaspberryPi官方自主研发的RP2040微控制器芯片,搭载了ARMCorteXM0+双核处理器,高达133MHz的运行频率,内置了264KBSRAM和2MB闪存,还板载有多达26个多功能的GPIO引脚软件上,可选择树莓派提供的C/C++SDK,或者使用MicroPython进行开发且配套有完善的开发资料教程,可方便快速入门开发并嵌入到产品中。
功能及展示
1.随机点亮12个LED灯,颜色为绿色。
2.用户按下,屏幕显示反应时间
3.游戏结束会有3S倒计时。倒计时结束后并重新开始游戏。
总结
非常感谢硬禾学堂主办方,通过此次的寒假一起练,学会了新的编程语言MicroPython,同时熟悉了PCIO的开发流程,通过此次训练,可以将学习到的MicroPython应用到更多的板卡,来实现更多丰富复杂的项目。未来计划将继续学习MicroPython编程,继续进步,更上一层楼。
另外在分享本期的其他题目作品的视频分享:
项目2 - 制作一个交通灯控制器
具体要求:仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先功能
实现方式:利用板上的3个不同颜色的LED模拟交通灯,程序会轮流切换三个灯的状态,并根据按键的输入(中断或查询机制)调整交通灯的切换
项目3 - 制作一个音乐播放器
具体要求:利用板上的蜂鸣器,播放一首音乐
实现方式:利用PWM生成不同频率,持续时间不同的音调,驱动蜂鸣器播放音乐,程序中制作一个标准的音符库,播放音乐的时候通过查找表的方式把该音符对应的频率的信号播放出来
项目4 - 制作一个电压表
具体要求:利用板上的电位计调节电压从0-3.3V之间变化,在OLED显示屏上显示电压值,可以以数字的方式,也可以以图形的方式来显示
实现方式:调节电位计产生0-3.3V之间变化的电压,树莓派Pico内部的ADC对该电压进行采集,得到0-4095之间的数值,经过计算以后对应到相应的电压值,再通过OLED显示屏显示出来