Serwisy partnerskie:
Close icon
Serwisy partnerskie

Ekscytacje Maxa. Migające diody LED i śliniący się inżynierowie (11)

Article Image
Dobry Boże! Kipię z podekscytowania. Mam tyle rzeczy, o których chcę opowiedzieć, że nie mam pojęcia od czego zacząć. Wiem, wiem... Muszę usiąść, wziąć głęboki oddech, zacząć od początku, przejść przez środek i w końcu dotrzeć do końca. Problemem jest podjęcie decyzji, o czym mówić najpierw. Widzę w twoich oczach, że desperacko pragniesz, abym zaczął od korekcji gamma. Skoro nalegasz...

Złe samopoczucie 

Dawno temu, gdy zaczynaliśmy tę mega-miniserię (PE, marzec 2020), wprowadziliśmy koncepcję modulacji szerokości impulsu (PWM). Ponieważ możemy bardzo szybko włączać i wyłączać diodę LED, sposobem kontrolowania jej jasności jest zmiana proporcji czasu włączenia do czasu wyłączenia. Określamy to jako „cykl pracy”. Cykl pracy 20% oznacza, że dioda LED jest włączona przez 20% czasu, a wyłączona przez pozostałe 80%, podczas gdy cykl pracy 80% oznacza, że dioda LED jest włączona przez 80% czasu, a wyłączona przez pozostałe 20%.

W przypadku mikrokontrolera (MCU), z którym pracujemy – Seeedunio XIAO – możemy użyć wartości od 0 (0x00 w systemie szesnastkowym), co oznacza całkowite wyłączenie (0% jasności) do 255 (0xFF w systemie szesnastkowym), co oznacza całkowite włączenie (100% jasności). Korzystając z tej techniki PWM, wartość 128 (0x80 w systemie szesnastkowym) oznacza, że dioda LED będzie włączona przez połowę czasu, a wyłączona przez drugą połowę, co daje 50% jasności.

Nieco później (PE, wrzesień 2020 r.) przedstawiliśmy koło kolorów, które zdecydowaliśmy się wykorzystać do naszych eksperymentów z tablicą pingpongową 12×12. Jeśli sam zbudowałeś jedną z tych tablic lub ogólnie bawisz się trójkolorowymi diodami LED, być może zauważyłeś, że niektóre kolory wydają się być nieco „wyłączone”. Na przykład róż może wydawać się bardzo zbliżony do magenty, podczas gdy pomarańczowy kolor może wydawać się bardziej żółty, niż można by się spodziewać.

Z jasnej strony (gra słów nie jest zamierzona), czerwone, zielone i niebieskie elementy w naszych trójkolorowych diodach LED działają zgodnie z oczekiwaniami i zapewniają liniową reakcję, tak że 50% cykl pracy rzeczywiście skutkuje 50% jasnością. Problem polega na tym, że nasze oczy ewoluowały, aby dostosować się do ogromnego zakresu dynamiki, od światła księżyca po światło słoneczne i – jako część tego – mają wbudowaną nieliniowość.

Chociaż nie jest to od razu oczywiste z mojego diagramu, krzywa tej nieliniowości jest zdefiniowana przez nieco trudną funkcję potęgową. Aby temu zaradzić, musimy sterować czerwonymi, zielonymi i niebieskimi diodami LED za pomocą odwrotności tej funkcji, co powoduje, że nasze oczy postrzegają to, na co liczyliśmy. Proces stosowania tej funkcji odwrotnej nazywamy „korekcją gamma”.

