NeoPixel Ring HSV - Návrat rotujících kruhů

Zápisník experimentátora

Hierarchy: WS2812

V diskusi k videu o rotujících kruzích zazněla otázka, zda by se červená barva nedala upravit i na jiné barvy. Tento článek se věnuje hledání správné barvy. Pomocí tří potenciometrů si můžete upravit základní parametry HSV barevného modelu a můžete si nastavit i rychlost rotace.

Použité součástky

  • Arduino Uno - Můžete použít libovolnou verzi Arduina.
  • NeoPixel Ring 24 LED (link) - Obsahuje 24 RGB LED diód s čipem WS2812B.
  • Rezistor 1k (link) - Rezistor se připojí na datový vstup NeoPixel Ringu. Slouží jako ochrana pinu.
  • Kondenzátor 220 uF (link) - Kondenzátor se připojí mezi VCC a GND na NeoPixel Ringu. Slouží k vyrovnávání napěťových špiček.

Ochranné součástky jsou nutné proto, aby se NeoPixel Ring nepoškodil. Podrobnosti ochrany jsou uvedeny v článku o napájení těchto diod.

Na obrázku je Ring s 12 diodami. Ring s 24 diodami se nijak mimořádně od něj neliší a je proto možné použít i menší ring po příslušné úpravě kódu.

Program

Vůči předchozímu programu jsem doplnil čtení tří analogových hodnot z potenciometrů. Používám kvalitnější potenciometry, které se používají v audiotechnice. Vybral jsem si takové, které jsou určeny k zasunutí shora do plošného spoje. Mají hodnotu 10k a při otáčení hřídelí mají v polovině dráhy zarážku, podle které se snadněji orientujete.

Zapojení potenciometrů není žádná věda, pokud dodržíte základní pravidlo, aby byly analogové části obvodu v jiné větvi, jako jsou digitální. V tomto případě digitální část představuje NeoPixel Ring. Tento typ, který má 24 LED diod může při rozsvícení všech diod brát až 3x24x20 mA. Proto je vhodné jeho napájení na breadboardu dát na jednu stranu. Analogovou část zase třeba dát na druhou část. Kdybyste tak neučinili, mohli byste na analogových vstupech naměřit podivné hodnoty. To díky tomu, že breadboard má v kovových drahách a spojích nezanedbatelný odpor a tak při velkém protékajícím proudu vznikne velký úbytek napětí.

V mém zapojení je pro zajištění lepšího měření přidán ještě jeden kondenzátor při nejvzdálenějším potenciometru. A protože měřím najednou více analogových hodnot, ignoruji první měření a výslednou hodnotu průměr ze čtyř měření. Naměřené hodnoty v rozsahu 0-1023 transformovat pomocí funkce map na vhodné rozsahy.

Jednou za sekundu vypisuji všechny naměřené hodnoty na sériový port. Využívám na to funkci sprintf, pomocí které je zápis přehlednější.

#include <Adafruit_NeoPixel.h>
#include "hsv.h"

// data pin
#define PIN 6
// led count
#define CNT 24
// max Hue
#define MAXHUE 256*6

int position = 0;
int pot_hue;        // A0
int pot_saturation; // A2
int pot_speed;      // A3
char output[128];
unsigned long next_time = 0;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(CNT, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  Serial.begin(115200);
  strip.begin();
}

void loop() {
  // analog
  pot_hue = map(aRead(A0), 0, 1023, 0, MAXHUE);
  pot_saturation = map(aRead(A2), 0, 1023, 0, 255);
  pot_speed = map(aRead(A3), 0, 1023, 1, 500);
  unsigned long m = millis();
  if (m - next_time > 1000L) {
    next_time = m;
    sprintf(output, "hue: %d, sat: %d, spd: %d", pot_hue, pot_saturation, pot_speed);
    Serial.println(output);
  }

  // hue - red
  // saturation - max
  // value - 0-255
  for (int i = 0; i < CNT; i++)
    strip.setPixelColor((i + position) % CNT,
                        getPixelColorHsv(i,
                                         pot_hue,
                                         pot_saturation,
                                         strip.gamma8(i * (255 / CNT))));
  strip.show();
  position++;
  position %= CNT;
  delay(pot_speed);
}

int aRead(int anl) {
  long tmp = 0, t;
  // discard first X measurements
  for (int i = 0; i < 1; i++)
    analogRead(anl);
  for (int i = 0; i < 4; i++) {
    t = analogRead(anl);
    tmp += t;
  }
  return tmp / 4;
}

Video

Původní video a nové video s potenciometry.

Zdrojový kód

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



Video



15.08.2018


Menu