Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 11 mar 2025, o 20:43


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 5 sie 2013, o 23:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Witam wszystkich
Jeśli walnę jakąś bzdurę czy coś to proszę o wybaczenie bo to mój pierwszy post na forum. :P

Na tzw. dobry początek chciałem podzielić się czymś, co zapewne było wałkowane czyli sterowaniem diodą RGB.
Otóż zapragnąłem zrobić użytek z bardzo fajnej diody RGB (3 x 3W). Oczywiście nie chodzi tu o sam PWM. Szybko odkryłem, że sterowanie jej za pomocą wartości RGB (płynne przewijanie kolorów) nie jest wygodne. Pierwsza "implementacja" zawierała tablicę ponad 100 wartości wczytywanych w FOR.
Jednak po dyskusji z kolegą okazało się, że nie warto na siłę trzymać się przestrzeni kolorów RGB i raczej podejść do tematu używając modelu HSV (HSB). Ma on trzy wartości barwę, nasycenie i jasność. Parametr barwy jest okręgiem, więc można go łatwo wpuścić w pętlę.
Przystosowałem nieco znalezioną w sieci funkcję konwertującą HSV na RGB

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Bardzo ładnie działa, ale po pewnym czasie mi sie znudziło :)
Napisałem więc proste funkcje losowych zmian kolorów, skokowych i płynnych.
Kolor skacze albo płynie w zadanych granicach HSB.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Oczywiście zamierzam docelowo usunąć _delay'e i dodać jeszcze kilka rzeczy :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2013, o 23:15 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

Bardzo ciekawy pomysł na wykorzystanie innej przestrzeni barw niż RGB - też muszę się kiedyś tym zająć ;)

ale taka uwaga do kodów. KOMPLETNIE niepotrzebnie stosujesz tu specyfikator volatile :(

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


szczególnie że są to zmienne lokalne a nie globalne - więc tak na prawdę NIGDY ten volatile nie będzie przydatny - OK ?


Autor postu otrzymał pochwałę

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2013, o 23:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Tak oczywiście masz rację. Volatile wsadziłem chyba z rozpędu :)

Zmian kolorów w RGB nie mogłem opanować i nie wiem nawet czy się da to zrobić. Jeśli zrobimy trzy zagnieżdżone pętle FOR to zewnętrzna będzie wykonywać się 655536 razy wolniej niż najbardziej wewnętrzna a kolor będzie się zmieniał bardzo powoli. Tablica też nie jest dobra, bo zabiera pamieć. Myślę, że podejście z HSB może się przydać komuś :)
Dzięki Twojej książce rozbudowałem "projekt" o uarta więc mam kontrolę nad losowanymi zakresami kolorów. A także zamierzam zrobić na ADC (super poradnik) zmianę kolorów potencjometrem :)

Michał



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2013, o 23:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sie 2012
Posty: 245
Lokalizacja: Kielce
Pomógł: 6

fajne podejście do problemu.
Czy zmienne odpowiedzialne za nasycenie, jasność, barwę - zmieniasz liniowo uzyskując wtedy ważenie liniowej zmiany kolorów?
W tradycyjnym PWMie z bezpośrednim modelem RGB trzeba było jak już mówiłeś robić tablicę.

_________________
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2013, o 23:57 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

tzn płynną regulację kolorów RGB też da radę zrobić. Nie potrzeba nawet zagnieżdżonych pętli for(). Wystarczy sobie zmieniać indeks koloru od 0 do 2 (rgb) i za każdym obiegiem pętli zwiększać indeks i+1. Gdy się zwiększy do MAX, to zmniejszać indeks i. W kolejnym obiegu zwiększyć indeks o 1 i znowu powtórzyć kroki i tak w kółko. Oczywiście traktując indeks cyklicznie. Czyli jeśli i+1 jest = 3 to ma być 0

W efekcie uzyskamy chcąc nie chcąc H z palety HSB ;) ale to jakby nie patrzeć jedno i to samo ...

------------------------ [ Dodano po: kilkunastu sekundach ]

sq8dsr napisał(a):
A także zamierzam zrobić na ADC (super poradnik) zmianę kolorów potencjometrem


To też fajny pomysł ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2013, o 00:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

]Żeby kolor płynął od czerwieni do czerwieni (maksymalna jasność i nasycenie) wystarczy zmieniać wartość H od 0 - 1530. Wartość ta jest okręgiem. Argumenty S i B dajemy na 255. Jeśli damy stałe H a zmieniać będziemy S (od 255 do 0) to jeden kolor będzie nam się rozjaśniał do białego (wartość S = 0) przy zmianie B będziemy ściemniać diody.

Tablica przy RGB była potrzebna dlatego by ustawić 150 gotowych "mieszanek" kolorów

