基于Step PICO 的节日彩灯项目介绍
1 项目介绍
我选择的这个项目是使用Step Pico 开发版和底板来完成的,主要完成了一个基于microPython程序的节日彩灯。视频中可以看到实际的彩灯+蜂鸣器的演示效果。这里放一副最终成品图片吧!
图1 项目演示图
2 项目实现的思路
之前我用过一些别的开发版,也用过microPython编过一些别的项目,觉得microPython对于我们年龄小一些的爱好者是比较容易上手的。那么首先说一下我的这个项目的思路吧:
2.1 我看到开发板上面有十二个WS2812彩灯, 这个彩灯我在之前的项目中用过的。它使用一根信号线就可以驱动。而且在microPython中可以很方便的使用neopixel库来操作。所以我先选定这个作为彩灯的显示。
2.2 题目要求使用蜂鸣器发出一定的音乐。这里我想到了使用PWM,产生不同频率的波形去驱动蜂鸣器。
2.3 接下来就是从网站上的图纸资料内,找到需要驱动的彩灯GPIO管脚,和蜂鸣器的GPIO管脚,找到对应关系。 以方便在程序内使用对应的驱动去操作他们
2.4 然后就是编制程序,完成彩灯的显示,和蜂鸣器的演奏。编制程序的时候,我使用了模块的思路,先逐步验证每个模块的单独的功能。再将他们合并为一个整合的程序。
3,硬件平台介绍
有了上面的思路,我们首先介绍下本次使用到的硬件吧!
核心板部分,是Step Pico 核心板,他使用了 RP2040芯片,具备133Mhz的运算速度,26个GPIO。也支持使用microPython 进行编程。功能很多,性能很强!
扩展板部分,硬禾团队也设计了很强大的外设
按键、单色LED、12个WS2812彩灯、蜂鸣器、姿态传感器,OLED等等很多可以方便使用的外设。
3.1 项目中用到的GPIO
这里我着重介绍一下我本次用到的 彩灯和蜂鸣器对应的GPIO
图2,使用到的GPIO
这里我们可以看到WS2812彩灯使用的GPIO 18,蜂鸣器使用的GPIO 19,按键使用GPIO12。这里我们记录下来这几个GPIO编号,以方便后面使用。
4,软件程序设计
程序方面,我先编制了WS2812和蜂鸣器单独的测试程序,验证了两个外设是否可以正常工作。
4.1 程序模块-彩色LED测试
首先介绍下WS2812 彩色LED的测试程序吧。
import neopixel
import time
from machine import Pin
P18 = Pin(18, Pin.OUT)
rgbled = neopixel.NeoPixel(P18, 12)
def LED(num,color):
rgbled[num] = color
rgbled.write()
time.sleep_ms(100)
rgbled[num] = (0, 0, 0)
return
while 1:
LED(0,(5,0,0))
LED(1,(5,3,0))
LED(2,(5,2,0))
LED(3,(0,5,0))
LED(4,(0,0,5))
LED(5,(5,0,5))
LED(6,(5,0,0))
LED(7,(5,3,0))
LED(8,(5,2,0))
LED(9,(0,5,0))
LED(10,(0,0,5))
LED(11,(5,0,5))
首先导入了neopixel库,使用它可以很方便的去操作WS2812彩色LED.
然后导入time库,他可以完成延时等基本的动作。
然后导入PIN功能,这样就可以操作外设了。
下面几句是将GPIO 18声明为neopixel的功能管脚,并且声明12个彩灯。
下面是定义了一个函数 LED, 它包含两个参数 num,color. num用来指示需要显示的彩灯的位置。color用来指示彩灯的颜色。函数体包含点亮彩灯,延时100毫秒,在熄灭,这一系列的操作。使用函数的优点是可以简化调用的操作。
最下面是一个while循环,在循环体内简单的调用了12次,分别点亮12个彩灯。
运行此程序后,就可以测试ws2812 彩灯了。
4.2 程序模块-花样的彩灯
第二个测试程序是为了生成一个样式比较花哨的彩灯。但是长度比第一个简洁。
import neopixel
import time
from machine import Pin
import random
P18 = Pin(18, Pin.OUT)
rgbled = neopixel.NeoPixel(P18, 12)
def LED(num,color):
rgbled[num] = color
rgbled.write()
time.sleep_ms(100)
#rgbled[num] = (0, 0, 0)
return
while 1:
for i in range(12):
LED(i,(random.randint(0,10),random.randint(0,10),random.randint(0,10)))
这个测试程序,在第一个程序基础上增加了引入了随机数random, 并且进行了精简,修改了彩灯测试那部分的代码,使用一个循环12次的循环,每次把彩灯更新为一个随机的颜色,这样看起来更像随机性的节日彩灯。
4.3 程序模块-彩灯结合蜂鸣器
这里结合最终程序,绘制了一份程序流程图,在流程图内可以详细看到程序程序设计的整个思路和执行情况。
图3,程序流程图
根据流程图,编制出来了第三个程序,也是本项目的最终的程序了。本程序中引入了蜂鸣器,最终实现了一个具有声光特效的节日彩灯。
import neopixel
import time
from machine import Pin,PWM
import random
P18 = Pin(18, Pin.OUT)
rgbled = neopixel.NeoPixel(P18, 12)
P19 = Pin(19, Pin.OUT)
buzzer = PWM(P19)
buzzer.duty_u16(100)
def LED(num,color):
rgbled[num] = color
rgbled.write()
time.sleep_ms(100)
#rgbled[num] = (0, 0, 0)
return
def BUZZ(freq):
buzzer.freq(freq)
while 1:
for i in range(12):
LED(i,(random.randint(0,8),random.randint(0,8),random.randint(0,8)))
BUZZ(random.randint(300,1500))
程序各部分是这样的
首先引入各个需要的库,其中增加引入了PWM库,用来驱动蜂鸣器。将其设定到GPIO19上面之后,需要设定PWM波形的占空比为100。需要注意的是,此处数值写100并不是占空比是100%。 这里的取值范围应该是0-1023. 设置100能获得比较合适的音量。
19行增加了一个BUZZ函数用来更新PWM蜂鸣器的频率。
并且在主循环内,更新LED显示颜色后,对PWM频率进行更新,因为每次更新颜色和频率都是用随机数,所以得到的显示效果是很具有科技感的!详细可以从视频内看到。
那么以上就是我使用Step Pico开发板来完成的节日彩灯项目啦!
5,项目问题与总结
因为我学习MicroPython只有半年多的时间,很多函数的使用,还有各个模块的使用还不是很熟悉。程序写的也比较简略,没有那么高的深度。可能和很多高级的项目没办法比较。但是我觉得,兴趣就是最好的老师,在以后的道路上我会继续学习嵌入式,学习更多的知识。以后会做更多的好玩的项目!也希望下次还可以继续参与暑假一起练项目!