LED direccionables

Las tiras de LED han sido utilizadas comúnmente por los equipos durante varios años por una variedad de razones. Permitir a los equipos depurar la funcionalidad del robot de la audiencia, proporcionar un marcador visual para su robot, y simplemente puede agregar un poco de atractivo visual. WPILib tiene una API para controlar WS2812 LED con su pin de datos conectado a través de PWM.

Crear instancias del objeto LED direccionable

Primero crea un objeto AddressableLED que toma el puerto PWM como argumento. Deberá ser un encabezado PWM a la roboRIO. Luego configura el número de LED ubicados en su LED strip, con se puede hacer con la función setLength().

Importante

Es importante tener en cuenta que configurar la longitud del encabezado del LED es una tarea costosa y no se recomienda ejecutar esto periódicamente.

Después de que se haya establecido la longitud de la tira, tendrá que crear un objeto AddressableLEDBuffer que toma la cantidad de LED como entrada. Entonces llamarás a myAddressableLed.setData(myAddressableLEDBuffer) para establecer los datos de salida del led. Finalmente puedes llamar myAddressableLed.start() para escribir la salida continuamente. A continuación, se muestra un ejemplo completo del proceso de inicialización

Nota

C++ no tiene un AddressableLEDBuffer, y en su lugar usa una matriz.

17  @Override
18  public void robotInit() {
19    // PWM port 9
20    // Must be a PWM header, not MXP or DIO
21    m_led = new AddressableLED(9);
22
23    // Reuse buffer
24    // Default to a length of 60, start empty output
25    // Length is expensive to set, so only set it once, then just update data
26    m_ledBuffer = new AddressableLEDBuffer(60);
27    m_led.setLength(m_ledBuffer.getLength());
28
29    // Set the data
30    m_led.setData(m_ledBuffer);
31    m_led.start();
32  }

Configuración de toda la tira a un color

El color se puede ajustar a un led individual en la tira usando dos métodos. setRGB() el cual toma los valores RGB como entrada y setHSV() el cual toma los valores HSV como entrada.

Usando valores RGB

RGB significa rojo, verde y azul. Este es un modelo de color bastante común, ya que es bastante fácil comprender. Los LED se pueden configurar con el método setRGB que toma 4 argumentos: índice del LED, cantidad de rojo, cantidad de verde, cantidad de azul. La cantidad de rojo, verde y azul son valores enteros entre 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);

Usando valores HSV

HSV significa Hue, Saturación y Valor. El tono describe el color o tinte, siendo la saturación la cantidad de gris y el valor es el brillo. En WPILib, Hue es un número entero de 0 a 180. La saturación y el valor son enteros del 0 al 255. Si observa un selector de color como el de Google’s <https://www.google.com/search?q=color+picker>`_, el tono será 0 - 360 y la saturación y el valor son del 0% al 100%. Esta es la misma manera que OpenCV maneja los colores HSV. Asegúrese de que los valores de HSV ingresados ​​en WPILib sean correctos, o el color producido podría no ser el mismo que se esperaba.

HSV models picture

Los LED se pueden configurar con el método setHSV que toma 4 argumentos: índice del LED, tono, saturación y valor. A continuación, se muestra un ejemplo para configurar el color de una tira de LED en rojo (matiz de 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);

Crea un efecto arcoíris

El siguiente método hace un par de cosas importantes. Dentro del bucle for, distribuye equitativamente el tono en toda la longitud del hilo y almacena el tono LED individual en un variable llamada tonalidad. Luego, el bucle for establece el valor HSV de ese píxel especificado utilizando el tono valor.

Moviéndose fuera del bucle for, m_rainbowFirstPixelHue luego itera el píxel que contiene el tono «inicial» que crea el efecto arcoíris. m_rainbowFirstPixelHue luego verifica para asegurarse de que el tono está dentro de los límites de tono de 180. Esto se debe a que el tono HSV es un valor de 0-180.

Nota

Es una buena práctica de robots mantener el método robotPeriodic() lo más limpio posible, así que crearemos un método para manejar la configuración de nuestros datos LED. Llamaremos a este método rainbow() y llamarlo desde robotPeriodic().

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

Ahora que hemos creado nuestro método de arco iris, tenemos que llamar al método y establecer los datos del LED.

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