NeoPixel Ring - Rotácia proti smeru hodinových ručičiek

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.

Príklad

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);
}

Náhodný pokus vedie k správnemu výsledku

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);
}

V smere hodinových ručičiek

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

Proti smeru hodinových ručičiek

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

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



Video



19.12.2021


Menu