Adreslenebilir LED’ler

LED şeritler, çeşitli nedenlerle birkaç yıldır ekipler tarafından yaygın olarak kullanılmaktadır. Ekiplerin, izleyicilerden robot işlevlerinde hata ayıklamasına, robotları için görsel bir işaretçi sağlamasına ve sadece biraz görsel çekicilik katmasına olanak tanır. WPILib, WS2812 LED’leri PWM aracılığıyla bağlı veri pinleri ile kontrol etmek için bir API’ye sahiptir.

AddressableLED Nesnesini Örnekleme

Önce PWM bağlantı noktasını argüman olarak alan bir AddressableLED nesnesi oluşturun. RoboRIO’da bir PWM bağlantısı olmalıdır. Ardından, LED şeridinizde bulunan LED’lerin sayısını setLength() işlevi ile yapabilirsiniz.

Önemli

LED başlığının uzunluğunun ayarlanmasının pahalı bir iş olduğunu ve bunu periyodik olarak yapmanızın tavsiye edilmediğini unutmamak önemlidir.

Şeridin uzunluğu ayarlandıktan sonra, LED’lerin sayısını girdi olarak alan bir AddressableLEDBuffer nesnesi oluşturmanız gerekecektir. Daha sonra led çıkış verilerini ayarlamak için myAddressableLed.setData(myAddressableLEDBuffer) çağrısı yapacaksınız. Son olarak, çıktıyı sürekli yazmak için myAddressableLed.start() çağrısı yapabilirsiniz. Aşağıda, başlatma sürecinin tam bir örneği bulunmaktadır.

Not

C ++ ‘da AddressableLEDBuffer yoktur ve bunun yerine bir Array-dizi kullanır.

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

Tüm Şeridi Tek Renge Ayarlama

Renk, iki yöntem kullanılarak şerit üzerindeki ayrı bir led olarak ayarlanabilir. RGB değerlerini girdi olarak alan setRGB() ve HSV değerlerini giriş olarak alan setHSV().

RGB Değerlerini Kullanma

RGB, Kırmızı, Yeşil ve Mavi anlamına gelir. Bu, anlaşılması oldukça kolay olduğu için oldukça yaygın bir renk modelidir. LED’ler, 4 argüman alan setRGB yöntemi ile ayarlanabilir: LED’in indeksi, kırmızı miktarı, yeşil miktarı, mavi miktarı. Kırmızı, Yeşil ve Mavi miktarı 0-255 arasındaki tam sayılardır.

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 Değerlerini Kullanma

HSV, Ton, Doygunluk ve Değer anlamına gelir. Ton, rengi veya tonu, doygunluk gri miktarını ve değeri parlaklık olarak tanımlar. WPILib’de Hue, 0 - 180 arasında bir tam sayıdır. Doygunluk ve Değer, 0 - 255 arası tam sayılardır. Google’ın gibi bir renk seçiciye bakarsanız, Ton 0 - 360 olacaktır ve Doygunluk ve Değer %0 -%100 arasındadır. Bu, OpenCV’nin HSV renklerini işlediği yolla aynıdır. WPILib’e girilen HSV değerlerinin doğru olduğundan emin olun, aksi takdirde üretilen renk beklendiği gibi aynı olmayabilir.

HSV models picture

LED’ler, 4 bağımsız değişken alan setHSV yöntemiyle ayarlanabilir: LED’in dizini, renk tonu, doygunluk ve değer. Bir LED şeridin rengini kırmızıya (0 tonu) ayarlamak için aşağıda bir örnek gösterilmiştir.

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

Gökkuşağı Etkisi Yaratmak

Aşağıdaki yöntem birkaç önemli şey yapar. For döngüsünün içinde, tonu telin tüm uzunluğu boyunca eşit olarak dağıtır ve ayrı LED tonunu hue adı verilen bir değişkene kaydeder. Daha sonra for döngüsü, hue değerini kullanarak belirtilen pikselin HSV değerini ayarlar.

For döngüsünün dışına çıkan m_rainbowFirstPixelHue, daha sonra gökkuşağı efektini oluşturan “initial” renk tonunu içeren pikseli yineler. m_rainbowFirstPixelHue daha sonra tonun 180 ton sınırları içinde olup olmadığını kontrol eder. Bunun nedeni HSV tonunun 0-180 arası bir değer olmasıdır.

Not

robotPeriodic() yöntemini olabildiğince temiz tutmak iyi bir robot uygulamasıdır, bu nedenle LED verilerimizi ayarlamak için bir yöntem oluşturacağız. Bu yönteme rainbow()``diyeceğiz ve onu  ``robotPeriodic() den çağıracağız.

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

Artık rainbow yöntemimizi oluşturduğumuza göre, aslında yöntemi çağırmalı ve LED’in verilerini ayarlamalıyız.

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