
Witam, chciałbym wszystkim przedstawić projekt sterownika matrycowego wyświetlacza LED. Na początek proszę tylko o nie ocenianie wykonania płytki (na płytce uniwersalnej/pająk) bo jestem świadomy jak ona wygląda i jak ją wykonałem.
Historia
Pomysł projektu narodził się, gdy jakieś pół roku temu nabyłem od Kolegi assembler z forum matrycę LED o rozmiarach 8*48 pikseli (w rzeczywistości to 2 moduły 8*24 połączone razem). Matryca posiadała już zamontowane sterowniki kolumn na układach 74HC595, a także miejsce na zamontowanie u dołu płytki procesora ATMega8 lub kompatybilnego pinowo, dekodera do wierszy oraz tranzystorów mocy i... na tym koniec. Nie wystarczało to do realizacji mojego minimum, które założyłem, czyli punkt następny:
Założenia
Założeniami projektu było:
1. Wykorzystanie zakupionej matrycy LED
2. Wykonanie sterownika w oparciu o mikrokontroler z rodziny AVR
3. Sterownik powinien zawierać:
a. kompletny moduł zasilania oraz sterowania wierszami, wyprowadzenia do połączenia już gotowych sterowników kolumn
b. zegar czasu rzeczywistego
c. termometr
d. pamięć nieulotną EEPROM do przechowywania tekstów i "programu animacji"
e. możliwość programowania "animacji" przez UART/RS232 z komputera
f.* możliwość alternatywnego programowania z klawiatury matrycowej 4*4
4. Wykorzystanie części walających się po pudełeczkach, a nie potrzebnych do czego innego
5. Przede wszystkim podszlifowanie C, z mniejszą dbałością o estetykę płytki i minimalizacja kosztów wykonania (stąd wykonanie całości na płytkach uniwersalnych)
*podpunkt f. nie został zrealizowany z powodu braku pamięci flash procesora po zrealizowaniu wcześniejszych założeń.
Opis
Cały projekt składa się z 3 części: matrycy, części "wysokonapięciowej" sterownika oraz części logicznej sterownika - kontrolera
Matryca

Matryca to wspomniana przeze mnie wcześniej matryca zakupiona od Kolegi z forum.
Wymiary: 8*48 pikseli, 490*120mm
Kontroler kolumn: 6 układów 74HC595 połączonych szeregowo, ze wspólnym wyprowadzeniem "Latch Enable"
Zalecane napięcie zasilania diod (impulsowo): 7,5V
Miejsce na podstawowy system sterowania - nie wykorzystane - zamiast tego wyprowadzenie złącz do sterownika kolumn i do wierszy
Sterownik - część "wysokonapięciowa"

Sterownik ze względu na miejsce na płytkach uniwersalnych i względy czysto logiczne podzieliłem na 2 części na osobnych płytkach. Pierwszą z nich jest część zawierająca:
Stabilizator napięcia: 7805 - do zasilania 2 płytki i układów 74HC595 - napięcie zasilania całej płytki to 7,5V podawane bezpośrednio na kolektory tranzystorów, stąd za ukłądem 7805 otrzymujemy napięcie nieco niższe niż 5,0V, ale w pełni wystarcza ono do poprawnej pracy całości
Złącze zasilania: kostka ARK i goldpiny do zasilacza
Driver wierszy: 74HC595 wpięty szeregowo ze złączem do podłączenia driverów kolumn na matrycy - dzięki temu całą matrycą sterujemy tylko 4 pinami procesora
Tranzystory do wysterowania wierszy (8 sztuk): BD679A
Złącza: do podłączenia driverów kolumn, złącz wierszy na matrycy, linii sygnałowych z 2 płytki sterownika oraz zasilanie 2 płytki sterownika
Sterownik - kontroler

Drugą częścią sterownika jest kontroler, zawiera on:
Procesor: ATMega8 taktowany zewnętrznym kwarcem 16MHz - wybór padł ze względu na chęć wykorzystania tego co leży w szafce, normalnie (biorąc pod uwagę ilość pinów I/O i pamięć flash) wybór padłby na pinowy odpowiednik - ATMega168
Zegar czasu rzeczywistego: klasycznie PCF8583 - z szafki
Pamięć EEPROM: AT24C16 - z szafki
I tu bardziej obeznani elektronicy zaraz krzykną "Hola, hola - konflikt adresów murowany między tymi układami na I2C"
Owszem, mógłbym zastosować tu inną pamięć o większej pojemności i innym adresowaniu, ale przyświecała mi idea, żeby wykorzystać posiadane już elementy, stąd mając odpowiednią kostkę w SMD i uniwersalną SMD-przejściówkę na DIP wykonałem prosty przełącznik magistrali I2C:
Przełącznik magistrali I2C: CD4053
Zasada działania jest prosta - wykorzystałem 2 z 3 linii tego układu - ich wspólne zakończenia są podpięte do procesora, a te, którymi możemy sterować odpowiednio do układu PCF8583 (1 para) i AT24C16 (2para) - jeśli chcę się komunikować z zegarkiem to na linie sterujące układu (spięte razem i podpięte do jednego pinu uP) podaję stan wysoki - jeśli chcę się komunikować z pamięcią EEPROM - podaję na te linie stan niski
Termometr: DS18B20 - gniazdo na 1 na płytkę i złącze do podpięcia drugiego na kablu - na razie nie używane, gdyż program obsługuje tylko jeden termometr z powodu braku pamięci FLASH procesora
Układ podtrzymania RTC: klasycznie, 2 diody 1N4148 + złącze do podpięcia pakietu baterii 2xAA (na płytce nie zmieściła się podstawka na CR2032 lub podobną)
Złącza: do podłączenia płytki "wysokonapięciowej" - jak w jej opisie, do podłączenia baterii podtrzymujących, złącze RS232/TTL (Rxd,Txd,GND) do programowania z komputera, złącze ISP, 2x złącze do DS18B20, złącze do klawiatury matrycowej 4*4 + diody 1N4148 do "wyzwalania" przerwania przy naciśnięciu przycisku - nie wykorzystane z powodu braku pamięci FLASH na obsługę klawiatury
To właściwie cały sterownik od strony technicznej


