通过Python库控制雷蛇的灯光效果 pychroma库最简单教程

可能熟悉我的朋友都知道,我最近正在使用的是这一台雷蛇灵刃15标准版的笔记本。众所周知,雷蛇一向有一个特色就是他的RGB玩得非常的炫酷,但是我收里面的这一台雷蛇灵刃却并没有其品牌这么花里胡哨的灯光和一些灯光的特效,在雷蛇控制中心的灯光控制里面,只能调整他一片色的灯光,而不像其他的产品那样,有着五颜六色的流光溢彩的效果。

其实在购买后一段时间里面我就注意到了这个问题,起初并不是很注意,因为购买的是标准版,并不是旗舰产品,在这些地方阉割是很正常的嘛。

在笔记本购买了半年左右,我重新打开雷蛇控制中心,看到里面有一个可以随着灯光控制RGB的软件,它实际上是一个内置在雷蛇控制中心里面的外挂程序,只需要进去选择它,调整一些参数,我的键盘竟然就变成了由很多灯光组成的灯光效果了,并且可以观察发现,有四个灯光的分区(直接控制USB硬件可以达到16个分区),前面说到,这个是一个外挂程序,支持外挂程序肯定可以自己来变成玩。在GitHub找到了关于使用雷蛇的外接控制程序的python程序,就是这样

GitHub地址:GitHub - morswin22/pychroma: Python library for accessing the Razer Chroma SDK

使用这个Python程序还是比较简单,但是这个库需要依靠雷蛇的控制中心才可以调整灯光,所以在使用它的时候,雷蛇控制中心就必须要打开才可以。

使用

pip install chroma

就可以安装这个库了

安装完成过后可以在基础的Python环境里面看看是否安装成功

对于直接运行这个脚本,我们可以运行在GitHub上面的demo程序来控制我们的雷蛇设备的灯光。基础的程序如下:

from pychroma import Sketch
class MySketch(Sketch):
    def setup(self):
        pass  # This will run once as first
    def update(self):
        pass  # This will run every frame before render
    def render(self):
        pass  # This will run every frame after update

我们可以结合库的帮助文档和阅读源代码,来实现我们需要实现的功能。

你可能注意到了,在雷云里面的互联里面,一个应用会有一个应用的说明,通常是点击此应用,在右边会出现例如创建者、说明、更多信息网址等信息,我们在使我们的Python脚本链接到雷云的时候就首先要配置这个信息,在pychroma库里面,给我们提供了一个方法

我们可以自行编辑Json文档,然后导入到python程序里面。

在库的example中,有一个默认的config.json文件,我们可以直接修改这个Json文件:

文件如下:

{
  "chroma": {
    "developerName": "yourname",
    "developerContact": "youremail@gmail.com",
    "category": "application",
    "supportedDevices": ["keyboard", "mouse", "mousepad", "keypad", "headset", "chromalink"],
    "description": "pychroma example animations",
    "title": "pychroma examples"
  },
  "devices": {
    "keyboard": "Your keyboard",
    "mouse": "Your mouse"
  }
}

我们可以修改里面的字符串来达到修改文件的目的。

我们把自己自定义的Json文件的文件名改为config.json,其实,在以上的那个基础的程序里面,是没有导入Json文件到python脚本里面的,这里我们就要加入几段代码:

with Controller('user.json') as controller:
    controller.run_sketch(MySketch)

这几段代码就是导入Json库并且运行chroma程序。

当然我们还需要修改整个代码最前面的内容,也就是导入库的代码:

from pychroma import Controller, Sketch

添加一个导入pychroma库里面的Controller组件。

此时的完整代码如下:

from pychroma import Controller, Sketch
class MySketch(Sketch):
    def setup(self):
        pass
    def update(self):
        pass
    def render(self):
        pass
with Controller('user.json') as controller:
    controller.run_sketch(MySketch)

这里我们就完成了导入Json文件和运行Json文件的配置的步骤

