NeoPixel Ring HSV - Návrat rotujúcich kruhov

Zápisník experimentátora

Hierarchy: WS2812

V diskusii k videu o rotujúcich kruhoch zaznela otázka, či by sa červená farba nedala upraviť aj na iné farby. Tento článok sa venuje hľadaniu správnej farby. Pomocou troch potenciometrov si môžete upraviť základné parametre HSV farebného modelu a môžete si nastaviť aj rýchlosť rotácie.

Použité súčiastky

  • Arduino Uno - Môžete použiť ľubovoľnú verziu Arduina.
  • NeoPixel Ring 24 LED (link) - Obsahuje 24 RGB LED diód s čipom WS2812B.
  • Rezistor 1k (link) - Rezistor sa pripojí na dátový vstup NeoPixel Ringu. Slúži ako ochrana pinu.
  • Kondenzátor 220 uF (link) - Kondenzátor sa pripojí medzi VCC a GND na NeoPixel Ringu. Slúži na vyrovnávanie napäťových špičiek.

Ochranné súčiastky sú nutné preto, aby sa NeoPixel Ring nepoškodil. Podrobnosti ochrany sú uvedené v článku o napájaní týchto diód.

Na obrázku je Ring s 12 diódami. Ring s 24 diódami sa nijako mimoriadne od neho nelíši a je preto možné použiť aj menší ring po príslušnej úprave kódu.

Program

Voči predchádzajúcemu programu som doplnil čítanie troch analógových hodnôt z potenciometrov. Používam kvalitnejšie potenciometre, ktoré sa používajú v audiotechnike. Vybral som si také, ktoré sú určené na zasunutie zhora do plošného spoja. Majú hodnotu 10k a pri otáčaní hriadeľou majú v polovici dráhy zarážku, podľa ktorej sa ľahšie orientujete.

Zapojenie potenciometrov nie je žiadna veda, pokiaľ dodržíte základné pravidlo, aby boli analógové časti obvodu v inej vetve, ako sú digitálne. V tomto prípade digitálnu časť predstavuje NeoPixel Ring. Tento typ, ktorý má 24 LED diód môže pri rozsvietení všetkých diód brať až 3x24x20 mA. Preto je vhodné jeho napájanie na breadboarde dať na jednu stranu. Analógovú časť zase treba dať na druhú časť. Keby ste tak neurobili, mohli by ste na analógových vstupoch namerať podivné hodnoty. To vďaka tomu, že breadboard má v kovových dráhach a spojoch nezanedbateľný odpor a tak pri veľkom pretekajúcom prúde vznikne veľký úbytok napätia.

V mojom zapojení je pre zabezpečenie lepšieho merania pridaný ešte jeden kondenzátor pri najvzdialenejšom potenciometri. A pretože meriam naraz viac analógových hodnôt, ignorujem prvé meranie a výslednú hodnotu priemerujem zo štyroch meraní. Namerané hodnoty v rozsahu 0-1023 transformujem pomocou funkcie map na vhodné rozsahy.

Raz za sekundu vypisujem všetky namerané hodnoty na sériový port. Využívam na to funkciu sprintf, pomocou ktorej je zápis prehľadnejší.

#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 potenciometrami.

Zdrojový kód

Zdrojový kód sa nachádza na serveri GitHub.



Video



14.08.2018


Menu