今天要用树莓派的Pico开发板来点亮我们电脑里面装机用到的这个5vRGB的风扇。这个风扇呢是酷冷至尊的MF120L,支持5V的神光同步的风扇,接口是这样的5v三针的样子,这个单独的这个孔是接地,这两个分别是数据和5v。
因为大部分的5v神光同步的风扇里面灯珠,都是使用的ws2812b的IC的灯珠,这个也不例外,我们可以直接套用使用点亮ws2812b灯珠的程序来让我们的风扇的灯珠点亮。风扇一共是八个灯珠,只要编写和好程序,就可以自定义的想让它怎么亮都可以。
树莓派这边呢。树莓派pico,这是一款2021年初发布的一款微处理器开发板,使用RP2040的芯片,40nm制程工艺。功能强劲,功耗较低。开发板非常小巧,和这边的这个12寸的风扇相比,风扇就感觉是感觉庞然大物。
我这里使用MicroPython作为开发的编程语言,如果这个开发板是新的话,就需要通过刷入固件来支持。刷入固件也很简单,按住开发板上面的BOOTSET按钮,然后插入连接电脑的数据线,然后在电脑这边就会出现一个虚拟的盘,最方便的方法是点进去,进入到树莓派官网,找到这里的Microcontrollers,点击这里的MicroPython,进入这个页面后然后往下滑,有一个Download UF2的链接,在这里就可以下载最新版本的MicroPython的固件,然后把下载好的文件通过拖拽的方式直接移动到虚拟的盘里面去,就可以实现刷入固件了。
RPI PI PICO MicroPython: Raspberry Pi Documentation - MicroPython
可以在这个页面的底部下载对应的文件。
刷写好了固件过后,就需要一个IDE来编辑程序,我这里使用的是Thonny(sangni)来编写MicroPython的程序,IDE我已经下载好了,本期视频的所有的资料下载地址我会放在我的博客里面。
在完成安装过后,把风扇的5v供电接到40号引脚也就是VBUS上,接地的也接在脚位38号,数据接口呢我就接到脚位一号,也就是GP0号位置上。
进入到Thonny里面,把neopixels的程序复制过来,neopixels也是一个实现灯光控制的库,但是这个开发板的micropython里面不带有这个功能,也就使用不到,就用这种方法。
Neopixel的github地址在这里:
GitHub Neo-Pixel: pi_pico_neopixel/neopixel.py at main · blaz-r/pi_pico_neopixel · GitHub
然后点击保存,文件名命名为neopixel.py,完成后再新建一个文件来写程序就可以呢。
但是在代码开始前首先需要得导入这个neopixel
使用
<code>import neopixel</code>
然后创建一个pixels
<code>pixels = neopixel.Neopixel(8, 0, 0) </code>
这里的8代表的是有8个灯,第一个0一般就填0,这个是rp2的东西,可以不用理会,第三个是对应的引脚的位置。
这里的pixels相当于是一个已经被赋予了魔法的东西,只要在他身上改变一下就可以。
比如说在他身上来个set_pixel()的方法:
于都源代码可以知道:
<code>set_pixel(self, pixel_num, rgb_w)</code>
只要给他对应的灯的序号和色彩的配置就可以了
给一个灯点亮
pixels.set_pixel(0, (10, 0, 0))
这里意思就是在1号位置上显示一个(10,0,0)的RGB颜色
现实中灯的序号是从1开始的,但是这里需要从0开始,所以通常减去一个1就可以了。
但是实际上你使用了set_pixel()
这个方法过后只是告诉了开发板你只是想让他这样显示,但是你并没有告诉他马上显示。
所以这里可以使用show()
的方法呈现在灯上面,这样就可以点亮单个灯了,
全部点亮的话可以使用fill()
的方法,在fill(color
)里面传递颜色的参数就行了。
代码example如下:
pixels.fill((20, 5, 0))
记下来就是要让所有的东西
HSV可是一个很好的东西,这个东西方便了我们去选择颜色,相较于RGB这种便于电脑来读取的色彩标签来说,HSV可以很方便的帮助我们人类去识别颜色。其中的
其中的H就是色相,可以用度数来表示,0到360度都有不同的颜色,其实原理其实非常简单,就是把所有的颜色通过算法放在一条轴上,如下图所示,简单来说,H中的代表的Hue就是对应的颜色,下面这一张图可以很清晰的看出颜色的变化
其实就是通过三种颜色互相插值实现的。
搞清楚了H也就是Hue色相过后,后面两个S和V也很好理解,
S指的是饱和度,V是明亮度,怎么去理解呢?
S这个数值越高的时候,颜色越趋于完整,也就是没有多余的白色掺杂在里面。
V就可以理解为明亮程度,就像手机的亮度一样,为0的时候是一片黑色,为最高的时候就完全不显黑色,但是有一点要注意:它和光强度之间并没有直接的联系。他也有最终的决定权,如果V的值为0,不管其他的数值是多少,它始终显示黑色。
如果从数学上去理解的话:可以把它当作一个倒着的圆锥,
假如说,固定一个Hue色相不变,单独取一块以V和S的坐标轴参考的话,就是一个三角形,三角形的原点0,0就是黑色,左上角那个直角就是255,0。意思就是V是最大值,S是最小值的时候,也就是纯白色。
最右上角那个角是255,255也就是正常的,不加白色也不加黑色的显示原本的色相的颜色。
也就是说,S的变化还是会受到V的影响,假如说,V为0,不管S和H是多少,都是黑色。
至于是如何转换的,其实我也没搞懂,套公式就行了。
代码(摘录来源: pi_pico_neopixel/neopixel.py at main · blaz-r/pi_pico_neopixel · GitHub)
这里的代码把0到360度变成了0到65536,相当于是被放大了的。返回的结果是RGB的结果。
def colorHSV(self, hue, sat, val):
if hue >= 65536:
hue %= 65536
hue = (hue * 1530 + 32768) // 65536
if hue < 510:
b = 0
if hue < 255:
r = 255
g = hue
else:
r = 510 - hue
g = 255
elif hue < 1020:
r = 0
if hue < 765:
g = 255
b = hue - 510
else:
g = 1020 - hue
b = 255
elif hue < 1530:
g = 0
if hue < 1275:
r = hue - 1020
b = 255
else:
r = 255
b = 1530 - hue
else:
r = 255
g = 0
b = 0
v1 = 1 + val
s1 = 1 + sat
s2 = 255 - sat
r = ((((r * s1) >> 8) + s2) * v1) >> 8
g = ((((g * s1) >> 8) + s2) * v1) >> 8
b = ((((b * s1) >> 8) + s2) * v1) >> 8
return r, g, b
转换实现色彩循环的变色
import neopixel
import time
hue = 4096*8
while(True):
pixels.fill(pixels.colorHSV(hue, 255, 256))
pixels.show()
hue += 200
time.sleep(0.001)
实现彩虹
import neopixel
import time
hue = 4096*8
while(True):
for i in range(8):
pixels.set_pixel(i, pixels.colorHSV(hue+i*256*16, 255, 256))
pixels.show()
hue += 200
time.sleep(0.001)
代码的质量可能不是特别的好,也欢迎大家的指正,如果大家还有什么需要补充或者是问题的,也可以在对应视频的评论区里面告诉我.
下载地址:
Thonny :Thonny, Python IDE for beginners
RPI PI PICO MicroPython: Raspberry Pi Documentation - MicroPython
GitHub Neo-Pixel: pi_pico_neopixel/neopixel.py at main · blaz-r/pi_pico_neopixel · GitHub