DELs adressables

Les bandes LED sont couramment utilisées par les équipes depuis plusieurs années pour diverses raisons. Ils permettent aux équipes de déboguer la fonctionnalité du robot, de fournir un marqueur visuel pour un mécanisme ou tout simplement ajouter un attrait visuel pour les spectateurs. WPILib dispose d’une API pour contrôler les LED WS2812 avec leur broche de données connectée via PWM.

Instanciation de l’objet adressableLED

Vous créez d’abord un objet AddressableLED qui prend le port PWM comme argument. Ça doit être obligatoirement une sortie PWM sur le roboRIO. Ensuite, vous définissez le nombre de LED situées sur votre bande de LED, par l’entremise de la fonction setLength().

Important

Il est important de noter que le réglage de la longueur décrit ci-haut est une tâche relativement longue à exécuter pour le roboRIO, et il n’est pas recommandé de l’exécuter périodiquement.

Une fois la longueur de la bande définie, vous devrez créer un objet AddressableLEDBuffer qui prendra le nombre de LED comme entrée. Vous appellerez ensuite myAddressableLed.setData(myAddressableLEDBuffer) pour définir les données correspondant à chaque LED. Enfin, vous pouvez appeler myAddressableLed.start() pour écrire la sortie en continu. Voici un exemple complet du processus d’initialisation.

Note

C++ ne supporte pas un AddressableLEDBuffer et utilise à la place un tableau.

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();
  }

Définition de la bande entière sur une seule couleur

La couleur peut être définie sur chaque DEL spécifique sur la bande en utilisant deux méthodes. setRGB() qui prend les valeurs RGB comme entrée et setHSV() qui prend les valeurs HSV comme entrée.

Utilisation des valeurs RGB

RGB signifie rouge, vert et bleu. Il s’agit d’un modèle de couleur assez courant car il est assez facile à comprendre. Les LED peuvent être réglées avec la méthode setRGB qui prend 4 arguments: index (ou position de la LED sur la bande), valeur pour le rouge, valeur pour le vert, valeur pour le bleu. Les valeurs de rouge, vert et bleu sont des entiers compris entre 0 et 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);

Utilisation des valeurs HSV

HSV signifie Hue, Saturation et Value, ou Teinte, Saturation et Valeur. La teinte correspond à la couleur, la saturation étant la quantité de gris et la valeur étant la luminosité. Dans WPILib, Hue est un entier compris entre 0 et 180. Saturation et Value sont des nombres entiers compris entre 0 et 255. Si vous regardez un sélecteur de couleurs comme celui de Google, La teinte sera de 0 à 360 et la saturation et la valeur de 0% à 100%. C’est de la même façon qu’OpenCV gère les couleurs HSV. Assurez-vous que les valeurs HSV saisies dans WPILib sont correctes, sinon la couleur pourrait différer de celle attendue.

HSV models picture

Les LED peuvent être réglées avec la méthode setHSV qui prend 4 arguments: index de la LED, Hue, Saturation et Value. Un exemple est illustré ci-dessous pour définir la couleur d’une bande LED sur rouge (teinte 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);

Création d’un effet arc-en-ciel

La méthode ci-dessous fait plusieurs opérations. À l’intérieur de la boucle for, la teinte (ou Hue) est distribuée de façon uniforme sur la bande de LED et stocke la teinte individuelle des LED dans une variable appelée hue. Ensuite, la boucle for définit la valeur HSV de ce pixel spécifié en utilisant la valeur hue.

À l’extérieur de la boucle for, le m_rainbowFirstPixelHue itère ensuite le pixel qui contient la teinte « initiale » créant l’effet arc-en-ciel. m_rainbowFirstPixelHue vérifie ensuite pour s’assurer que la teinte est à l’intérieur des limites de teinte de 180. En effet, la teinte HSV est une valeur de 0 à 180.

Note

C’est une bonne pratique de programmation de garder la méthode robotPeriodic() aussi claire et concise que possible, nous allons donc créer une méthode pour gérer la configuration de nos données LED. Nous appellerons cette méthode rainbow() et l’appellerons de 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;
  }

Maintenant que nous avons créé notre méthode rainbow(), nous devons l’appeler et définir les données qui iront à la bande de 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);
  }