Oprogramowanie
Oprogramowanie powstało w całości w C i AvrStudio 4. Do obsługi I2C, termometru DS18B20 i SPI wykorzystałem częściowo zmodyfikowane przeze mnie biblioteki z książki Pana Mirka Kardasia, z której zaraz po jej wydaniu uczyłem się C. Kod jest nieco zabałaganiony jak na chwilę obecną, większość funkcji jest po prostu dopisana w pliku main.c zamiast w osobnych plikach stąd, dopóki kod nie będzie uporządkowany i odpowiednio skomentowany (w bardziej zrozumiały sposób niż moje prywatne komentarze) postanowiłem go nie udostępniać publicznie.
Czcionkę wraz z polskimi znakami wygenerowałem przy użyciu świetnego programu innego Kolegi z naszego forum: https://www.elektroda.pl/rtvforum/topic1870982.html Mimo to czcionki ze względu na okropnie wyglądające duże wersje większości polskich znaków diakrytycznych wymagają pewnych modyfikacji (obniżenia o 1px i modyfikacji liter używających dolnej linii).
Funkcje jakie wspiera oprogramowanie:
1. Wyświetlanie temperatury przez określony czas (1-255s)
2. Wyświetlanie aktualnego czasu przez określony czas (1-255s)
3. Wyświetlanie statycznego tekstu (do 8 znaków) przez określony czas (1-255s)
4. Wyświetlanie przewijanego tekstu dowolnej długości (ograniczonej wolną pamięcią EEPROM) z regulowanym opóźnieniem "przeskoku" o 1px w zakresie 1-255ms)
5. Programowanie z poziomu terminala RS232 w prostym tekstowym menu
Programowanie odbywa się w następujący sposób:
1. podłączmy kabel RS232/TTL do układu (lub przejściówkę USB<>RS232 itp.)
2. łączymy się z terminalem w podstawowym trybie: 9600 8-N-1 z wysyłaniem po wciśnięciu klawisza ENTER znaków CR+LF (rn)
3. wciskamy klawisz ESC - następuje wejście w tryb programowania a na matrycy wyświetla się napis "PC-CON"
4. programujemy poruszając się po menu, mamy możliwość:
a. ustawienia czasu
b. programowania sekwencji animacji (nadpisujemy poprzednią)
Programowanie odbywa się w intuicyjny sposób, aby wprowadzić polski znak w trybie wprowadzania tekstu wciskamy klawisz ESC, a we wprowadzanym tekście pojawia się apostrof. Następnie wprowadzamy literę do której ma zostać dodany "ogonek" lub inne polskie udziwnienie - dalej piszemy normalnie
5. zakańczamy ewentualną sesję wgrywania programu animacji, aby dodać na koniec wprowadzonych danych znacznik powrotu adresu do początku programu
6. możemy powtórnie wybrać opcje a lub b albo
7. wciskamy klawisz ESC w "menu głównym" co zakańcza tryb programowania - zapisana animacja zaczyna się wykonywać i możemy odłączyć kabel od komputera i zamknąć połączenie


Pełna galeria:







Filmiki z działania:
V1.0:
V2.0:
Z góry dziękuję za konstruktywne komentarze i ponownie proszę o nie komentowanie wyglądu i jakości wykonania płytek.
Uwagi do załączonych kodów - zgodnie z Prawami Autorskimi niektóre dołączone biblioteki są integralną częścią książki pana Mirka Kardasia i nie mogą być publicznie udostępniane - na podstawie plików nagłówkowych *.h można napisać własne funkcje spełniające odpowiednie działania.
UPDATE #1:
LED_matrix_controller_V1.0_2011_09_12
Załączam program w wersji 1.0 - czyli oryginalna wersja której działanie widać na filmiku i zdjęciach po względnym uporządkowaniu kodu.
UPDATE #2:
LED_matrix_controller_V1.5_2011_09_13
Nieco zoptymalizowana wersja programu, zmiany w stosunku do poprzedniej:
1. przeniesienie tekstów menu programowania do pamięci EEPROM
2. dodanie dynamicznego ustalania szerokości liter dla tekstu przewijanego
3. czcionka v2 - nieco poprawione "polskie" literki, większość obniżona o 1px w dół
4. załączone pliki czcionek do edycji w generatorze wymienionym w opisie wyświetlacza
UPDATE #3 - final:
LED_matrix_controller_V2.0_2011_09_15
Finalna wersja programu, zmiany w stosunku do poprzedniej:
1. Obsługa 2 termometrów i 2 ikonek (słoneczko i domek)
2. Wyszukiwanie termometrów w trybie programowania
3. Osobne programowanie wyświetlania pierwszego i drugiego termometru, dowolne przypisanie ikonek (podczas programowania dodatkowa opcja Conf.: xy, gdzie x - numer ikonki (0-1), y - numer termometru (0-1))
4. przechowywanie ID termometrów w pamięci EEPROM procesora (w przypadku awarii komunikat error, można zmienić to i ustawić flags.done=0 w razie błędu, aby pominąć w ogóle odczyt z danego termometru w razie jego uszkodzenia/wypięcia)
Cool? Ranking DIY