Zápisník experimentátora
Hierarchy: WS2812
Dnes sa budeme venovať otázke, ktorú mi položil jeden odberateľ môjho YouTube kanála. Farby rotujú v smere hodinových ručičiek. Dala by sa táto rotácia otočiť proti smeru hodinových ručičiek? Na prvý pohľad sa to zdá byť jednoduché a aj moja prvá reakcia bola, aby zmenil dva riadky v zdrojovom kóde. Ale nefungovalo to. A tak som sa na problém pozrel a upravil som algoritmus tak, aby to rotovalo opačným smerom.
Zmena je v jedinom riadku. Ak sa povolí makro CCW
, tak prstenec rotuje proti smeru hodinových ručičiek. Nebudem tu ale písať, aký som geniálny programátor a ako som správny kód napísal hneď na prvý pokus. Nenapísal som to na prvý pokus a tých pokusov bolo omnoho viac. Použil som na to metódu pokus-omyl, kým sa mi to nepodarilo. Takto by sa to nemalo robiť, ale keď si myslíte, že je to ľahké, tak vtedy sa dejú aj takéto veci.
#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;
#define CCW
Adafruit_NeoPixel strip = Adafruit_NeoPixel(CNT, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin();
}
void loop() {
// hue - red
// saturation - max
// value - 0-255
for (int i = 0; i < CNT; i++) {
#ifdef CCW
strip.setPixelColor(((CNT + i) - position) % CNT, getPixelColorHsv(i, 0, 255, strip.gamma8((CNT - i) * (255 / CNT))));
#else
strip.setPixelColor((i + position) % CNT, getPixelColorHsv(i, 0, 255, strip.gamma8(i * (255 / CNT))));
#endif
}
strip.show();
position++;
position %= CNT;
delay(50);
}
Z predchádzajúceho textu je jasné, že aj náhodnými pokusmi sa niekedy dostanete k cieľu. Podme si ale pozrieť hodnoty premenných, aby sme videli, ako sa k výsledku program prepracuje. Upravím trochu zdrojový kód, aby sme na sériový port vypísal hodnoty v niektorých premenných.
A z výpisov na sériovom porte je jasné, že to nie je úplne dokonalé. Najmä nastavenie jasu v premennej value by malo byť lepšie roztiahnuté medzi hodnotami 0 - 255. Ale keď sa to pohybuje, ľudské oko drobné nedokonalosti nepostrehne a ilúzia je dokonalá. Študujte jednotlivé výpisy a pokúste sa uhádnuť, ako sa ilúzia pohybujúceho prstenca vytvára. Na NeoPixel Ring sú jednotlivé LED umiestnené v smere hodinových ručičiek a začínajú sa na mieste, kde sú pripojené dátové vodiče.
#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;
char output[128];
//#define CCW
Adafruit_NeoPixel strip = Adafruit_NeoPixel(CNT, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin();
Serial.begin(115200);
}
void loop() {
// hue - red
// saturation - max
// value - 0-255
sprintf(output, "position: %d", position);
Serial.println(output);
for (int i = 0; i < CNT; i++) {
#ifdef CCW
int pos = ((CNT + i) - position) % CNT;
int value = strip.gamma8((CNT - i) * (255 / CNT));
sprintf(output, "i: %d, pos: %d, value: %d", i, pos, value);
Serial.println(output);
strip.setPixelColor(pos, getPixelColorHsv(i, 0, 255, value));
#else
int pos = (i + position) % CNT;
int value = strip.gamma8(i * (255 / CNT));
sprintf(output, "i: %d, pos: %d, value: %d", i, pos, value);
Serial.println(output);
strip.setPixelColor(pos, getPixelColorHsv(i, 0, 255, value));
#endif
}
strip.show();
position++;
position %= CNT;
delay(5000);
}
position: 0 i: 0, pos: 0, value: 0 i: 1, pos: 1, value: 0 i: 2, pos: 2, value: 0 i: 3, pos: 3, value: 1 i: 4, pos: 4, value: 2 i: 5, pos: 5, value: 4 i: 6, pos: 6, value: 6 i: 7, pos: 7, value: 9 i: 8, pos: 8, value: 13 i: 9, pos: 9, value: 17 i: 10, pos: 10, value: 22 i: 11, pos: 11, value: 29 i: 12, pos: 12, value: 36 i: 13, pos: 13, value: 44 i: 14, pos: 14, value: 54 i: 15, pos: 15, value: 64 i: 16, pos: 16, value: 76 i: 17, pos: 17, value: 89 i: 18, pos: 18, value: 103 i: 19, pos: 19, value: 119 i: 20, pos: 20, value: 136 i: 21, pos: 21, value: 154 i: 22, pos: 22, value: 174 i: 23, pos: 23, value: 195 position: 1 i: 0, pos: 1, value: 0 i: 1, pos: 2, value: 0 i: 2, pos: 3, value: 0 i: 3, pos: 4, value: 1 i: 4, pos: 5, value: 2 i: 5, pos: 6, value: 4 i: 6, pos: 7, value: 6 i: 7, pos: 8, value: 9 i: 8, pos: 9, value: 13 i: 9, pos: 10, value: 17 i: 10, pos: 11, value: 22 i: 11, pos: 12, value: 29 i: 12, pos: 13, value: 36 i: 13, pos: 14, value: 44 i: 14, pos: 15, value: 54 i: 15, pos: 16, value: 64 i: 16, pos: 17, value: 76 i: 17, pos: 18, value: 89 i: 18, pos: 19, value: 103 i: 19, pos: 20, value: 119 i: 20, pos: 21, value: 136 i: 21, pos: 22, value: 154 i: 22, pos: 23, value: 174 i: 23, pos: 0, value: 195 position: 2 i: 0, pos: 2, value: 0 i: 1, pos: 3, value: 0 i: 2, pos: 4, value: 0 i: 3, pos: 5, value: 1 i: 4, pos: 6, value: 2 i: 5, pos: 7, value: 4 i: 6, pos: 8, value: 6 i: 7, pos: 9, value: 9 i: 8, pos: 10, value: 13 i: 9, pos: 11, value: 17 i: 10, pos: 12, value: 22 i: 11, pos: 13, value: 29 i: 12, pos: 14, value: 36 i: 13, pos: 15, value: 44 i: 14, pos: 16, value: 54 i: 15, pos: 17, value: 64 i: 16, pos: 18, value: 76 i: 17, pos: 19, value: 89 i: 18, pos: 20, value: 103 i: 19, pos: 21, value: 119 i: 20, pos: 22, value: 136 i: 21, pos: 23, value: 154 i: 22, pos: 0, value: 174 i: 23, pos: 1, value: 195
position: 0 i: 0, pos: 0, value: 218 i: 1, pos: 1, value: 195 i: 2, pos: 2, value: 174 i: 3, pos: 3, value: 154 i: 4, pos: 4, value: 136 i: 5, pos: 5, value: 119 i: 6, pos: 6, value: 103 i: 7, pos: 7, value: 89 i: 8, pos: 8, value: 76 i: 9, pos: 9, value: 64 i: 10, pos: 10, value: 54 i: 11, pos: 11, value: 44 i: 12, pos: 12, value: 36 i: 13, pos: 13, value: 29 i: 14, pos: 14, value: 22 i: 15, pos: 15, value: 17 i: 16, pos: 16, value: 13 i: 17, pos: 17, value: 9 i: 18, pos: 18, value: 6 i: 19, pos: 19, value: 4 i: 20, pos: 20, value: 2 i: 21, pos: 21, value: 1 i: 22, pos: 22, value: 0 i: 23, pos: 23, value: 0 position: 1 i: 0, pos: 23, value: 218 i: 1, pos: 0, value: 195 i: 2, pos: 1, value: 174 i: 3, pos: 2, value: 154 i: 4, pos: 3, value: 136 i: 5, pos: 4, value: 119 i: 6, pos: 5, value: 103 i: 7, pos: 6, value: 89 i: 8, pos: 7, value: 76 i: 9, pos: 8, value: 64 i: 10, pos: 9, value: 54 i: 11, pos: 10, value: 44 i: 12, pos: 11, value: 36 i: 13, pos: 12, value: 29 i: 14, pos: 13, value: 22 i: 15, pos: 14, value: 17 i: 16, pos: 15, value: 13 i: 17, pos: 16, value: 9 i: 18, pos: 17, value: 6 i: 19, pos: 18, value: 4 i: 20, pos: 19, value: 2 i: 21, pos: 20, value: 1 i: 22, pos: 21, value: 0 i: 23, pos: 22, value: 0 position: 2 i: 0, pos: 22, value: 218 i: 1, pos: 23, value: 195 i: 2, pos: 0, value: 174 i: 3, pos: 1, value: 154 i: 4, pos: 2, value: 136 i: 5, pos: 3, value: 119 i: 6, pos: 4, value: 103 i: 7, pos: 5, value: 89 i: 8, pos: 6, value: 76 i: 9, pos: 7, value: 64 i: 10, pos: 8, value: 54 i: 11, pos: 9, value: 44 i: 12, pos: 10, value: 36 i: 13, pos: 11, value: 29 i: 14, pos: 12, value: 22 i: 15, pos: 13, value: 17 i: 16, pos: 14, value: 13 i: 17, pos: 15, value: 9 i: 18, pos: 16, value: 6 i: 19, pos: 17, value: 4 i: 20, pos: 18, value: 2 i: 21, pos: 19, value: 1 i: 22, pos: 20, value: 0 i: 23, pos: 21, value: 0
Zdrojový kód sa nachádza na serveri GitHub.
19.12.2021