konstrukcja:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Nic nie da bo jest hierarchiczna. RGB jest sześcianem. Najpierw będziemy jechać po kolumnie podstawy, później następny wiersz, po 256 wierszach zaczniemy robić następną warstwę więc wykonanie tych pętli to 2^24 kroków. A nie o to chodzi.

------------------------ [ Dodano po: 5 minutach ]

mirekk36 napisał(a):
W efekcie uzyskamy chcąc nie chcąc H z palety HSB ale to jakby nie patrzeć jedno i to samo ...


Tak, no fakt. W sumie to to samo bo będziemy jechać po okręgu maksymalnej jasności i nasycenia.
HSB daje za to łatwą możliwość ściemniania i regulacji nasycenia koloru. Oczywiście trzeba dokładnie dobrać prądy diod (szczególnie czerwonej, która ma znacząco mniejszy spadek napięcia), żeby biały był biały :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2013, o 05:38 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27363
Lokalizacja: Szczecin
Pomógł: 1043

sq8dsr napisał(a):
HSB daje za to łatwą możliwość ściemniania i regulacji nasycenia koloru.


No jeśli o to chodzi to tak - zdecydowanie ... przyznaję rację.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2013, o 09:20 
Offline
Użytkownik

Dołączył(a): 15 lut 2012
Posty: 344
Lokalizacja: Bydgoszcz
Pomógł: 11

Witaj sq8dsr na naszym forum ;) !

Ja bym przy okazji jeśli by była taka możliwość oczywiście ;) poprosił o pokazania jak działa twój projekcik(jakieś zdjęcia albo filmik ) bo szczerze mówiąc ciekawy jestem jak to działa na żywo ta inna przestrzeń barw niż RGB jak to Mirek ujął.

Pozdrawiam!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2013, o 12:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sie 2012
Posty: 245
Lokalizacja: Kielce
Pomógł: 6

Oczywiście dużą zaletą jest to że można samym parametrem "barwa" uzyskiwać skrajnie różne kolory (przy sterowaniu RGB trzeba by było jednocześnie operować 3 zmiennymi) ale i tak żeby płynnie, ze stałą prędkością poruszać się po krawędzi koła barw trzeba uwzględnić to że sterujemy PWMem. Więc albo zmienna "barwa" nie powinna zmieniać się liniowo albo zmienne R,G.B.

Np. jesteś na zieleni i poruszasz się liniowo w kierunku cyjanu więc kod konwertujący HSV na RGB będzie liniowo zwiększał składową zielonej a PWM i bezwładność oka spowoduje że wrażenia liniowości nie będzie.

_________________
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2013, o 13:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

MichalXY napisał(a):
Witaj sq8dsr na naszym forum ;) !

Ja bym przy okazji jeśli by była taka możliwość oczywiście ;) poprosił o pokazania jak działa twój projekcik(jakieś zdjęcia albo filmik ) bo szczerze mówiąc ciekawy jestem jak to działa na żywo ta inna przestrzeń barw niż RGB jak to Mirek ujął.

Pozdrawiam!


Witam
a proszę bardzo:
[youtube]
http://www.youtube.com/watch?v=X6nHCYbWuaI
[/youtube]

Zakresy zmian kolorów są losowane a prędkość przesuwania się w obrębie wylosowanego koloru jest dość spora.
Samej diody nie filmowałem, bo jest tak jasna, że kamera widzi tylko białą plamę.
W rzeczywistości wygląda to lepiej :)

Wojtek001 napisał(a):
Np. jesteś na zieleni i poruszasz się liniowo w kierunku cyjanu więc kod konwertujący HSV na RGB będzie liniowo zwiększał składową zielonej a PWM i bezwładność oka spowoduje że wrażenia liniowości nie będzie.


Tak owszem, choć muszę przyznać, że jest wrażenie liniowości przy przesuwaniu się po całym zakresie H. Jeden problem jest w chwili gdy kolor osiąga wartość pomarańczowo żółtą, wtedy przejście staje się bardziej gwałtowne. I tu ogólnie jest spory problem, bo oko też nie ma liniowej czułości, co więcej mózg nie każdą, matematycznie równą, różnicę między dwoma kolorami tak samo postrzega. I z tego co się zorientowałem nie jest to prosta funkcja. Dlatego tyle jest różnych metod konwersji kolorów w poligrafii.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2013, o 14:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sie 2012
Posty: 245
Lokalizacja: Kielce
Pomógł: 6

sq8dsr napisał(a):
bo oko też nie ma liniowej czułości,
No właśnie o tym mówię. Ciężko by tu było znaleźć odpowiedni wielomian jako funkcje. Zawsze można zrobić zmienną tablicową (1 wystarczy).

