Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Wyświetlacz LED - Mega32

xamrex 06 Sie 2011 14:35 16879 28
  • Wyświetlacz LED - Mega32

    Witam,

    Chciałbym Wam przedstawić projekt wyświetlacza LED oparty na ATmedze32.

    Do odpalania tej matrycy użyłem jak zwykle płytki startowej od pana Mirka :D

    Schemat płytki:

    Wyświetlacz LED - Mega32

    Zasada działania:
    Do portu C uC podpiąłem tranzystory, które sterują wierszami,
    a poprzez interface SPI steruję czterema 8-bitowymi układami 74HC595.

    Program na uC nie jest zbyt skomplikowany, ale niestety nie zamierzam go udostępnić ze względu na to, że nie jest on rewelacyjnie napisany, a nie chce mi się go już poprawiać.

    Napisałem sobie również fajną funkcję pixel(x,y).
    Zapala ona poszczególne diody na wyświetlaczu, np. wywołanie funkcji pixel(1,1) zapala pierwszą diodę w pierwszym rzędzie ;)

    Nie jest to może szczyt marzeń, bo płytka jest jednostronna (chciałem zaoszczędzić pieniądze - samodzielnie 2-stronnej zrobić nie potrafię) i musiałem z góry lutować przewody do diod.
    Widać to na zdjęciu poniżej:

    Wyświetlacz LED - Mega32

    Tutaj filmik z działania płytki ;)

    Link


    Widać, że pojawiają się "duszki", ale to przez telefon, którym narywałem. W rzeczywistości wszystko ładnie świeci.

    Proszę o komentarze ;)

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    xamrex
    Poziom 28  
    Offline 
    Specjalizuje się w: komputery, avr
    xamrex napisał 1624 postów o ocenie 316, pomógł 80 razy. Mieszka w mieście Kalety. Jest z nami od 2006 roku.
  • #2
    MasMas
    Poziom 16  
    A można by tak zrobić, żeby wierszami sterować nie za pomocą tranzystorów, tylko tak samo jak kolumnami, tj. przez rejestry i drivery ULN ??
    Wtedy to by można było strować taką matrycą z wykorzystaniem 3 pinów uC (na ISP)... Chyba, że tak się nie da?
  • #3
    marcin19912305
    Poziom 13  
    ULN mają OC mogą tylko do masy ściągać ;)
  • #4
    xamrex
    Poziom 28  
    Można by tak zrobić używając innych driverów, teraz nie pamiętam nazwy, ale są one drogie ;/
  • #5
    BoskiDialer
    Poziom 34  
    Co do użycia dodatkowej pary rejestr+ULN do wierszy: nie. Musiał by się pojawić element, który dołącza dany wiersz do VCC. Natomiast nic nie stoi na przeszkodzie, aby tranzystory, które już są obecne wysterować z rejestru wpiętego do tego samego łańcucha - wtedy całość będzie sterowana za pomocą 3 przewodów. Całość komplikowała by się, gdyby mimo równoczesnej aktualizacji kolumn i wierszy występowały by 'duszki'.
  • #6
    xamrex
    Poziom 28  
    Z tego co kojarzę można by użyć UDN2982 do sterowania wierszami

    Ale widzę, że nie produkują więc można użyć UDN2981
  • #7
    leadman
    Poziom 16  
    Bardzo fajnie Ci to wyszło.
    Krytykować nie ma czego, tym bardziej że kwestia wykonania wiązała się z funduszami (ja swoje pierwsze "układziki" lutowałem na kawałku płytki pilśniowej - taki trochę lepszy pająk ;D).
    Mnie trochę ciekawi wygląd programu, w jaki sposób podajesz tekst do wyświetlania itp.

    Ogólnie całość mi się bardzo podoba.
  • #8
    xamrex
    Poziom 28  
    Gdybym dał kod to i tak nikt by tego nie zrozumiał :D
    tak wygląda funkcja mian:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tutaj stworzyłem sobie tablice ze znakami:(proponuję wkleić to do notatnika, bo tu to nic nie widać ;(
    Cytat:
    ////////////////////////////0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z SB
    uint8_t tabela[8][44] PROGMEM ={
    { 6, 2, 14, 31, 8, 31, 12, 31, 14, 14, 0, 0, 8, 0, 1, 14, 14, 14, 15, 14, 7, 31, 31, 14, 17, 7, 28, 17, 1, 17, 17, 14, 15, 14, 15, 30, 31, 17, 17, 17, 17, 17, 31, 0},
    { 9, 3, 17, 8, 12, 1, 2, 17, 17, 17, 6, 6, 4, 0, 2, 17, 17, 17, 17, 17, 9, 1, 1, 17, 17, 2, 8, 9, 1, 27, 17, 17, 17, 17, 17, 1, 4, 17, 17, 17, 17, 17, 16, 0},
    { 9, 2, 16, 4, 10, 15, 1, 16, 17, 17, 6, 6, 2, 15, 4, 16, 16, 17, 17, 1, 17, 1, 1, 1, 17, 2, 8, 5, 1, 21, 19, 17, 17, 17, 17, 1, 4, 17, 17, 17, 10, 17, 8, 0},
    { 9, 2, 8, 8, 9, 16, 15, 8, 14, 30, 0, 0, 1, 0, 8, 8, 22, 17, 15, 1, 17, 15, 15, 29, 31, 2, 8, 3, 1, 21, 21, 17, 15, 17, 15, 14, 4, 17, 17, 21, 4, 10, 4, 0},
    { 9, 2, 4, 16, 31, 16, 17, 4, 17, 16, 0, 0, 2, 15, 4, 4, 21, 31, 17, 1, 17, 1, 1, 17, 17, 2, 8, 5, 1, 17, 25, 17, 1, 21, 5, 16, 4, 17, 17, 21, 10, 4, 2, 0},
    { 9, 2, 2, 17, 8, 17, 17, 4, 17, 8, 6, 6, 4, 0, 2, 0, 21, 17, 17, 17, 9, 1, 1, 16, 17, 2, 9, 9, 1, 17, 17, 17, 1, 9, 9, 16, 4, 17, 10, 21, 17, 4, 1, 0},
    { 6, 7, 31, 14, 8, 14, 14, 4, 14, 6, 6, 4, 8, 0, 1, 4, 14, 17, 15, 14, 7, 31, 1, 30, 17, 7, 6, 17, 31, 17, 17, 14, 1, 22, 17, 15, 4, 14, 4, 10, 17, 4, 31, 0},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    };





    No i może dodam jeszcze funkcję napis:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Co do funkcji która zapala odpowiednie pixele
    To stworzyłem sobie tablicę
    uint8_t bufor[256]; 256 dlatego bo tyle mam diod

    I teraz np. wpisując 1 do pierwszego elementu tablicy, zapala mi się dioda w pierwszym rzędzie i w pierwszej kolumnie..
    Nic odkrywczego..
  • #9
    slawek55
    Poziom 23  
    Może nie dno, ale
    Cytat:
    Gdybym dał kod to i tak nikt by tego nie zrozumiał


    Jest stwierdzeniem trochę obraźliwym.

    Ja zawsze się zastanawiałem jak takie tablice są sterowane, zwłaszcza że niektóre są na prawdę duże.
  • #10
    Matejkos
    Poziom 20  
    Sądzę że autor nie chciał nikogo obrazić tym że nie zrozumiemy, chyba każdemu a przynajmniej mnie zdarza się napisać program którego działanie znam tylko jak i Bóg a po pewnym czasie to już tylko Bóg wie jak to działa i dlaczego działa. Polecam tylko nabrać nawyku pisania przejrzystego kodu gdyż kiedyś może to pomóc koledze kiedy będzie chciał coś poprawić. A co do konstrukcji to ciekawa, a jeśli chodzi o zaoszczędzenie linii procesora to można pomyśleć nad jakimś ekspanderem portów na I2C wtedy ograniczamy się do 3 linii danych i 2 zasilania. Życzę kolejnych udanych konstrukcji.
    Pozdrawiam Matejkos
  • #11
    piotrva
    Moderator na urlopie...
    Matejkos napisał:
    jeśli chodzi o zaoszczędzenie linii procesora to można pomyśleć nad jakimś ekspanderem portów na I2C wtedy ograniczamy się do 3 linii danych i 2 zasilania.

    Ehh, po co I2C pakować do czegoś takiego? Drogie i mają za dużo funkcji. 74hc595 są relatywnie tanie i bardzo miło się obsługuje (3 linie do całego sterowania to chyba nie jest dużo...) i nie widzę problemu, żeby takim 74hc595 sterować też kolumny (poprzez tranzystory). Odpowiednie sterowanie linią zatrzasku i układem podpiętym do sterowania wierszy daje możliwość odpowiedniego sterowania układem tak, aby nie było duszków...

    Do Autora:
    Swoją drogą, mogłeś jakoś lepiej rozplanować wyprowadzenia, żeby te kable tak nie wisiały nad matrycą.
  • #12
    leadman
    Poziom 16  
    Heh ja też nie czuję się obrażony :)

    Matejkos trafił w 100% ze stwierdzeniem, że na początku jak działa program wiemy tylko my i Bóg potem tylko Bóg :).

    Teraz mogę się odnieść jeszcze do jednej kwestii, mianowicie udoskonalenia urządzenia o możliwość prostego wprowadzenia tekstu (znaków) do wyświetlania np. za pomocą terminala itp.
    Bo obecnie trzeba za każdym razem "gmerać" w kodzie źródłowym i programować od nowa procka (tak mi się wydaje).
  • #13
    MasMas
    Poziom 16  
    Ja też uważam, że ekspandery I/O są fajne, ale tutaj nie potrzebne... Takie 2 x 8bit kosztuje ~8-10 zł. Przy takim projekcie diametralne zwiększa jego koszt.
    A pomysł z tymi rejestrami całkiem fajny i wystarczy właśnie podpiąć tranzystory do rejestru.

    Co do kodu dla uC, to uważam, że autor nie powinien i nie ma się czego wstydzić.

    Po pierwsze to nie ma się czego wstydzić, bo powiedział, że ma świadomość, iż kod jest nieczytelny, więc nikt mu już tego nie zarzuci. My tu przecież nie gryziemy, a uwież mi, że wiele osób na pewno woli działający, nieczytelny i brzydki kod, niż w ogóle brak kodu ;)

    Po drugie to @Materjkos ma całkowitą rację, co do kodu. Potem to już tylko Bóg wie co i dlaczego. Na przyszłość, dla samego siebie, a uwież mi w programowaniu trochę siedzę, wystarczy, że będziesz stosował wcięcia (akapity), jedno polecenie w jednej lini i komentarze co za co odpowiada, co robi - a na pewno będzie ładnie i czytelnie

    Po trzecie, to Autor nie ma się chyba co martwić, że kodu niezrozumiemy. Na pewno są osoby, które się w niego "wgryzą". Jak to mówią, dla chcącego nic trudnego, tym bardziej w DIY :)
  • #14
    xamrex
    Poziom 28  
    Dokładnie tak jak napisał Matejkos
    Napisałem ten kod na szybko i działa..
    Ale zrobiłem go nie tak jak powinno się robić (w przerwaniach mam dosyć długie funkcje, a przerwania powinny być możliwie jak najkrótsze).

    Jeśli dodałbym ten kod to ktoś może pomyśleć, że tak jest dobrze i tak będzie robił, a tego bym nie chciał :)



    Jak sobie chcecie :)
    Tak jak pisałem są 2 tryby pracy, jeden który korzysta z tablicy, drugi tylko do wyświetlania napisów..
    Tego pierwszego (który korzysta z funkcji pixel(x,y) nie udostępnię bo właśnie przez to kod się komplikował a tak może ktoś coś zrozumie.
    Czyli udostępniam gotowy działający kod, który może tylko wypisywać tekst

    Oto kod:
    main.c
    Kod: c
    Zaloguj się, aby zobaczyć kod



    matryca.h
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Matryca.c
    Kod: c
    Zaloguj się, aby zobaczyć kod




    W razie problemów pytać :)


    Aha, tekst musi być z dużych liter bo nie mam graficznie przedstawionych małych liter(po prostu nie chciało mi się tego robić), więc jeśli ktoś wpisze tekst do funkcji napis(); z małych liter wyjdą dziwactwa.



    Co do sterowania wierszami, to wydaje mi się ze zamast tranzystorów można użyć :
    układu UDN2981 ale nie jestem pewien ;D
  • #15
    grala1
    Specjalista grupy V.A.G.
  • #16
    piotrmak
    Poziom 11  
    Nie wiem czy dobrze widzę, ale chyba nie działa kilka diód po lewej stronie. Chyba, że to przewody zasłaniają.
  • #17
    tdx110
    Poziom 18  
    A jaki jest maksymalny pobór prądu?
    Patrząc tak i zakładając że każda dioda pobiera około 20mA to po ilości diod można zobaczyć że dużo.
    Sprawdzałeś może?
  • #18
    xamrex
    Poziom 28  
    grala1 napisał:
    Ile zajęło Ci zrobienie płytki z diodami?
    Trochę się przy niej nawierciłeś.

    3-4 dni :)

    piotrmak napisał:
    Nie wiem czy dobrze widzę, ale chyba nie działa kilka diód po lewej stronie. Chyba, że to przewody zasłaniają.

    Wszystkie świecą, przewodu muszą zasłaniać ;)


    tdx110 napisał:
    A jaki jest maksymalny pobór prądu?
    Patrząc tak i zakładając że każda dioda pobiera około 20mA to po ilości diod można zobaczyć że dużo.
    Sprawdzałeś może?

    Nigdy nie świecą wszystkie diody na raz ;)
    Są one multipleksowane, więc Maksymalna ilość diod, jaka mogłaby świecić w jednym momencie to 32 diody..

    No ale pytałeś ile mi to pobiera prądu, więc zmierzyłem,
    Przy tym napisaie co teraz tam jest (ELEKTRODA) to maksymalny pobór prądu przez cały układ to jest ~130mA.
  • #19
    farrix
    Poziom 17  
    Koledzy piszą o jakiś ekspanderach, dokładaniu rejestrów a ja pytam po co?
    Mega 32 kosztuje 10-12zł a ma ponad 30 linii więc mowa o zmniejszaniu ilości linii (czyt. również zwiększaniu kosztów) jest co najmniej nie na miejscu!
  • #20
    xamrex
    Poziom 28  
    Dokładnie, dlatego ja już się nie bawiłem w zmniejszanie ilości lini,
    Nie mniej jednak, można użyć mniejszego uC i wysterować to używając znacznie mniej linii :)
  • #21
    piotrva
    Moderator na urlopie...
    farrix napisał:
    Koledzy piszą o jakiś ekspanderach, dokładaniu rejestrów a ja pytam po co?
    Mega 32 kosztuje 10-12zł a ma ponad 30 linii więc mowa o zmniejszaniu ilości linii (czyt. również zwiększaniu kosztów) jest co najmniej nie na miejscu!

    A jak trzeba jeszcze do czegoś innego piny procesora?
    Cóż, wybór zależy już od konkretnego projektu, którego elementem jest taki wyświetlacz. Bo jeśli miałoby braknąć linii i/o to lepiej dorzucić rejestr niż kupować większy uP, ale jeśli linii starcza to można najprościej jak się da ;-)
  • #22
    Vampir8
    Poziom 16  
    Cytat:
    Co do użycia dodatkowej pary rejestr+ULN do wierszy: nie. Musiał by się pojawić element, który dołącza dany wiersz do VCC. Natomiast nic nie stoi na przeszkodzie, aby tranzystory, które już są obecne wysterować z rejestru wpiętego do tego samego łańcucha - wtedy całość będzie sterowana za pomocą 3 przewodów. Całość komplikowała by się, gdyby mimo równoczesnej aktualizacji kolumn i wierszy występowały by 'duszki'.


    Wyświetlacz LED - Mega32

    4 rejestry, no i z PWM, a swoją drogą można było zakupić takie matryce teraz to już nie jest droga sprawa, na alledrogo takie cudo to koszt 7,50 więc pewnie tyle samo co za diody dałeś :) Powodzenia przy dalszych konstrukcjach.


    Link
  • #23
    xamrex
    Poziom 28  
    Diody miałem ze szkoły za darmo, więc koszt diod dla mnie to 0 zł.
    Jedyne za co musiałem zapłacić to kawałek laminatu, wytrawiacz i ekspandery ;D
  • #24
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #25
    Sh44dow
    Poziom 16  
    Ładny wyświetlacz, też kiedyś taki złożyłem, tyle że większy.
    Czy u Ciebie nie ma takiego efektu, że gdy zaświecasz cały rząd spada jasność?
    Na przykład jeśli zaświecisz w 7. linii pierwszy pixel, a w 8-mej wszystkie to czy widać różnicę w jasności pomiędzy 7. a 8. linią?
  • #26
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #27
    Sh44dow
    Poziom 16  
    Saabotaz napisał:
    Shaadow - a dałeś po 1 oporniku na każdy led czy tylko 1 opornik na cały wiersz?


    W panelu ich nie ma bo bardzo nie chciało mi się ich lutować ;-).
    Składalem później coś takiego (tylko mniejsze) na płytkach stykowych już z opornikami przy każdej kolumnie ale poza tym, że ledwo świeciły efekt nadal był lekko widoczny.
  • #28
    xamrex
    Poziom 28  
    Sh44dow napisał:
    Czy u Ciebie nie ma takiego efektu, że gdy zaświecasz cały rząd spada jasność?

    Nie nie ma takiego 'efektu'
    Wszystkie świecą jednakowo.
  • #29
    karlos79
    Poziom 33  
    Witam
    Kolego Saabotaz czy możesz zamieścić schemat swojej matrycy?

    Pozdrawiam