Pomysł stworzenia tej konstrukcji narodził się, gdy przyjaciel autora tego układu wymyślił pewien projekt. Chciał on, aby zestaw serwomotorów naśladował ruchy rąk użytkownika. Na serwach miały być zamontowane lasery, co umożliwiało by tworzenie efektownych pokazów. Plany odrobinę się zmieniły i zamiast laserów na serwach postanowiono zamontować matryce diod RGB. Początkowy plan zakładał sterowanie pojedynczej matrycy z wykorzystaniem Rainbowduino, jednakże rozwiązanie to nie działało zbyt dobrze, dlatego też powstał ten układ, dedykowany do sterowania matrycą diod RGB. Autor oparł projekt o układ ATmega328P, taki sam jak jest w Rainbowduino, ale jemu udało się wysterować aż dwie matryce z jednego mikrokontrolera.
Krok 1: Części i narzędzia
Jak zawsze, przed przystąpieniem do budowy układu trzeba zebrać pewne elementy. Dobrze jest dwa razy sprawdzić czy wszystko mamy, zanim zaczniemy składać system.
Potrzebujemy:
ATmega328p - 8 bitowy mikrokontroler
2 x Matryce RGB
4 x Złącze 16 pin żeńskie
1 x Złącze 3 pin żeńskie
2 x Złącze 3 pin męskie
6 x TLC5916 - źródła prądowe do sterowania LED
HEF4094 - 8 bitowy rejestr zatrzaskujący SIPO
8 x NTD2955 - MOSFET z kanałem P
8 x BS270 - MOSFET z kanałem N
9 x Kondensator 0,1 ?F
2 x Kondensator 10 ?F - jeżeli układ ma problemy z zasilaniem
2 x Kondensator 22 pF
Rezonator kwarcowy 16 MHz
17 x Rezystor 10 k?
4 x Rezystor 4,7 k?
2 x Rezystor 2,67 k? - można złożyć go z 2,2 k? + 470 ?
2 x Rezystor 680 ?
Niewielki przycisk chwilowy, normalnie rozwarty
Płytki uniwersalne
Kabelki do połączenia wszystkiego - o większej i mniejszej średnicy, dobranej do płynącego prądu.
Narzędzia:
Komputer - do zaprogramowania układów
Programator AVR - jak wyżej
Lutownica
Krok 2: Zrozumieć jak działa multipleksowanie matrycy LED
Multipleksowanie LEDów może być dosyć problematyczne. W projekcie wykorzystano diody RGB, najprościej jest wyobrazić je sobie jako trzy osobne diody w jednej obudowie. Macierz 8x8 takich diod, to 192 osobne diody LED w jednej macierzy. Pomimo tego, że macierz ma 32 wyprowadzenia, nadal możliwe jest kontrolowanie koloru i jasności każdej diody osobno. Poniżej pokazano schemat wykorzystanej macierzy:
Jak łatwo zauważyć każdy rządek ma wspólną anodę, a każda kolumna (jednokolorowych LEDów) wspólną katodę. Aby zapalić pojedynczą diodę LED w układzie, potrzebne jest trochę niskopoziomowego multipleksowania. Istnieje osiem rzędów wspólnych anod, więc każdy rząd będzie wysterowany jedynie przez 1/8 czasu działania systemu. Sztuczka polega na przełączaniu się pomiędzy rzędami tak szybko, aby nie było to dostrzegalne dla ludzkiego oka. W ten sposób w danym momencie aktywny jest tylko jeden rząd diod. Wraz z przełączaniem się na kolejne rzędy diod, nowe wartości dla poszczególnych katod muszą być dostarczane do driverów.
Karta katalogowa matrycy diodowej wykorzystanej w opisywanym projekcie może być pobrana stąd.
Krok 3: Określenie gdzie jest pin 1 macierzy
Okazało się, że macierz nie ma oznaczonego pierwszego pinu na obudowie, ani nie wiadomo jak numerowane są piny. Jedyną możliwością, aby dowiedzieć się co gdzie jest, jest zbadanie poszczególnych pinów z pomocą niewielkiego napięcia i sprawdzanie która dioda będzie się zapalać. Wystarczy sprawdzić kilka pinów, aby dostrzec wzór. Autor skorzystał z schematu pokazanego powyżej i spróbował zapalić pojedynczą diodę. Jeśli do pinu 17 przyłożymy minus, a do pinu 1 plus, wtedy niebieska dioda w pierwszym rzędzie i w pierwszej kolumnie powinna się zapalić. Pamiętajcie, aby nie podłączać do układu bezpośrednio napięcia z np. 9 V baterii. Powinno podłączyć się je przez rezystor ograniczający prąd (ok 10 k?).
Jeśli numeracja wyprowadzeń jest podobna, jak w układach scalonych, to piny 1 i 17 powinny być na przeciwległych rogach. Pozwoli nam to łatwo odcyfrować ułożenie pinów. Pamiętajcie że po odnalezieniu, dobrze jest zaznaczyć pin pierwszy na obudowie.
Krok 4: Projekt układu
Zrozumienie podstaw multipleksowania LEDów w opisywanym układzie, pozwala nam przejść krok dalej, do projektu układu. Sercem urządzenia jest ATmega328P, taktowana zewnętrznym oscylatorem 16 MHz. Układ ten kontrolować będzie poszczególne pakiety diod. Jako że prąd diod jest o wiele większy niż maksymalny dopuszczalny prąd wyjściowy, na portach mikrokontrolera, konieczne jest dodanie MOSFETów sterujących LEDami.
W pierwszym prototypie tranzystory FET sterowane były bezpośrednio z mikrokontrolera, ale autor postanowił dodać do układu 8 bitowy rejestr przesuwny, co pozwoliło 'zaoszczędzić' linie wyjściowe układu. Sterowanie diodami po stronie ujemnej zajmują się ośmiokanałowe scalone drivery. Dla dwóch matryc potrzebne są 3 układy - po jednym na każdy kolor LEDów.
Dodatkowo, jak widać na schemacie, układ wyposażono w interfejs I?C. Służy on do zewnętrznej kontroli tego co jest wyświetlane i kontroli innych parametrów. Dodatkowo, mimo że nie pokazano tego na schemacie, dobrze jest wyprowadzić z mikrokontrolera sygnały odpowiedzialne za interfejs ISP, w celu zaprogramowania układu.
Jedyne wartości, które być może będzie trzeba zmienić, adaptując układ do swoich potrzeb, są zewnętrzne oporniki dla układów TLC5916 sterujących diodami. Są one zależne od prądów diod, poniżej znajduje się opis jak je dobrać.
Schemat stworzony w programie Cadsoft Eagle pobrać można stąd. Umieszczono w nim także linie do kontrolowania serwomechanizmu. Nie są one potrzebne w tym projekcie.
Krok 5: Balans bieli w diodzie RGB
Na każdym driverze diody znajduje się pin R-EXT. Rezystor, który się tam podłącza kontroluje prąd diody, ale nie musimy martwić się o jego moc, gdyż sam prąd tamtędy nie płynie. Zgodnie z kartą katalogową drivera (patrz poniżej) prąd diody równy jest (1,25 V / R-Ext)*15. Oczywiście można tym sterować programowo, poprzez linie kontrolne układu, jednakże wygodniej jest skonfigurować driver odpowiednią rezystancją R-Ext.
Autor prądy diod zbalansował "na oko", tak aby efekt sumowania wszystkich kolorów był możliwie zbliżony do białego. Sprawdzono różne inne kombinacje kolorów:
Czerwony + zielony + niebieski = biały,
Czerwony + zielony = żółty,
Czerwony + niebieski = magenta,
Zielony + niebieski = cyjan.
Jeśli wszystkie diody sterowane będą takim samym prądem, kolory nie będą się zgadzały. Wynika to z różnej jasności poszczególnych LEDów w układzie.
Karta katalogowa wybranego drivera LED znajduje się tutaj.
Krok 6: Balansowanie kolorów
W wykorzystanej matrycy najmocniej świeciły niebieskie diody. Czerwone były słabsze niż zielone, a potrzebowaliśmy więcej czerwieni od zieleni, aby utrzymać odpowiedni balans bieli. Dlatego też prąd najmocniej ograniczamy dla diody niebieskiej. Schemat postępowania autora rozpoczął się od ustalenia największej rezystancji dla diod niebieskich - 10 k?. Połowę tego dla diod zielonych i około 1/10 rezystancji dla niebieskiego na czerwone. Teraz po załączeniu drivera można podziwiać efekty. Najpierw sprawdzamy kolor biały, potem poszczególne kombinacje barw. Jeśli w mieszaninie światła jest za dużo jakiegoś koloru, zwiększamy rezystancję, jeśli za mało to zmniejszamy. Powtarzamy 'strojenie' aż jesteśmy zadowoleni z kolorów, ew. prosimy kogoś o opinię. Następnie zmniejszamy rezystancje (po równo) dla wszystkich oporników, co zwiększa nam jasność całej macierzy.
Autor dobrał następujące oporniki:
Czerwony: 680 ? - I_LED = 1,25 V / 680 ? * 15 = 28 mA
Zielony: 2,67 k? - I_LED = 1,25 V / 2,67 k? * 15 = 7 mA
Niebieski: 4,7 k? - I_LED = 1,25 V / 4,7 k? * 15 = 4 mA
Krok 7: Aktualizacja Fuse Bitów w AVR
Aby sterować taką ilością LEDów, nasz mikrokontroler potrzebuje duży cykli zegara - oznacza to, że trzeba zmienić domyślne fuse bity AVRa, kontrolujące źródło zegara. ATmega328P skonfigurowana jest fabrycznie do pracy z wewnętrznym oscylatorem, który jest dzielony do 1 MHz. Autor zdecydował się na zmianę taktowania na 16 MHz z wykorzystaniem zewnętrznego kwarcu. Podczas tego etapu trzeba być ostrożnym. Jakkolwiek jest to dosyć prosta kwestia, to także najprostsza metoda na uszkodzenie układu. Przed zaprogramowaniem wartości bitów sprawdzać trzeba dwa razy!
Do zaprogramowania fuse bitów autor tej konstrukcji rekomenduje avrdude, więc jeśli go nie mamy musimy zainstalować: AVR-GCC i avrdude. Korzystając z kalkulatora wyliczamy wartość do zaprogramowania na 0xE7 i piszemy w wierszu poleceń (zakładając, że mamy taki sam programator jak autor):
[code:1]> avrdude -p atmega328p -c usbtiny -P usb -U lfuse:w:0xe7:m[/code:1]
Poprawne zaprogramowanie bitów konfiguracyjnych powinno zakończyć się komunikatem. Możemy zawsze zweryfikować zapisaną wartość z pomocą komendy:
[code:1]> avrdude -p atmega328p -c usbtiny -P usb -V[/code:1]
Krok 8: Oprogramowanie - część 1: koncepcja
Biblioteki dostępne na GitHubie (patrz tutaj) definiują funkcje w pubnub/pubnub.h. Zanim zajmiemy się analizą kodu, musimy zrozumieć ogólne założenia programu. Po inicjalizacji AVRa główna pętla programu odpowiedzialna jest tylko za sekwencyjne sterowanie LEDami w macierzach. Wszystko inne, dzieje się w funkcjch obsługujących przerwania. Główna pętla programu wykorzystuje 8 bitowy timer/licznik do pilnowania czy jest czas na włączenie kolejnych LEDów. To jakie LEDy mają być załączone i jaka ma być ich intensywność, zapisane jest w dwóch wielowymiarowych tabelach:
Macierz LEDów składa się z 2 x 8 x 3 bajtów - jeden bajt na każdy rząd kolorów w każdej kolumnie w każdej macierzy. Każdy bit w tym bajcie reprezentuje jeden LED w każdym z rzędów. Macierz kolorów ma wymiar 2 x 8 x 8 bajtów - każdy bajt reprezentuje kolor jednego LEDa w jednej z macierzy.
Aby starczyło nam czasu na kontrolę nad oboma macierzami wykorzystana jest 4 bitowa rozdzielczość. Może się to wydawać niewiele, w porównaniu z 255 kolorami np. w komputerze ale 4 x 4 x 4 = 64 - więc nie tak wcale mało kolorów.
Następnie zobaczmy jak kolory są generowane przez Timer 0.
Krok 9: Oprogramowanie - część 2: tworzenie kolorów
Jak napisano powyżej jeden 8 bitowy timer wykorzystany jest do kontroli wszystkich kolorów LEDów. Przy każdym uruchomieniu się komparatora timera flaga ISR sygnalizuje zdarzenie timera. Rozdzielczość 4 implikuje 4 dostępne wartości: 0, 1, 2 i 3. Zmienna wykorzystana jest do zliczania, które aktualnie zdarzenie ISR nastąpiło. Kiedy licznik równy jest maksymalnej rozdzielczości, nic się nie dzieje- wszystkie załączone LEDy pozostają załączone,a te wyłączone wyłączone. Przy liczniku równym 0 następuje moment przełączenia kontroli na następne 8 kolumn macierzy. Wszystkie diody są ustawiane do włączenia, ale nie są załączane.
W ostatnim kroku pętla iteruje po wszystkich diodach RGB w aktywnej kolumnie w obu macierzach. Jeśli w danym momencie licznik równy jest do czasu wyłączenia którejś z diod - R, G lub B - LED jest wyłączany. Następnie dane przesyłane są do driverów diod.
Krok 10: Oprogramowanie - część 3: działanie drivera
Tak jak napisano we wstępie, sterownik ten jest częścią większego projektu. Jest on kontrolowany poprzez I?C przez inny układ. Aktualny program umieszcza na macierzach uśmiechnięte minki, jako domyślne obrazki i czeka na informacje od zarządzającego układu. Transmisja Po I?C realizowana jest w przerwaniu.
Krok 11: budowa układu
Autor rekomenduje budowę układu na płytce stykowej i testowanie programu przed złożeniem finalnego urządzenia. Docelowo układ powinien być zlutowany np. na płytce uniwersalnej. Testowanie na płytce stykowej jest o tyle pomocne, że może okazać się że w naszym systemie ukłąd działa lepiej w odrobinę innej konfiguracji niż w zaprezentowanym tutaj projekcie.
Krok 12: Obudowa i gotowy układ
Źródło: http://www.instructables.com/id/AVR-Dual-RGB-Matrix-Driver/?ALLSTEPS.
Krok 1: Części i narzędzia
Jak zawsze, przed przystąpieniem do budowy układu trzeba zebrać pewne elementy. Dobrze jest dwa razy sprawdzić czy wszystko mamy, zanim zaczniemy składać system.
Potrzebujemy:
ATmega328p - 8 bitowy mikrokontroler
2 x Matryce RGB
4 x Złącze 16 pin żeńskie
1 x Złącze 3 pin żeńskie
2 x Złącze 3 pin męskie
6 x TLC5916 - źródła prądowe do sterowania LED
HEF4094 - 8 bitowy rejestr zatrzaskujący SIPO
8 x NTD2955 - MOSFET z kanałem P
8 x BS270 - MOSFET z kanałem N
9 x Kondensator 0,1 ?F
2 x Kondensator 10 ?F - jeżeli układ ma problemy z zasilaniem
2 x Kondensator 22 pF
Rezonator kwarcowy 16 MHz
17 x Rezystor 10 k?
4 x Rezystor 4,7 k?
2 x Rezystor 2,67 k? - można złożyć go z 2,2 k? + 470 ?
2 x Rezystor 680 ?
Niewielki przycisk chwilowy, normalnie rozwarty
Płytki uniwersalne
Kabelki do połączenia wszystkiego - o większej i mniejszej średnicy, dobranej do płynącego prądu.
Narzędzia:
Komputer - do zaprogramowania układów
Programator AVR - jak wyżej
Lutownica
Krok 2: Zrozumieć jak działa multipleksowanie matrycy LED
Multipleksowanie LEDów może być dosyć problematyczne. W projekcie wykorzystano diody RGB, najprościej jest wyobrazić je sobie jako trzy osobne diody w jednej obudowie. Macierz 8x8 takich diod, to 192 osobne diody LED w jednej macierzy. Pomimo tego, że macierz ma 32 wyprowadzenia, nadal możliwe jest kontrolowanie koloru i jasności każdej diody osobno. Poniżej pokazano schemat wykorzystanej macierzy:
Jak łatwo zauważyć każdy rządek ma wspólną anodę, a każda kolumna (jednokolorowych LEDów) wspólną katodę. Aby zapalić pojedynczą diodę LED w układzie, potrzebne jest trochę niskopoziomowego multipleksowania. Istnieje osiem rzędów wspólnych anod, więc każdy rząd będzie wysterowany jedynie przez 1/8 czasu działania systemu. Sztuczka polega na przełączaniu się pomiędzy rzędami tak szybko, aby nie było to dostrzegalne dla ludzkiego oka. W ten sposób w danym momencie aktywny jest tylko jeden rząd diod. Wraz z przełączaniem się na kolejne rzędy diod, nowe wartości dla poszczególnych katod muszą być dostarczane do driverów.
Karta katalogowa matrycy diodowej wykorzystanej w opisywanym projekcie może być pobrana stąd.
Krok 3: Określenie gdzie jest pin 1 macierzy
Okazało się, że macierz nie ma oznaczonego pierwszego pinu na obudowie, ani nie wiadomo jak numerowane są piny. Jedyną możliwością, aby dowiedzieć się co gdzie jest, jest zbadanie poszczególnych pinów z pomocą niewielkiego napięcia i sprawdzanie która dioda będzie się zapalać. Wystarczy sprawdzić kilka pinów, aby dostrzec wzór. Autor skorzystał z schematu pokazanego powyżej i spróbował zapalić pojedynczą diodę. Jeśli do pinu 17 przyłożymy minus, a do pinu 1 plus, wtedy niebieska dioda w pierwszym rzędzie i w pierwszej kolumnie powinna się zapalić. Pamiętajcie, aby nie podłączać do układu bezpośrednio napięcia z np. 9 V baterii. Powinno podłączyć się je przez rezystor ograniczający prąd (ok 10 k?).
Jeśli numeracja wyprowadzeń jest podobna, jak w układach scalonych, to piny 1 i 17 powinny być na przeciwległych rogach. Pozwoli nam to łatwo odcyfrować ułożenie pinów. Pamiętajcie że po odnalezieniu, dobrze jest zaznaczyć pin pierwszy na obudowie.
Krok 4: Projekt układu
Zrozumienie podstaw multipleksowania LEDów w opisywanym układzie, pozwala nam przejść krok dalej, do projektu układu. Sercem urządzenia jest ATmega328P, taktowana zewnętrznym oscylatorem 16 MHz. Układ ten kontrolować będzie poszczególne pakiety diod. Jako że prąd diod jest o wiele większy niż maksymalny dopuszczalny prąd wyjściowy, na portach mikrokontrolera, konieczne jest dodanie MOSFETów sterujących LEDami.
W pierwszym prototypie tranzystory FET sterowane były bezpośrednio z mikrokontrolera, ale autor postanowił dodać do układu 8 bitowy rejestr przesuwny, co pozwoliło 'zaoszczędzić' linie wyjściowe układu. Sterowanie diodami po stronie ujemnej zajmują się ośmiokanałowe scalone drivery. Dla dwóch matryc potrzebne są 3 układy - po jednym na każdy kolor LEDów.
Dodatkowo, jak widać na schemacie, układ wyposażono w interfejs I?C. Służy on do zewnętrznej kontroli tego co jest wyświetlane i kontroli innych parametrów. Dodatkowo, mimo że nie pokazano tego na schemacie, dobrze jest wyprowadzić z mikrokontrolera sygnały odpowiedzialne za interfejs ISP, w celu zaprogramowania układu.
Jedyne wartości, które być może będzie trzeba zmienić, adaptując układ do swoich potrzeb, są zewnętrzne oporniki dla układów TLC5916 sterujących diodami. Są one zależne od prądów diod, poniżej znajduje się opis jak je dobrać.
Schemat stworzony w programie Cadsoft Eagle pobrać można stąd. Umieszczono w nim także linie do kontrolowania serwomechanizmu. Nie są one potrzebne w tym projekcie.
Krok 5: Balans bieli w diodzie RGB
Na każdym driverze diody znajduje się pin R-EXT. Rezystor, który się tam podłącza kontroluje prąd diody, ale nie musimy martwić się o jego moc, gdyż sam prąd tamtędy nie płynie. Zgodnie z kartą katalogową drivera (patrz poniżej) prąd diody równy jest (1,25 V / R-Ext)*15. Oczywiście można tym sterować programowo, poprzez linie kontrolne układu, jednakże wygodniej jest skonfigurować driver odpowiednią rezystancją R-Ext.
Autor prądy diod zbalansował "na oko", tak aby efekt sumowania wszystkich kolorów był możliwie zbliżony do białego. Sprawdzono różne inne kombinacje kolorów:
Czerwony + zielony + niebieski = biały,
Czerwony + zielony = żółty,
Czerwony + niebieski = magenta,
Zielony + niebieski = cyjan.
Jeśli wszystkie diody sterowane będą takim samym prądem, kolory nie będą się zgadzały. Wynika to z różnej jasności poszczególnych LEDów w układzie.
Karta katalogowa wybranego drivera LED znajduje się tutaj.
Krok 6: Balansowanie kolorów
W wykorzystanej matrycy najmocniej świeciły niebieskie diody. Czerwone były słabsze niż zielone, a potrzebowaliśmy więcej czerwieni od zieleni, aby utrzymać odpowiedni balans bieli. Dlatego też prąd najmocniej ograniczamy dla diody niebieskiej. Schemat postępowania autora rozpoczął się od ustalenia największej rezystancji dla diod niebieskich - 10 k?. Połowę tego dla diod zielonych i około 1/10 rezystancji dla niebieskiego na czerwone. Teraz po załączeniu drivera można podziwiać efekty. Najpierw sprawdzamy kolor biały, potem poszczególne kombinacje barw. Jeśli w mieszaninie światła jest za dużo jakiegoś koloru, zwiększamy rezystancję, jeśli za mało to zmniejszamy. Powtarzamy 'strojenie' aż jesteśmy zadowoleni z kolorów, ew. prosimy kogoś o opinię. Następnie zmniejszamy rezystancje (po równo) dla wszystkich oporników, co zwiększa nam jasność całej macierzy.
Autor dobrał następujące oporniki:
Czerwony: 680 ? - I_LED = 1,25 V / 680 ? * 15 = 28 mA
Zielony: 2,67 k? - I_LED = 1,25 V / 2,67 k? * 15 = 7 mA
Niebieski: 4,7 k? - I_LED = 1,25 V / 4,7 k? * 15 = 4 mA
Krok 7: Aktualizacja Fuse Bitów w AVR
Aby sterować taką ilością LEDów, nasz mikrokontroler potrzebuje duży cykli zegara - oznacza to, że trzeba zmienić domyślne fuse bity AVRa, kontrolujące źródło zegara. ATmega328P skonfigurowana jest fabrycznie do pracy z wewnętrznym oscylatorem, który jest dzielony do 1 MHz. Autor zdecydował się na zmianę taktowania na 16 MHz z wykorzystaniem zewnętrznego kwarcu. Podczas tego etapu trzeba być ostrożnym. Jakkolwiek jest to dosyć prosta kwestia, to także najprostsza metoda na uszkodzenie układu. Przed zaprogramowaniem wartości bitów sprawdzać trzeba dwa razy!
Do zaprogramowania fuse bitów autor tej konstrukcji rekomenduje avrdude, więc jeśli go nie mamy musimy zainstalować: AVR-GCC i avrdude. Korzystając z kalkulatora wyliczamy wartość do zaprogramowania na 0xE7 i piszemy w wierszu poleceń (zakładając, że mamy taki sam programator jak autor):
[code:1]> avrdude -p atmega328p -c usbtiny -P usb -U lfuse:w:0xe7:m[/code:1]
Poprawne zaprogramowanie bitów konfiguracyjnych powinno zakończyć się komunikatem. Możemy zawsze zweryfikować zapisaną wartość z pomocą komendy:
[code:1]> avrdude -p atmega328p -c usbtiny -P usb -V[/code:1]
Krok 8: Oprogramowanie - część 1: koncepcja
Biblioteki dostępne na GitHubie (patrz tutaj) definiują funkcje w pubnub/pubnub.h. Zanim zajmiemy się analizą kodu, musimy zrozumieć ogólne założenia programu. Po inicjalizacji AVRa główna pętla programu odpowiedzialna jest tylko za sekwencyjne sterowanie LEDami w macierzach. Wszystko inne, dzieje się w funkcjch obsługujących przerwania. Główna pętla programu wykorzystuje 8 bitowy timer/licznik do pilnowania czy jest czas na włączenie kolejnych LEDów. To jakie LEDy mają być załączone i jaka ma być ich intensywność, zapisane jest w dwóch wielowymiarowych tabelach:
Code: c
Macierz LEDów składa się z 2 x 8 x 3 bajtów - jeden bajt na każdy rząd kolorów w każdej kolumnie w każdej macierzy. Każdy bit w tym bajcie reprezentuje jeden LED w każdym z rzędów. Macierz kolorów ma wymiar 2 x 8 x 8 bajtów - każdy bajt reprezentuje kolor jednego LEDa w jednej z macierzy.
Aby starczyło nam czasu na kontrolę nad oboma macierzami wykorzystana jest 4 bitowa rozdzielczość. Może się to wydawać niewiele, w porównaniu z 255 kolorami np. w komputerze ale 4 x 4 x 4 = 64 - więc nie tak wcale mało kolorów.
Następnie zobaczmy jak kolory są generowane przez Timer 0.
Krok 9: Oprogramowanie - część 2: tworzenie kolorów
Jak napisano powyżej jeden 8 bitowy timer wykorzystany jest do kontroli wszystkich kolorów LEDów. Przy każdym uruchomieniu się komparatora timera flaga ISR sygnalizuje zdarzenie timera. Rozdzielczość 4 implikuje 4 dostępne wartości: 0, 1, 2 i 3. Zmienna wykorzystana jest do zliczania, które aktualnie zdarzenie ISR nastąpiło. Kiedy licznik równy jest maksymalnej rozdzielczości, nic się nie dzieje- wszystkie załączone LEDy pozostają załączone,a te wyłączone wyłączone. Przy liczniku równym 0 następuje moment przełączenia kontroli na następne 8 kolumn macierzy. Wszystkie diody są ustawiane do włączenia, ale nie są załączane.
W ostatnim kroku pętla iteruje po wszystkich diodach RGB w aktywnej kolumnie w obu macierzach. Jeśli w danym momencie licznik równy jest do czasu wyłączenia którejś z diod - R, G lub B - LED jest wyłączany. Następnie dane przesyłane są do driverów diod.
Code: c
Krok 10: Oprogramowanie - część 3: działanie drivera
Tak jak napisano we wstępie, sterownik ten jest częścią większego projektu. Jest on kontrolowany poprzez I?C przez inny układ. Aktualny program umieszcza na macierzach uśmiechnięte minki, jako domyślne obrazki i czeka na informacje od zarządzającego układu. Transmisja Po I?C realizowana jest w przerwaniu.
Krok 11: budowa układu
Autor rekomenduje budowę układu na płytce stykowej i testowanie programu przed złożeniem finalnego urządzenia. Docelowo układ powinien być zlutowany np. na płytce uniwersalnej. Testowanie na płytce stykowej jest o tyle pomocne, że może okazać się że w naszym systemie ukłąd działa lepiej w odrobinę innej konfiguracji niż w zaprezentowanym tutaj projekcie.
Krok 12: Obudowa i gotowy układ
Źródło: http://www.instructables.com/id/AVR-Dual-RGB-Matrix-Driver/?ALLSTEPS.
Cool? Ranking DIY