Na stronie internetowej Adafruit znajduje się świetny artykuł omawiający to wszystko dogłębnie (https://learn.adafruit.com/led-tricks-gamma-correction). W ramach tego zapewniają coś, co nazywają „szybką poprawką” w postaci tabeli odnośników, której możemy użyć do przemapowania wartości liniowych, których chcielibyśmy użyć, na ich odpowiedniki z korekcją gamma, które zapewnią nam kolory, które chcemy zobaczyć.

Stworzyłem szybki szkic testowy (program), aby zobaczyć, jak wpłynie to na kolory na mojej tablicy 12×12 (pełny szkic zawarty jest w pliku CB-Jan21-01.txt – ten i inne pliki powiązane z tym artykułem są dostępne na stronie PE ze stycznia 2021 r.). Ponieważ ludzie z Adafruit byli świadomi, że niektórzy z ich użytkowników będą używać niskobudżetowych Arduino z ograniczoną pamięcią SRAM, przechowują swoją tabelę w PROGMEM (pamięć programu Flash). Dla porównania, mój Seeedunio XIAO ma tak dużo pamięci, że mogę sobie pozwolić na obnoszenie się z nią, więc wysłałem lokaja po moje spodnie i zapisałem moją tabelę w pamięci SRAM.

Wcześniej (PE, październik 2020 r.) poznaliśmy funkcje GetRed(), GetGreen() i GetBlue(), które wyodrębniają i zwracają 8-bitowe składowe koloru czerwonego, zielonego i niebieskiego z 32-bitowej wartości koloru. Ponadto wprowadziliśmy funkcję BuildColor(), która akceptuje 8-bitowe składowe koloru czerwonego, zielonego i niebieskiego i zwraca 32-bitową wartość koloru.

Rzecz w tym, że musimy zastosować naszą korekcję gamma do każdego z kanałów kolorów indywidualnie. Dlatego w naszym nowym szkicu dodaliśmy funkcję GetGammaCorrectedColor(), która akceptuje 32-bitową wartość koloru, dzieli ją na składowe czerwoną, zieloną i niebieską, wykorzystuje naszą tabelę przeglądową GammaXref[], aby zastosować korekcję gamma do każdej składowej, a następnie zwraca 32-bitowy wynik z korekcją gamma.

uint32_t GetGammaCorrectedColor
(uint32_t uncorrectedColor)
{
uint8_t tmpRed;
uint8_t tmpGreen;
uint8_t tmpBlue;
    
uint32_t gammaCorrectedColor;


tmpRed = GammaXref[ GetRed(uncorrectedColor) ];
tmpGreen = GammaXref[ GetGreen(uncorrectedColor) ];
tmpBlue = GammaXref[ GetBlue(uncorrectedColor) ];


gammaCorrectedColor = BuildColor(tmpRed,
tmpGreen, tmpBlue);


return gammaCorrectedColor;
}

Pozostała część szkicu służy do załadowania lewej strony tablicy nieskorygowanymi kolorami bezpośrednio z naszego koła kolorów, a prawej strony ich odpowiednikami z korekcją gamma, zaczynając od czerwieni na dole, a kończąc na róży na górze.

Chociaż trudno to zauważyć na tym obrazku, w rzeczywistości wartości skorygowane gamma prezentują coś, co wydaje się być bogatszą paletą kolorów. Na przykład, pomarańczowy z korekcją gamma (drugi rząd od dołu) wygląda na bardziej pomarańczowy, a różowy z korekcją gamma (górny rząd) wydaje się bardziej żywy.

Aby przeczytać ten artykuł kup e-wydanie
Kup teraz
Firma:
Tematyka materiału: LED, 21-segmentowe wyświetlacze wiktoriańskie, Adafruit, GetRed(), GetGreen(), GetBlue(), GetGammaCorrectedColor(), GammaXref[], Memory Array Redcode Simulator, Core War, NeoPixel, Fusion 9DOF, BNO055, XAIO, Arduino, LightMultiple(), loop(), RingXref[], for(), iNeo
AUTOR
Źródło
Elektronika dla Wszystkich sierpień 2024
Udostępnij
Zobacz wszystkie quizy
Quiz weekendowy
Czujniki temperatury
1/10 Temperatura to
UK Logo
Elektronika dla Wszystkich
Zapisując się na nasz newsletter możesz otrzymać GRATIS
najnowsze e-wydanie magazynu "Elektronika dla Wszystkich"