
Wyświetlacz matrycowy LED 8x80 - mój projekt magisterski. W ludzkiej naturze tkwi fascynacja wszelkiej maści kolorowymi, mrugającymi świecidłami, stąd też chyba popularność wyświetlaczy matrycowych. Można je spotkać zazwyczaj na dworcach, w autobusach, albo w witrynach sklepów. Od dawna chciałem zrobić coś podobnego, praca dyplomowa była idealną okazją na zmierzenie się z takim projektem i jego budową od początku do końca. Poza tym, z racji że na większości zajęć laboratoryjnych/projektowych na uczelni szczytem zaawansowania było mruganie diodami, to na dyplomie nie mogło ich zabraknąć, tym razem w większej ilości.
Ficzery:
Rozdzielczość 8x80 pikseli
Obudowa z lekkich materiałów: dibond + pleksiglas
Możliwość wyświetlania tekstu, grafiki 8x80 oraz grafiki 24x80
Dedykowany zasilacz
Pamięć mieszcząca 4095 sekwencji
Programowanie wyświetlacza przez USB i oprogramowanie PC
Matryce:
Na wyświetlacz składa się 5 małych matryc o rozdzielczości 8x16 pikseli. Matryce zbudowane są z jednostronnego laminatu 1,5mm i czerwonych diod z płaską soczewką typu water clear. Parametry diod (poza kątem rozsyłu strumienia = 120°) nie są mi znane - kupiłem takie na aukcji, bo kształt soczewki umożliwiał zabudowanie przodu pleksiglasem, do tego były w miarę tanie. Laminat miałem jednostronny, zatem od strony z diodami konieczne były przelotki z drutu srebrzonego.



Od strony druku płytka została pocynowana stopem Lichtenberga. Diody połączone są w układ matrycowy - w każdym wierszu anodami i w każdej kolumnie katodami. Takie połączenie zdeterminowane było przez zastosowane drivery kolumn (SCT2024), które mają wyjścia typu sink, czyli w stanie aktywnym ściągane do potencjału masy, natomiast przy dezaktywacji pozostają w stanie Hi-Z. Dla zwiększenia kontrastu gotowe płytki matryc zostały pomalowane czarną farbą od strony diod.
Sterowniki matrycowe:
Każdy z modułów matryc dołączany jest do swojego sterownika matrycowego. Moduły multipleksowane są względem wierszy. W roli przełącznika wierszy wykorzystałem licznik pierścieniowy 4017 napędzany sygnałem generowanym przez Timer w uC. Częstotliwość sygnału taktującego licznik fclk=1,84 kHz, zatem wyświetlacz odświezany jest z częstotliwością fref=230 Hz. Tranzystory wierszowe to mosfety IRLML2502. Wszystkie sterowniki matrycowe połączone są szeregowo, przed aktywacją kolejnego wiersza na matrycy następuje wsunięcie danych do rejestrów w driverach kolumn. Zastosowanie licznika pierścieniowego w sterowniku wydawało mi się prostszym rozwiązaniem niż np. stosowanie multiplekserów lub innej logiki. Zasadę sterowania wyświetlaczem powinien zobrazować poniższy zapis przebiegów sterujących.



Sterownik główny:
Wyświetlaczem steruje ATmega32, program napisałem w C. Na pokładzie sterownika głównego jest układ RTC zasilany supercapem, FT232 do komunikacji z komputerem i pamięć sekwencji - 8-Mbit Dataflash AT45DB081D oraz bufory 74HC125 i 74LVC125 do obsługi magistrali SPI. Sterownik posiada też wejścia z transoptorami np. do przełączania tego co jest wyświetlane sygnałami z przycisków, czujników itp. Dip switche służą do zmiany prędkości transmisji UART-u i konfiguracji ramki, złącza IDC 10-pin służą do podłączenia wtyczki programującej i podłączenia pierwszego ze sterowników matrycowych.


Zasilacz:
Zasilacz napędzany jest przez transformator TS90/8 o dwóch oddzielonych uzwojeniach wtórnych. Pozwoliło to na budowę dwóch separowanych sekcji zasilających - sekcji niestabilizowanej do zasilania logiki (stabilizator wraz z filtrami umieściłem na płytce sterownika głównego) i sekcji 5V/4A do zasilania ledów. Separacja wydała mi się rozsądnym rozwiązaniem z uwagi na impulsowy charakter pracy matrycy. Sekcja prądowa zasilający LEDy zbudowana została na 7805 i tranzystorach TIP42C - aplikację zaczerpnąłem wprost z dokumentacji stabilizatora dobierając jedynie rezystory dla uzyskania odpowiedniego ograniczenia prądowego. Tranzystor wykonawczy i stabilizator umieściłem na wspólnym radiatorze, który chłodzony jest przez wentylator. Nastawę obrotów wentylatora reguluje prosty sterownik PWM na ATtiny13A. Czujnik temperatury to LM35, który został wciśnięty między żeberka radiatora. Sekcję prądową zasilacza można zewrzeć, a dzięki wymuszonemu chłodzeniu radiator nie nagrzewa się powyżej 65 °C. Zasilacz umieściłem w obudowie po zasilaczu ATX.