大概意思就是,通过以上的代码,我们让Python程序完成了和雷云程序中互联互联功能的沟通,让雷云互联知道了我们的Python代码的存在,以方便我们接下来程序的执行。接下来就是修改三个状态的代码了。

这里创建的类是继承的pychroma的Sketch类,这里的Setup(*)意思就是执行chroma程序的初始化,在这里我们可以设置初始值:

比如说设置代码的刷新率:

def setup(self):
    self.frame_rate = 24

这里我设置的刷新率的值为24,就是每秒刷新24次,刷新率过高可以会影响性能;设置为1就是每秒刷新一次;设置为1/30就是30秒刷新一次。

如果你想创建一个动画,就可以设置24、30、60这样的刷新率,如果你想让键盘、鼠标、的灯光显示温度反馈颜色或者是不经常变化的动画效果,就可以设置1、1/2、1/30这样的刷新率。

这里还需要在setup(*)里面添加一段代码:

self.chromalink.color_mode('hsv')

这一段代码的意思使我们的chromalink设备工作在HSV的颜色模式下,这里也可以使用RGB的工作模式,取决于之后你的程序代码。

我们也可也把chromalink换成其他的,比如说keyboard或者mouse。这里我用chromalink,好处就是这样的话几乎所有的设备都可以亮,方便进行调试。

因为是HSV模式,所以我们只需要改变其中的H。也就是色调(Hue)就可以改变颜色了,关于HSV等色彩方式的讲解我在上篇文章有讲到

用树莓派Pico点亮电脑的神光同步风扇 5vRGB ARGB风扇单片机点亮 - Covert知识分享 (worldcovert.com)

这里就不再过多叙述,但是这里面的色调的角度范围是0-360,不同于上一篇文章是使用的16bit的方式表示。因为是要一直变化,所以就默认一个Hue值:

self.hue = 0

有了初始值,我们就要使我们的hue这个值一直变化,就要在update(*)这个方法里面添加

self.hue += 5

其实就是

def update(self):
    self.hue += 5

这个update就是一次刷新前要进行的操作,这里+5的意思就是使我们的hue角度增加5度因为角度是可以随意的叠加的,都是只要那360那一部分,相当于就是如果输入360度就是0度,480度就是120度。

有了初始化和每次要做的事情,肯定还要执行亮灯的操作,这个操作就是render(*)这个方法里面。

我这里的代码如下:

def render(self):
    Variation = 36
    for i in range(4):
        self.chromalink.set_array(i+1, (self.hue - Variation * i, 100, 100))

其实的Variation的意思就是每一层灯光的变化值,因为有了变化值才可以做出流光溢彩的效果。

self.chromalink.set_array()方法就是设置每一个区域也就是array的灯光,需要输入进两个数值,一个是区域编号,这里编号只有1-4,所以就循环4次。

为了使颜色有一种从左到右的效果,self.hue - Variation * i这里就用每次for循环期间里面就减去多一倍变化值来达到从左向右的效果。

如果要实现从右到左的效果,就可以使用self.hue + Variation * i

至此,整段代码已经完成,直接运行即可,键盘就会出现和笔记本默认颜色不一样的流光溢彩的效果了。

完整代码如下:

from pychroma import Controller, Sketch
class MySketch(Sketch):
    def setup(self):
        self.frame_rate = 24
        self.chromalink.color_mode('hsv')
        self.hue = 0
    def update(self):
        self.hue += 5
    def render(self):
        Variation = 36
        for i in range(4):
            self.chromalink.set_array(i+1, (self.hue - Variation * i, 100, 100))
with Controller('user.json') as controller:
    controller.run_sketch(MySketch)

因为代码依然有一点点不标准,如果你的代码在hue和Variation这里报错,那么就可以在类最开头添加:

def __init__(self):
    super().__init__()
    self.hue = None
    self.Variation = None

这个类的初始化值方法来规范代码。