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.
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.
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;
}
Pôvodné video a nové video s potenciometrami.
Zdrojový kód sa nachádza na serveri GitHub.
14.08.2018