Oprogramowanie:
Program do obsługi wyświetlacza o roboczej nazwie LEDMatrixDisp powstał w Visual C# 2010 Express Edition. Składa się on z 3 części: generatora czcionek, konfiguratora parametrów transmisji/ustawień wyświetlacza oraz sekcji do definicji i wgrywania sekwencji wyświetlanego programu. Generator czcionek umożliwia definiowanie zestawu znaków ASCII + polskich znaków diakrytycznych (ą,ę itp) i generowania pliku *.h z czcionką dołączanego przy kompilacji programu. Znaki w zakresie 0x00-0x7F to standardowe ASCII, natomiast do zapisu polskich znaków wykorzystywanych jest kilka kolejnych wartości spoza zakresu standardowego ASCII, z wykorzystaniem najstarszego bitu. Pliki z czcionkami można wczytać w celu edycji. Każdy znak ma rozdzielczość 5x8 kropek - taki sam jak rozmiar znaków w wyświetlaczach alfanumerycznych LCD.



Konfigurator parametrów umożliwia aktualizację daty/godziny w układzie RTC wyświetlacza na podstawie czasu systemowego i służy do definicji parametrów transmisji i jej testu. Ostatnia część programu LEDMatrixDisp odpowiedzialna jest za definicje i wgrywanie sekwencji programu. Profile sekwencji można eksportować i importować do/z pliku tekstowego z rozszerzeniem *.sek.


Sekwencje graficzne tworzy się importując monochromatyczne mapy bitowe, które można narysować chociażby w Paincie. Pamięć AT45DB081D wspiera 3 poziomy organizacji zawartości: na sektory, bloki i na strony. Ja wykorzystuję tylko ostatni stopień podziału. Stron jest łącznie 4096, każda w rozmiarze 264 bajtów. Pierwsza strona przechowuje ustawienia wyświetlacza i liczbę zapisanych sekwencji programu tak, by nie trzeba było kasować całej pamięci przed wgraniem nowych sekwencji. Sekwencje są nadpisywane, a sterownik sam wie do której strony w pamięci ma odczytywać program. W każdej ze stron sekwencji początkowe sześć bajtów również pełni rolę konfiguracyjną – określają parametry danej sekwencji np. jej typ, numer czcionki, jasność itp. Bajty 8-263 przeznaczone są na zapis zawartości sekwencji (np. kodów ASCII wyświetlanego napisu bądź bajtów sekwencji graficznej, z których składany jest obraz do wyświetlenia). Z uwagi na pionową rozdzielczość matrycy wynoszącą 8 px każdy bajt z pamięci przechowuje piksele sekwencji graficznej dla jednej kolumny w matrycy.
Inne:
Z racji tego, że w matrycy siedzi 640 diod, a do każdej wymagana była przelotka od strony LEDów z drutu srebrzonego, to w samych matrycach trzeba było wywiercić około 2,5 tys. otworów. Aby nie mordować się trzymając wiertarkę w ręce powstał na tę okazję statyw do wiercenia zbudowany z żelaznej blachy grubości około 2 cm, wspawanych w nią dwóch stalowych prowadnic z karetkami, które kiedyś kupiłem na aukcji, kilku dm^2 blachy aluminiowej, uchwytu do rur oraz kawałka płyty wiórowej. Sprężyny umieszczone na prowadnicach pochodzą ze starych odsysaczy do cyny. Prowadnice dla lepszego posuwu karetek smarowałem olejem do smażenia. Do wiercenia używałem przedłużki ze spiralą z uwagi na mniejszy ciężar w stosunku do wiertarki. Wszystkie otwory na matrycy zrobiłem jednym wiertłem HSS fi 0,7 mm, co jakiś czas ostrząc je pod mikroskopem. Płytki były robione domowym sposobem, w roli soldermaski wykorzystałem termoutwardzalną farbę do szkła i ceramiki.

Planowałem wyposażyć wyświetlacz w dodatkowy moduł z czujnikiem światła, żeby możliwa była automatyczna regulacja jasności matrycy w zależności od warunków oświetleniowych, niestety nie starczyło mi już na to czasu. Do wgrywania sekwencji wyświetlania albo aktualizacji firmware'u wyświetlacz z komputerem trzeba połączyć przewodem rs232 z wtykami db9, dołaczanego do małej przelotki na usb.


W ramach badań pobawiłem się trochę sprzętem do fotometrii. Wyznaczyłem m.in. krzywą rozkładu luminancji powierzchni świecącej w funkcji kąta obserwacji i luminancję poszczególnych modułów w matrycy. Początkowo żadnych różnic w jasności świecenia pomiędzy poszczególnymi modułami matrycowymi nie widziałem, niemniej siła autosugestii po obejrzeniu wyników pomiarów pozwala przy słabym oświetleniu i małym wypełnieniu sygnału aktywującego dostrzec, że drugi moduł świeci nieco słabiej. Ma to zapewne związek z tolerancją wartości prądu wyjściowego zastosowanych sterowników, albo tolerancją rezystorów nastawczych.
Obecnie wartość prądu forsującego diody ustawiłem na if=30 mA, co przy załączeniu wszystkich pikseli i maksymalnej jasności przekłada się na pobór z sieci mocy P=33 W.





Cool? Ranking DIY