NeoPixel Ring - Fázový posun

Zápisník experimentátora

Hierarchy: WS2812

V předchozím článku jsme si naprogramovali třídu Rotator a nyní si pomocí ní vytvoříme zajímavou animaci. Použijeme 3x NeoPixel Ring a pomocí fázového posunu vytvoříme efekt, ve kterém se budou proti sobě zdánlivě pohybovat tři svítící body s barevným ocasem. Je to jen iluze, všechny tři body se pohybují stejným směrem.

Iluze

Iluze je vytvořena pomocí tří NeoPixel Ring. Na pěnové cihličce jsou prstence připevněny pomocí špendlíků. Na obrázku jsou vidět jako dvě drobné kovové hlavičky, které se nacházejí v místech, kde je na zbytku prstence miniaturní kondenzátor. Prstence jsou co nejblíže u sebe. Každý prstenec obsahuje 24 LED. Pokud na prvním prstenci začneme animaci na LED 1 a na druhém začneme na LED 12, budou oba body vůči sobě relativně na opačném konci prstence. Oba se sice pohybují ve směru hodinových ručiček, ale první se zdánlivě pohybuje směrem doprava a druhý se pohybuje zdánlivě směrem doleva. Po přejetí dvanácté pozice se směr zdánlivě obrátí a zase se pohybují proti sobě.

Pokud na animaci použijeme tři prstence, bude výsledný efekt výraznější. Třetí prstenec se animuje úplně stejně, jako první prstenec. Na umocnění celkového dojmu má každý prstenec odlišnou barvu.

Příklad

Abychom mohli iluzi vytvořit, potřebujeme tři prstence (ring1, ring2 a ring3) a každý prstenec se nachází na samostatném pinu (6, 7, 8). Třídu Rotator jsme si popsali v předchozím článku. Potřebujeme tři objekty (rt1, rt2 a rt3) třídy Rotator. Každý objekt má nastaven fázový posun (druhý parametr), odstín (třetí parametr) a sytost (čtvrtý parametr).

Celá animace se vytváří ve funkci loop, ve které pravidelně voláme funkci Step pro každý ze tří objektů. Jednoduchý kód, který vytváří působivou animaci.

#include <Adafruit_NeoPixel.h>

// led count
#define CNT 24
// max Hue
#define MAXHUE 65535

Adafruit_NeoPixel ring1(CNT, 6, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel ring2(CNT, 7, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel ring3(CNT, 8, NEO_GRB + NEO_KHZ800);

class Rotator
{
    Adafruit_NeoPixel *strip;
    int position;
    uint16_t hue;
    uint8_t saturation;

  public:
    Rotator(Adafruit_NeoPixel *npx, int pos = 0, uint16_t h = 0, uint8_t sat = 255);
    void Step();
};

Rotator::Rotator(Adafruit_NeoPixel *npx, int pos, uint16_t h, uint8_t sat)
  : strip(npx), position(pos), hue(h), saturation(sat)
{
}

void Rotator::Step()
{
  // hue - 0-65535
  // saturation - 0-255
  // value - 0-255
  for (int i = 0; i < CNT; i++)
    strip->setPixelColor(
      (i + position) % CNT,
      strip->ColorHSV(hue, saturation, strip->gamma8(i * (255 / CNT))));
  strip->show();
  position++;
  position %= CNT;
}

Rotator rt1(&ring1, 0, 0, 255); // red
Rotator rt2(&ring2, 12, 0, 200); // pink
Rotator rt3(&ring3, 0, 40000L, 200); // lightblue

void setup() {
  ring1.begin();
  ring2.begin();
  ring3.begin();
}

void loop() {
  rt1.Step();
  rt2.Step();
  rt3.Step();
  delay(50);
}

Zdrojový kód

Zdrojový kód se nachází na serveru GitHub.


09.10.2021


Menu