# Quick LEDs

# Conexão Elétrica

---

O produto quick leds vem junto com conectores e cabos que facilitam a conexão da fita LED na elétrica do seu robô

### Conexão da fita LED com o RoboRIO e Alimentação

#### Preparando a fita

Primeiramente, repare que a Fita Led possui uma seta indicando a "direção" que o sinal deve ser direcionado. Ou seja, precisamos começar a conexão no primeiro pixel da direção contraria para onde a seta está apontando (no caso da imagem, o mais da direita)

![padrao](https://docs.stemos.com.br/uploads/images/gallery/2024-06/scaled-1680-/EZTimg-6653.jpg)

#### Terminal

Para fazer a ligação dos cabos com a fita LED, nós utilizamos um terminal que "fura" os cabos e os contatos da fita para fazer o contato e prender a conexão, substituindo a solda.

![padrao](https://docs.stemos.com.br/uploads/images/gallery/2024-06/scaled-1680-/hc54b96e917e047cb9d469b137b68e1aa8.jpg)

#### Prendendo a fita

Primeiramente posicionamos a fita dentro do terminal, tomando muito cuidado para posicionar os contatos do LED com os contatos do terminal.

<p class="callout info">Para prender a fita no terminal, utilizamos o lado do terminal que não tem bolinhas (entradas que vão ser utilizadas para os cabos). </p>

![padrao](https://docs.stemos.com.br/uploads/images/gallery/2024-06/scaled-1680-/img-6665.JPG)

Quando posicionada corretamente, podemos pressionar a tampa do terminal até escutarmos um clique.

#### Prendendo os cabos

Para esse passo, devemos nos atentar na posição que os contatos foram presos, pois essa vai ser nossa referência para conectar os cabos na posição.

<p class="callout info">O cabo de sinal (Cabo branco que coneta do RoboRIO) sempre vai ser conectado no meio</p>

![padrao](https://docs.stemos.com.br/uploads/images/gallery/2024-06/scaled-1680-/1hYimg-6667.jpg)

Então vamos colocar os cabos da seguinte maneira:

- +5V - Cabo Vermelho
- GND - Cabo Preto
- DO - Cabo Branco

Podemos posicionar os cabos **não desencapados** dentro dos respectivos buracos, depois de posicionados, podemos fazer o mesmo processo anterior de fechar a tampa do terminal.

![padrao](https://docs.stemos.com.br/uploads/images/gallery/2024-06/scaled-1680-/img-6668.jpg)![padrao](https://docs.stemos.com.br/uploads/images/gallery/2024-06/img-6670-1.gif)

[![IMG_6672.jpg](https://docs.stemos.com.br/uploads/images/gallery/2024-06/scaled-1680-/img-6672.jpg)](https://docs.stemos.com.br/uploads/images/gallery/2024-06/img-6672.jpg)

#### Alimentação e conexão com RoboRIO

O cabo vermelho e preto deve ser conectado na PDH em um dos canais de baixa corrente, porém também pode ser conectado na VRM em uma porta de 12V 2A.

Já o cabo branco deve ser conectado no sinal de uma porta PWM do RoboRIO.

### Conectando mais fitas

A biblioteca de fitas LED da WPILib apenas aceita 1 fica conectada no RoboRIO, por conta disso, para fazer extensões das fitas LED e colocá-las em lugares diferentes.

Para isso nós utilizamos mais dois terminais e fazemos o mesmo processo para conectar uma fita na outra

![padrao](https://docs.stemos.com.br/uploads/images/gallery/2024-06/scaled-1680-/img-6678.jpg)

# Programando o Quick LEDs

A WPILib possui uma API para controlar LEDs WS2812 e WS2811 com seu pino de dados conectado via PWM.

### Instanciando um objeto Adressable LED

Primeiramente você deve criar um objeto `Addressable LED` que tem como argumento a porta PWM que está conectado. Deve ser uma porta PWM no roboRIO. Em seguida, você define o número de LEDs (pixels) localizados em sua faixa de LEDs, o que pode ser feito com a função setLength().

<p class="callout warning">É importante saber que definir o comprimento da fita LED é uma tarefa cara e não é recomendado executá-la periodicamente. </p>

Depois que o comprimento da fita for definido, você terá que criar um objeto `AddressableLEDBuffer` que recebe o número de LEDs como entrada. Em seguida, você chamará `myAddressableLed.setData(myAddressableLEDBuffer)` para definir os dados de saída do led. Então, você pode chamar `myAddressableLed.start()` para gravar a saída continuamente. Abaixo está um exemplo completo do processo de inicialização.

```
@Override
public void robotInit() {
  // porta PWM 9
  // deve ser um cabeçalho PWM , não MXP ou DIO
  m_led = new AddressableLED(9);

  // Reutiliza o buffer
  // Padrão para uma fita de 60 pixeis
  // Definir o comprimento da fita é uma função cara no código, então faça apenas uma vez
  m_ledBuffer = new AddressableLEDBuffer(60);
  m_led.setLength(m_ledBuffer.getLength());

  // Define os dados
  m_led.setData(m_ledBuffer);
  m_led.start();
}

```

<p class="callout info">O roboRIO suporta apenas 1 objeto AddressableLED. Como os LEDs WS2812B são conectados em série, você pode acionar várias faixas conectadas em série a partir do objeto AddressableLED.</p>

### Configurando toda a fita para uma cor

A cor pode ser definida para um LED individual da fita usando dois métodos. `setRGB()` que aceita valores RGB como entrada e `setHSV()` que aceita valores HSV como entrada.

#### Utilizando valores RGB

RGB significa Vermelho, Verde e Azul. Este é um modelo de cores bastante comum, pois é bastante fácil de entender. Os LEDs podem ser configurados com o método `setRGB` que leva 4 argumentos: índice do LED, quantidade de vermelho, quantidade de verde, quantidade de azul. A quantidade de Vermelho, Verde e Azul são valores inteiros entre 0-255.

```
    for (var i = 0; i < m_ledBuffer.getLength(); i++) {
   // Define os LEDs específicos para a cor vermelha em RGB
     m_ledBuffer.setRGB(i, 255, 0, 0);
    }

    m_led.setData(m_ledBuffer);

```

#### Utilizando valores HSV

HSV significa Matiz, Saturação e Valor. Matiz descreve a cor ou matiz, sendo a saturação a quantidade de cinza e o valor o brilho. Na WPILib, Matiz é um número inteiro de 0 a 180. Saturação e Valor são números inteiros de 0 a 255. Se você olhar para um seletor de cores como o do [Google](https://www.google.com/search?q=color+picker), Matiz será de 0 a 360 e Saturação e Valor serão de 0% a 100%. É da mesma forma que o OpenCV lida com cores HSV. Certifique-se de que os valores HSV inseridos no WPILib estejam corretos, ou a cor produzida pode não ser a mesma esperada.

[![hsv-models.webp](https://docs.stemos.com.br/uploads/images/gallery/2024-01/scaled-1680-/hsv-models.webp)](https://docs.stemos.com.br/uploads/images/gallery/2024-01/hsv-models.webp)

Os LEDs podem ser configurados com o método `setHSV` que leva 4 argumentos: índice do LED, matiz, saturação e valor. Um exemplo é mostrado abaixo para definir a cor de uma faixa de LED para vermelho (matiz 0).

```
  for (var i = 0; i < m_ledBuffer.getLength(); i++) {
   // Define os LEDs específicos para a cor vermelha em HSV
   m_ledBuffer.setHSV(i, 0, 100, 100);
  }

  m_led.setData(m_ledBuffer);

```

### Criando um efeito arco-íris

O método abaixo faz algumas coisas importantes. Dentro do loop for, ele distribui igualmente o matiz por todo o comprimento do fio e armazena o matiz individual do LED em uma variável chamada matiz. Em seguida, o loop for define o valor HSV desse pixel especificado usando o valor de matiz.

Movendo-se para fora do loop for, o `m_rainbowFirstPixelHue` itera o pixel que contém o matiz “inicial”, criando o efeito arco-íris. `m_rainbowFirstPixelHue` então verifica se o matiz está dentro dos limites de matiz de 180. Isso ocorre porque o matiz HSV é um valor de 0 a 180.

```
private void rainbow() {
  // Para cada pixel
  for (var i = 0; i < m_ledBuffer.getLength(); i++) {
    // Calcule o hue - hue é melhor para arco iris por conta do
    // formato de cor ser um circulo então apenas uma variável é mudada
    // para processar
      final var hue = (m_rainbowFirstPixelHue + (i * 180 / m_ledBuffer.getLength())) % 180;
    // Define o valor
    m_ledBuffer.setHSV(i, hue, 255, 128);
  }
  // Aumenta o hue para fazer o arco iris "se mover"
  m_rainbowFirstPixelHue += 3;
  // Check bounds
  m_rainbowFirstPixelHue %= 180;
}

```