Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Sterownik macierzy diod RGB na AVR

ghost666 24 Aug 2015 20:33 5913 0
phoenixcontact
  • Sterownik macierzy diod RGB na AVR
    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

    Sterownik macierzy diod RGB na AVR


    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:

    Sterownik macierzy diod RGB na AVR


    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

    Sterownik macierzy diod RGB na AVR


    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

    Sterownik macierzy diod RGB na AVR Sterownik macierzy diod RGB na AVR


    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

    Sterownik macierzy diod RGB na AVR


    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
    Log in, to see the code


    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
    Log in, to see the code


    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

    Sterownik macierzy diod RGB na AVR Sterownik macierzy diod RGB na AVR


    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

    Sterownik macierzy diod RGB na AVR


    Źródło: http://www.instructables.com/id/AVR-Dual-RGB-Matrix-Driver/?ALLSTEPS.

    Cool? Ranking DIY
    About Author
    ghost666
    Translator, editor
    Offline 
    Fizyk z wykształcenia. Po zrobieniu doktoratu i dwóch latach pracy na uczelni, przeszedł do sektora prywatnego, gdzie zajmuje się projektowaniem urządzeń elektronicznych i programowaniem. Od 2003 roku na forum Elektroda.pl, od 2008 roku członek zespołu redakcyjnego.
    ghost666 wrote 11792 posts with rating 9936, helped 157 times. Live in city Warszawa. Been with us since 2003 year.
  • phoenixcontact