可寻址 LED

出于多种原因,LED 灯带在近几年来被各个队伍广泛使用。LED 灯带可以让队伍能够通过观察 LED 灯调试机器人的各项功能,为他们的机器人提供一个视觉标记,并且可增添一些视觉上的吸引力。 WPILib 有一个用于控制 WS2812 LED 的 API ,其数据线通过 PWM 连接。

实例化 AddressableLED 对象

首先,创建一个 AddressableLED 对象,并将 PWM 端口作为构造函数的参数。这个端口必须是 roboRIO 上的 PWM 接口。然后,可以通过该 setLength() 功能设置 LED 灯带上的 LED 数量。

重要

要注意,设置 LED 的接头长度是一项耗时耗计算量的任务,不建议其在循环中运行。

设置灯带的长度后,您必须创建一个 “AddressableLEDBuffer” 对象,该对象将 LED 的数量作为输入。然后,您可以调用 “myAddressableLed.setData(myAddressableLEDBuffer)” 以设置 LED 的输出数据。最后,您可以调用 “myAddressableLed.start()” 以连续输入输出。以下是初始化过程的完整示例。

注解

C++ 没有 AddressableLEDBuffer 类,而是使用 Array 。

21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
  public void robotInit() {
    // PWM port 9
    // Must be a PWM header, not MXP or DIO
    m_led = new AddressableLED(9);

    // Reuse buffer
    // Default to a length of 60, start empty output
    // Length is expensive to set, so only set it once, then just update data
    m_ledBuffer = new AddressableLEDBuffer(60);
    m_led.setLength(m_ledBuffer.getLength());

    // Set the data
    m_led.setData(m_ledBuffer);
    m_led.start();
  }

将整个灯带设置成单色

可以使用两种方法将颜色设置为条带上的单个 LED :setRGB(),即接受 RGB 值作为输入;setHSV(),接受 HSV 值作为输入。

使用 RGB 值

RGB 指红、绿、蓝。这是一个相当常见的色彩模型,因为它很容易理解。可以使用带有4个参数的 setRGB 方法设置 LED :LED 的索引,红色量,绿色量,蓝色量。红色,绿色和蓝色的量是一个介于 0-255 之间的整数值。

for (var i = 0; i < m_ledBuffer.getLength(); i++) {
   // Sets the specified LED to the RGB values for red
   m_ledBuffer.setRGB(i, 255, 0, 0);
}

m_led.setData(m_ledBuffer);

使用 HSV 值

HSV 中的 H 代表色相,S 代表饱和度,V 代表亮度值。色相描述颜色或色调,饱和度表示灰度,亮度值表示亮度。在 WPILib 中,色相是0到180之间的整数。饱和度和值是0到255之间的整数。如果您使用像 Google’s 的颜色选择器,色相将是0到360,饱和度和值是0%至100%。这与 OpenCV 处理 HSV 颜色的方式相同。确保输入到 WPILib 的 HSV 值正确,否则产生的颜色可能与预期的颜色不同。

HSV models picture

可以使用带有4个参数的方法 setHSV 设置LED:LED的索引,色相,饱和度和亮度值。下面展示了将LED灯条的颜色设置为红色 (色相为0) 的示例。

for (var i = 0; i < m_ledBuffer.getLength(); i++) {
   // Sets the specified LED to the HSV values for red
   m_ledBuffer.setHSV(i, 0, 100, 100);
}

m_led.setData(m_ledBuffer);

创建彩虹效果

下面的方法可以做到一些重要的功能。在 for 循环内部,它将色相均匀地分布在整个灯带的长度上,并将各个 LED 色相存储到名为的变量 hue 中。然后 for 循环使用该 hue 值设置该指定像素的 HSV 值。

循环之外,m_rainbowFirstPixelHue 迭代包含 “初始” 色调的像素,从而创建彩虹效果。然后 m_rainbowFirstPixelHue 检查色相是否位于0-180范围内。这是因为HSV色相的值介于0至180之间。

注解

最好让机器人的 robotPeriodic() 方法尽可能简洁,因此,我们将创建了一种可以设定 LED 参数的方法。此方法名为 rainbow() ,需要从 robotPeriodic() 中调用它。

45
46
47
48
49
50
51
52
53
54
55
56
57
58
  private void rainbow() {
    // For every pixel
    for (var i = 0; i < m_ledBuffer.getLength(); i++) {
      // Calculate the hue - hue is easier for rainbows because the color
      // shape is a circle so only one value needs to precess
      final var hue = (m_rainbowFirstPixelHue + (i * 180 / m_ledBuffer.getLength())) % 180;
      // Set the value
      m_ledBuffer.setHSV(i, hue, 255, 128);
    }
    // Increase by to make the rainbow "move"
    m_rainbowFirstPixelHue += 3;
    // Check bounds
    m_rainbowFirstPixelHue %= 180;
  }

现在我们已经创建了我们的 rainbow() 方法,我们需要真正调用此方法并为 LED 设定参数。

37
38
39
40
41
42
43
  @Override
  public void robotPeriodic() {
    // Fill the buffer with a rainbow
    rainbow();
    // Set the LEDs
    m_led.setData(m_ledBuffer);
  }