Nawiasem fajnie by było jakby się udało znaleźć taki wielomian - może jest jakiś program który szuka wielomianów ( mających określone wartości (ewentualnie z pewnym zaokrągleniem ) dla określonych argumentów. - to się nazywa "interpolacja wielomianowa" ;) Co więcej okazuje się że wielomian nie jest jakiś bardzo skomplikowany ,bowiem wystarczy już f(x) = ax^2.
Grunt w tym żeby początkowo szedł w górę powoli a potem b. szybko.

_________________
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2013, o 16:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Postanowiłem sobie to dzisiaj przetestować.
Wszystko OK, tylko przy wywołaniu funkcji
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

mam warning
Kod:
Multiple markers at this line
   - passing argument 6 of 'hsv_to_rgb_8_n' from incompatible pointer type
   - passing argument 5 of 'hsv_to_rgb_8_n' from incompatible pointer type
   - passing argument 4 of 'hsv_to_rgb_8_n' from incompatible pointer type


Da się coś zrobić, żeby go nie było?
I czy też ty go masz?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2013, o 21:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

xamrex napisał(a):
Da się coś zrobić, żeby go nie było?
I czy też ty go masz?


Witam
Ja mam dodatkowe zmienne red, green, blue typu uint8_t które dopiero wpisuję do rejestrów timerowych.
Możesz też zrobić jawne rzutowanie do typu uint16_t.

------------------------ [ Dodano po: 15 minutach ]

Wojtek001 napisał(a):
bowiem wystarczy już f(x) = ax^2.
Grunt w tym żeby początkowo szedł w górę powoli a potem b. szybko.


Funkcja kwadratowa raczej nie radzi bo ona na początku rośnie wolno a później strzela w górę.
Skok kolorów jest na początku około wartości 100. Trzeba by pomyśleć o czymś logarytmicznym, ale tylko w początkowym zakresie bo później niepotrzebnie spowolni.
Na filmie do którego link wkleiłem dioda zmienia kolory nie przedziale całej wartości H tylko w wylosowanym przedziale, następnie losowany jest następny przedział. Sama funkcja konwertująca działa bardzo płynnie, tak płynnie, że uznałem iż jest zbyt monotonna dlatego dodałem losowość :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2013, o 23:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sie 2012
Posty: 245
Lokalizacja: Kielce
Pomógł: 6

sq8dsr napisał(a):
Wojtek001 napisał(a):
bowiem wystarczy już f(x) = ax^2.
Grunt w tym żeby początkowo szedł w górę powoli a potem b. szybko.


Funkcja kwadratowa raczej nie radzi bo ona na początku rośnie wolno a później strzela w górę.
Skok kolorów jest na początku około wartości 100. Trzeba by pomyśleć o czymś logarytmicznym, ale tylko w początkowym zakresie bo później niepotrzebnie spowolni.
Na filmie do którego link wkleiłem dioda zmienia kolory nie przedziale całej wartości H tylko w wylosowanym przedziale, następnie losowany jest następny przedział. Sama funkcja konwertująca działa bardzo płynnie, tak płynnie, że uznałem iż jest zbyt monotonna dlatego dodałem losowość :)

No nie mogę się z tym zgodzić. Przecież PWMem ma właśnie na początku rosnąć powoli. Wiele zależy też od koloru, modelu diody ale dla zobrazowania powiem że np. przy wypełnieniu 12% mamy wrażenie ze dioda jest ustawiona na połowę jasności. (tą korektę ja bym robił już po konwersji na RGB na zmiennych R,G,B).

Apropo funkcji kwadratowej - nie jest to jakaś zaawansowana matma żeby przeciętny licealista (nawet przy dzisiejszym poziomie nauczania) tak dobrał współczynniki funkcji kwadratowej aby ta na początku rosła szybko a później powoli <-- akurat kiedyś w tym charakterze ją dokładnie wykorzystywałem w jakimś programie - wtedy musiałem jeszcze punkty wierzchołka regulować z poziomu aplikacji więc to wszystko miało jakiś tam sens, ale tak jak mówię w tym wypadku nie jest to potrzebne.
Ale wiesz może my myślimy od odwrotnej strony ;) sterujesz stanem niskim? bo to w zasadzie wszystko jedno czy na początku powoli a potem szybko czy na odwrót bo przecież wystarczy bez zaawansowanej matmy odjąć
256- f(x)
tylko trzeba tak dobrać a żeby wyniki były w przedziale <0,256>.

Logarytmy to rzeczywiście pierwsze co przychodzi na myśl ale w tym wypadku się chyba nie opłaca.

_________________
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sie 2013, o 00:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Wiesz to może faktycznie sporo zależeć od diody, ja nie używam "normalnej" diody tylko takiego potworka:
Obrazek

Ma to to 10W. Zdjęcie jest obrazem rzuconym przez soczewkę na sufit :)

Wojtek001 napisał(a):
sterujesz stanem niskim?

Nie, stanem wysokim.

Ale sprobuję jutro zobaczyć jakie będzie subiektywne odczucie wzroku przy jakich wypełnieniach PWM.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO