Ads_700x200

niedziela, 29 września 2013

GAMMA correction - nowe narzędzie w MkAvrCalculator

Witam,

Dzisiaj chciałbym przedstawić wam kolejne już nowe narzędzie w programie MkAvrCalculator. Tym razem zajmiemy się korekcją GAMMA. Co kryje się pod tym tajemniczym terminem. Pewnie każdy z was, kto zajmował się sterowaniem jasności diod LED za pomocą PWM zauważył, że zjawisko to jest bardzo nieliniowe, w związku z czym, próba rozjaśniania i ściemniania diody LED np w 256 krokach przy użyciu PWM'a o rozdzielczości 256, powoduje zwykle dosyć brzydkie zjawisko polegające na tym, że dioda przy niskich wartościach PWM bardzo szybko się rozjaśnia prawie do maksymalnej wartości (a przynajmniej nam tak się wydaje, tak postrzegają to nasze oczy). Po czym gdy zwiększamy PWM od wartości już ok 50 do 255 to w zasadzie nasze oko nie dostrzega zmian w zwiększającym się natężeniu światła. Wziąwszy do tego pod uwagę fakt, że różne diody LED (różne kolory) mają różne własne charakterystyki zależności prądu od napięcia (nieliniowe oczywiście) to dostajemy obraz, w którym ciężko jest niejednokrotnie uzyskać ciekawe i w pełni interesujące nas efekty świetlne, gdy budujemy własne urządzenie. Na początek zapraszam na krótki, tym razem naprawdę krótki film:


A poniżej kilka słów wyjaśnienia. Spójrzmy bowiem na takie bardzo uproszczone zebrane na jednym wykresie charakterystyki kilku różnych diod LED:



Widać, że w zakresie prądu od 0 do 20 mA i przyłożonego napięcia, jasność każdej z nich zmienia się bardzo nieliniowo. A zatem np PWM o rozdzielczości 8 bitów, w 256 krokach nie da rady spowodować aby uzyskać w pełni liniowy efekt rozjaśniania i ściemniania się diod LED. W tym celu warto skorzystać przynajmniej z podstawowej korekcji GAMMA. Nie jest ona zgodna wprawdzie z kolei z charakterystyką postrzegania przez ludzkie oko ale już zastosowanie tej korekcji będzie dawało nam po stokroć lepszy efekt, niż bez żadnej korekcji. Dane można ładnie tablicować i posługiwać się nimi w mikrokontrolerze. Dlatego nowe narzędzie w programie MkAvrCalculator wykorzystuje jeden z prostszych algorytmów firmy Maxim do obliczania poszczególnych wartości, poniżej zaprezentowany przez Maxim pseudo kod.


Na jego podstawie możemy w programie dowolnie sobie zmieniać wszystkie parametry jak:

1. rozdzielczość bitową PWM
2. ilość kroków jasności
3. współczynnik GAMMA

dzięki temu, że wszystko jest przeliczanie niejako "w locie" a przy okazji na bieżąco generuje nam wręcz gotowy kod do wykorzystania wprost w języku C w Eclipse, możemy nie dość, że oszczędzić dużo czasu to jeszcze cieszyć się jakością nowych efektów jakie od dzisiaj będziemy robić ;)


Przy okazji zapraszam do pobrania najnowszej wersji programu MkAvrCalculator z wbudowanym nowym narzędziem:


;)

28 komentarzy:

  1. Kolejny bardzo fajny poradnik. I te mądre diody... :P

    OdpowiedzUsuń
    Odpowiedzi
    1. No przyznam ci szczerze, że jestem niestety wciąż pod wpływem ... tzn pod wpływem tych mądrych diod ;) ... jestem od nich już nawet uzależniony :( ... a lekarz powiedział mi, że to niestety nieuleczalne - więc muszę się z tym nauczyć jakoś żyć ;) ... Rewelacja ... ileż można z nimi robić projektów to się w głowie nie mieści ...

      Usuń
  2. Mirku, przydałby się jeszcze jakiś kod przykładowy, bo dla początkującego to dalej ciemna magia tak jak i przed poradnikiem ...

    PS. Kawał dobrej roboty
    PS2. Kiedy Ty śpisz ?

    OdpowiedzUsuń
  3. W intro poradnika widać już jakieś nowe konstrukcje Mirka. Już się nie mogę doczekać.
    Ps. Świetna Robota Mirku

    OdpowiedzUsuń
  4. A mnie zawsze zastanawiało co to jest ta korekcja w sterownikach kart graficznych.
    Kolejny rzeczowy poradnik.
    Jeśli mógłbyś uchylić rąbka tajemnicy, to jak osiągnąłeś 90 wyjść z PWM? Bo rozumiem że tyle jest wymaganych do tej "super-wypasionej" linijki?

    OdpowiedzUsuń
    Odpowiedzi
    1. Wydaje mi się że to linijka na tych nowych diodach RGB WS2812 sterowanych za pomocą magistrali I2c

      Usuń
    2. Nie znam się na tym,a więcej nawet takiej linijki na żywo nie widziałem, więc mogę się mylić ale...
      ...bez sensu byłoby wyprowadzać tyle wyjść :) Tu gra rolę multiplexowanie albo jakiś mały modulik w samej linijce coś a'la sterownik diod przez jakiś standard komunikacji np SPI. Nie wiem jak jest dokładnie ale nawet widać że ATB v1.x i linijkę łączy tylko parę kabelków :)

      Usuń
    3. MrWeb123 te diody łaczy się kaskadowo, podobnie jak rejestry. Każda taka dioda ma swoją "inteligencję" - swój własny mały sterownik PWM. Wysyłasz do niej tylko 3 bajty oznaczające wypełnienie dla każdego z kolorów.

      Usuń
    4. Czyli prawie trafiłem :D Dzięki.

      Usuń
  5. Panowie w tej linijce są te diody LED ;)

    http://www.sklep.atnel.pl/pl/p/Dioda-RGB-WS2812/80

    OdpowiedzUsuń
  6. Jakoś nie wpadłem na to, że ta są produkowane takie elementy i to dość tanie.
    A odnośnie linijki, to nie rozumiem skąd taka "dziwna" liczba diod, zamiast np ładnej i równej liczby 32 - bliższej sercu elektronikom-informatykom ;)

    OdpowiedzUsuń
    Odpowiedzi
    1. A ja mam jeszcze jedno pytanie jeśli już tak rozmawiamy o tej linijce RGB...
      Diody są dość daleko od siebie, tzn widać że nie jest to płynny strumień światła tylko pojedyncze punkciki - diody. Czy można więc, zmniejszyć odległości między diodami, albo zalać to jakimś żelem rozpraszającym światło ? Tak aby wyglądało to jak jeden długi strumień światła ( np. tak jak w lampach jarzeniowych, gdzie jest świecący "patyk" :P )

      Usuń
    2. Można max na 1m zmieści się 60 szt ;)

      Usuń
    3. Są takie konstrukcje, gdzie linijkę diodową wkłada się do plastykowej rury rozpraszającej światło. Przypomina to z wyglądu świetlówkę liniową.

      Usuń
  7. Dzięki panowie, nie mam więcej pytań :)

    No i czekam na następne projekty! :D

    OdpowiedzUsuń
  8. Ale super, Mirek dzięki Tobie napisanie kodu wyświetlającego "sztuczną zorzę polarną" to pikuś. Teraz wystarczy mikrokontoler + kod w C + linijka RGB + odpowiednie rozproszenie światła = jestem na Antarktydzie.

    Jak widzę finalna wersja obiecanej przejściówki (golasa) FT232RL to niezły multi kombajn.

    OdpowiedzUsuń
  9. a co to za operator ^ w tym wzorze ?
    Czym mógłbym go zastąpić w pythonie ?

    OdpowiedzUsuń
  10. Witam,
    Mirek dobra robota. Moim zdaniem jedno stwierdzenie jest błędne. Mówisz że pwm reguluje nam prąd diody. W bezposrednim sterowaniu pwm bez filtrów dioda dostaje jedynie przerywany prąd w czasach ustalonych wypelnieniem pwm. Wiec jesli prad sie nie zmienia to i charakterystyka pracy diody sie nie zmienia. Strumien swetlny diody np przy prądzie 20mA jest stały wiec podcza każdego impusu generowanego przez pwm dioda swieci tak samo jedynie oko ludzkie usrednia sobie te impulsy świetlne i dlatego nie dostrzegamy efektu migotania przy pewnym progu czestotliwosci pwm. Gdy obniżymy czestotliwosc pracy pwm do bardzo niskiej dostrzegalnej przez ludzkie oko zobaczymy że każdy impuls niezaleznie od czasu trwania zapala diode tak samo jasno. Tak wiec charakterystyka diody dla różnych prądów nie ma znaczenia przy korekcji gamma jedynie chodzi tu moim zdaniem o dopasowanie czułości do ludzkiego oka. Oczywiscie pomijam skrajny przypadek gdzie częstotliwosc pwm jest na tyle duża, że zaczynają mieć wpływ pojemności diody, tranzystorów, i samych ścieżek:) Nie chodzi mi o czepianie sie, ale jeśli mam rację to powinno to być sprostowane żeby nie wprowadzać zainteresowanych w błąd.
    Mam pytanie odnosnie diód ws2812b czy ktoś sprawdzał bo dokumentacja jest uboga a z tematu wnioskuje ze sterownik w tej diodzie nie ma korekcji gamma wiec trzeba to zrobic samemu przy rozdzielczosci 256 na kanał to z korekcją gamma o wspolczynniku 2 zostaje nam tylko 16 punktów jasnosci na kanal to bardzo malo i dyskwalifikuje te diody do zastosowania w ekranach LED. Kolejna sprawa to żywotnosc diody skoro ma w sobie dodatkowy układ to napewno bardziej sie grzeje i stąd moje pytanie: Czy ktos sprawdzal sprawnosc tego ukladu sterujacego tą diodą? W dokumentacji tego nie podają. Ciekawe jak dioda dostaje swoje napiecie na każdą składową czyli np ok 2,4V czerwona z tych 5V zasilania? Podejrzewam, że przetwornicy impulsowej w niej nie zintegrowali, więc pewnie liniowy regulator... JEsli tak to sprawność nie przekracza 70% więc dyskwalifikuje to moim zdaniem z zastosowan energooszczędnych tak jak taśmy led z rezystorami "grzejnymi" :) Jedyną dużą zaletą ws2812 jest możliwość sterowania każdą diodą niezależnie na takiej taśmie, która tworzy tanią, prosta (mniej kabli) i szybką konstrukcje systemu.

    Z góry przepraszam za błędy ale pisałem komentarz pilnując dwójkę dzieci:)

    pozdrawiam
    gringo80@wp.pl

    OdpowiedzUsuń
    Odpowiedzi
    1. Po pierwsze wyjaśniam, nie jestem elektronikiem a już na analogówce się mało znam i nigdy tego nie ukrywam. Co do wyjaśnień to kolega się jednak czepia nieco bez sensu ;) i nic prostować nie będę - bo nie ma czego. Każdy kto potrzebuje w to wniknąć to dojdzie. A dzięki PWM i tak płynie mniejszy średni prąd i już. Średnie napięcie się na pewno zmniejsza więc i prąd również. ;) ... Nie przeczę, że masz rację ani nie zamierzam się kłócić w tym zakresie ;)

      Co do wad jakich się naliczyłeś dla diod (nie diód) WS28xx to też sorki ale bez sensu - bo nikt nigdy i nigdzie nie mówił że są energo-oszczędne ... ich zaletą jest właśnie możliwość sterowania każdą z osobna ... a doszukiwanie się tu energooszczędności albo żeby się nie grzały ;) to spora przesada. Bo pobierają dużo prądu, grzeją się bardzo mocno i co z tego ? ;)

      Usuń
    2. Dziękuję za odpowiedź.

      Usuń
  11. Czy

    (width/arraysize * (index+1)) / width)

    to nie jest przypadkiem to samo co (index+1)/arraysize?

    OdpowiedzUsuń
    Odpowiedzi
    1. Panie kolego, arkusz kalkulacyjny w łapki i sprawdź sobie ;) szybciej się dowiesz

      Usuń
  12. Panie kolego, poprzednie pytanie było retoryczne. Miało zwrócić uwagę na to że kod lepiej upraszczać, zwłaszcza jeżeli chodzi o obliczenia, zwłaszcza jeżeli chodzi o obliczenia na liczbach zmiennoprzecinkowych, a w szczególności jeżeli blog jest w tematyce mikroprocków i zaraz ktoś zacznie coś takiego bezmyślnie implementować na jakimś AVR.

    OdpowiedzUsuń
    Odpowiedzi
    1. Po pierwsze to nie jest do implementacji na AVR a już w szczególności na liczbach zmiennoprzecinkowych na AVR ;) Zaś pisząc o kimś, że będzie robił coś bezmyślnie, to sam sobie wystawiasz pan ocenę ... albo? ... albo może sam czegoś mocno nie rozumiesz, bo kod o którym mowa wyżej został użyty tylko po to aby tablicować sobie wyniki na potrzeby 8-bitowców, a jest wykonywany na PC, dla którego nawet takie "nie uproszczone" obliczenia to pikuś.

      Ale oczywiście masz rację, że można ten wzór uprościć tak jak piszesz, tylko nie wiedziałem czy zgadujesz czy jak?

      Coś nie wychodzą ci pytania retoryczne, na drugi raz pisz jaśniej, tym bardziej, że ja panie kolego zajmowałem się tym X lat temu i nie mam każdego kawałka kodu i wzoru z tamtego okresu w głowie na każde zawołanie czy pseudo pytanie retoryczne w głowie. Dlatego w dobrej wierze odpowiedziałem ci , żebyś wziął arkusz i jeszcze sobie sprawdził, bo nie miałem nawet czasu zajrzeć do kodu wyżej, a po twojej stronie sprawdzić byłoby łatwiej.



      Usuń
    2. Widzę że bardzo ciężko jest napisać "Tak, jest to samo" i dopisać taką uwagę w jednym zdaniu do tekstu, żeby następnym którzy tu trafią było prościej.

      Co do bezmyślnego przepisywania, nie wiem co Cię w tym dotknęło, dla mnie bezmyślne przepisywanie to takie w którym kopiuje się albo przepisuje kod bez zadania sobie trudu zrozumienia jak on działa. Nie trzeba długo szukać takich osób, wystarczy wejść na jakiekolwiek forum w tej tematyce w działy początkujących.

      Na jakiej podstawie uważasz, że przedstawiony kod nie może posłużyć do implementacji na AVR? Ty go wykorzystałeś jako podstawę do stworzenia własnego kodu na PC, ja go wykorzystałem do stworzenia własnego kodu na STM32, ktoś może go użyć na AVR jeśli zechce.

      Nie traktuj wszystkiego jako atak na swoją osobę, bo wychodzi jakbyś się tłumaczył, a nie masz z czego bo przecież nie zrobiłeś błędu. Przypuszczam że zamieszczając informację jak działa algorytm chciałeś właśnie wnieść walory edukacyjne do tego tekstu, a nie tylko marketingowe, właśnie po to żeby korzystająca z narzędzia osoba wiedziała jak to działa, a nie bezmyślnie(!) kopiowała tablicę powstałą przez wpisanie kilku "magicznych" wartości. Zauważyłem że można prościej, podzieliłem się tą informacją w sposób jak sam byś określił przewrotny (jak tytuł "Drgania styków ? - to BAJKI"). W zamian zostałem odesłany do arkusza (i nie wiem czy to było w dobrej wierze, mógłbym to odebrać jako złośliwe), a później oberwało mi się że jestem nierozumny i pewnie do tego chamski bo stwierdzam że ktoś może coś zrobić bezmyślnie. Warto pomagać... Pozdrawiam i życzę miłego dnia.


      Usuń
    3. Toż wyjaśniałem ci dlaczego odesłałem do arkusza a ty zaraz, że ja agresywnie ? Ludzie kochani .... eeeeh

      Usuń