用树莓派Pico点亮电脑的神光同步风扇 5vRGB ARGB风扇单片机点亮

今天要用树莓派的Pico开发板来点亮我们电脑里面装机用到的这个5vRGB的风扇。这个风扇呢是酷冷至尊的MF120L,支持5V的神光同步的风扇,接口是这样的5v三针的样子,这个单独的这个孔是接地,这两个分别是数据和5v。

5vRGB的定义图

因为大部分的5v神光同步的风扇里面灯珠,都是使用的ws2812b的IC的灯珠,这个也不例外,我们可以直接套用使用点亮ws2812b灯珠的程序来让我们的风扇的灯珠点亮。风扇一共是八个灯珠,只要编写和好程序,就可以自定义的想让它怎么亮都可以。

插入视频截图:灯珠的特写

树莓派这边呢。树莓派pico,这是一款2021年初发布的一款微处理器开发板,使用RP2040的芯片,40nm制程工艺。功能强劲,功耗较低。开发板非常小巧,和这边的这个12寸的风扇相比,风扇就感觉是感觉庞然大物。

树莓派pico和酷冷至尊风扇的对比

我这里使用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是多少,都是黑色。

至于是如何转换的,其实我也没搞懂,套公式就行了。

HSV 转 RGB公式
HSV 转 RGB公式

代码(摘录来源: 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