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.
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.
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;
}
Původní video a nové video s potenciometry.
Zdrojový kód se nachází na serveru GitHub.
15.08.2018