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

Matryca LED RGB z obsługą myszy PS2

Kubald 04 Sie 2013 14:20 6849 0
  • Matryca LED RGB z obsługą myszy PS2

    Autorowi udało się, z pomocą pracownika www.wanzhouled.net zdobyć matrycę LED o wymiarach 32x32 diody RGB. Zakup był owocem poszukiwań najtańszej matrycy tego typu, prezentowana poniżej kosztowała jedynie $22 (plus koszty przesyłki, około $10).

    Inspiracją do stworzenia projektu był też film, który autor obejrzał na YouTube, a który prezentował wyświetlanie na takiej matrycy prostej animacji odbijających się piłek. Autor postanowił więc stworzyć coś podobnego, a przy okazji w końcu spróbować podłączania myszy PS2 do mikroprocesora.


    Link


    Sercem urządzenia jest PICnDuino, platforma zbudowana przez autora w 2012 roku. Działanie całości kontroluje procesor PIC18F25K20, ale w jego miejsce można zastosować jakikolwiek inny mikroprocesor, pod warunkiem, że ma wystarczającą ilość wyprowadzeń. Sposób podłączenia matrycy i myszy z płytką PICnDuino pokazano poniżej:

    Matryca LED RGB z obsługą myszy PS2 Matryca LED RGB z obsługą myszy PS2

    Rezystory na linii komunikacji z myszą zostały dodane z powodu tego, że jeden z nich (RC6) wykorzystywany jest także do komunikacji z układem FTDI. Jak widać, złożoność układu jest zerowa i wszystko działa od pierwszego uruchomienia.

    Interesującą kwestią jest sposób działania matryc LED, np. rysowania pikseli. Wszystkie przykłady kodów powstały w Swordfish Basic.

    Na początek, wszystkim portom przypisano przyjazne nazwy:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Procedura wysyłająca dane do matrycy wygląda następująco:




    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Ekran ma 32 rzędy, każdy składa się z 32 pikseli. Aby narysować pełny obraz, należy szeregowo przesyłać 32 bity danych z uwzględnieniem sześciu możliwych stanów dla każdego koloru:
    - Czerwony (0/1);
    - Zielony (0/1);
    - Niebieski (0/1).
    Następnie należy zdecydować, który rząd diod „zareaguje” na przesłane dane – stąd konieczne jest używanie linii ROW A, B, C i D. Ponieważ wykorzystane są 4 linie możliwych jest 16 wyborów rzędów. Wszystkie kombinacje pokazano poniżej:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Z powyższego widać, że w czasie zapisu do matrycy rysuje się dwa rzędy w tym samym czasie, rozdzielone 16-ma rzędami. Pierwszymi rzędami, do których odnoszą się przesyłane dane jest rząd pierwszy i środkowy. Przesyłane dane są przechowywane tymczasowo w zmiennych, zanim zostaną przekazane do procedury rysującej piksele. Każda zmienna TempData przechowuje 32 bity:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Należy zwrócić uwagę na wykorzystanie pętli – powoduje ona, że kod wykonywany jest 16 razy - począwszy od 0, aż do 15, co jest zgodne z numerami rzędów, do których wpisywane są dane. W czasie ładowania danych do zmiennej TempData1 OutputDataRed zawiera dane dla rzędu odległego o 16 w stosunku do danych dla rzędu w zmiennej TempData0. Ta sama procedura powtarzana jest dla kolorów zielonego, a następnie niebieskiego. Wymusza to obrane wcześniej sterowanie dwoma rzędami na raz.

    Kiedy dane zapisane są już do zmiennych TempData, należy przesłać szeregowo sześć 32-bitowych paczek danych do matrycy:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Odbywa się to za pomocą kolejnej pętli, która powoduje wykonanie kodu 32 razy. Za każdym razem wysyłany jest jeden bit ze zmiennych TempData. Na porty wystawiane są kolejne dane, a następnie generowany jest sygnał zegara dla rejestrów przesuwnych matrycy. Wskaźnik bitu (31 – X) jest konieczny, aby obraz nie był rysowany od tyłu (jak byłoby w przypadku samego wskaźnika (X)) – na początku przesyłany jest więc ostatni bit, a na końcu – pierwszy.

    Po przekazaniu wszystkich danych wybierany jest odpowiedni rząd, za pomocą linii ROW A, B, C oraz D:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dane na temat kolejnych wartości A, B, C i D zapisane są w zmiennej Y. Przy pierwszym wykonywaniu kodu wysyłana wartość wynosi 0000, co powoduje wyświetlenie przesłanych danych w rzędach 1. i 16. Do poprawnego działania całości wymagane jest sterowanie linią Latch (zatrzasku).

    Po wpisaniu danych konieczne jest uaktywnienie buforów trójstanowych podłączonych do diod LED, realizowane jest to poleceniem:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Diody zostaną zapalone na krótki okres, a następnie wyłączone:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Cała pętla wykonywana jest 15 kolejnych razy.

    Oto cała procedura wyświetlania. Jednak należy też określić, co ma być przedstawione na matrycy, dlatego należy dokonać zapisu do zmiennych danych wyjściowych dla każdego koloru:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Ważne jest też wyczyszczenie matrycy, aby nic nie było wyświetlane przypadkowo:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Jeśli na matrycy ma być wyświetlony pojedynczy, czerwony punkt w prawym, górnym rogu, dane zmiennej dla koloru czerwonego będą następujące:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    OutputDataRed(0) to pierwszy, górny rząd matrycy, a OutputDataRed(31) to ostatni – dolny. Ta sama reguła obowiązuje dla pozostałych kolorów.

    Narysowanie niebieskiej ramki wokół matrycy wymaga wprowadzenia następujących danych:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Jeśli chcemy z kolei wyrysować w lewym, górnym rogu żółtą „buźkę”, wartości zmiennych są następujące:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    I to tyle, jeśli chodzi o rysowanie na matrycy!

    Jak działa mysz PS2

    Obsługa myszy PS2 była nieco trudna. Po przejrzeniu wielu stron internetowych na ten temat autor trafił w końcu na bardzo pomocny kod dla Arduino. Więc – jak to działa?

    Jeśli kiedykolwiek podłączałeś mysz PS2 do włączonego komputera, oczywiście nie działała. Wynika to z faktu, że komputer musi wysłać najpierw do myszy kilka komend, które uruchomią transmisję danych. Szczegóły na temat komend, które można przekazać do myszy PS2 można znaleźć na tej stronie.

    Natomiast sterowanie myszy przez mikroprocesor wygląda następująco:
    1. Przesłanie polecenia zresetowania myszy – komenda ‘FF’.
    2. Przesłanie komendy aktywującej tryb odczytu – komenda ‘F0’.
    3. Przesłanie komendy zmieniającej szybkość próbkowania – komenda ‘F3’.
    4. Ustawienie wartości ‘200’ – przesłanie heksadecymalnej wartości ‘C8’.
    5. Zmiana rozdzielczości myszy – komenda ‘E8’.
    6. Zmiana rozdzielczości na najniższą wartość (1 zliczenie na mm) - przesłanie heksadecymalnej wartości ‘00’.
    Jeśli nie chcemy zmieniać standardowych ustawień myszy, można pominąć kroki 3-6.

    Wszystko zapisane jak powyżej wygląda całkiem prosto, ale kłopot sprawia fakt, że mysz wykorzystuje dwukierunkowy port szeregowy i dwukierunkowy zegar. Dlatego mikroprocesor musi zmieniać charakter działania portów z wejść na wyjście, w zależności, czy zapisujemy do myszy, czy dokonujemy odczytu. Definicja aliasów portów jest więc następująca:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Natomiast kod wysyłający dane konfigurujące mysz pokazano poniżej:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Na początek mikroprocesor ustawia stan wysoki na linii danych i zegara, definiując te dwa porty jako wyjścia. Stan wysoki trwa 100 μS:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Następnie na linię zegara wystawiany jest na 100 μS stan niski, co sygnalizuje myszy, że zostaną przesłane komendy konfiguracyjne:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Kolejnym krokiem jest przekazanie na 5 μS stanu niskiego na linię danych:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Ostatnim krokiem jest ustawienie stanu wysokiego linii zegara. Powoduje to, że mysz przejmuje kontrolę nad generowaniem sygnału zegarowego dla transmisji. Należy więc ustalić, że port połączony z zegarem myszy będzie wejściem:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    W momencie, kiedy na linii zegara pojawi się sygnał niski, można przesłać dane do myszy. Wysyłane są 8-bitowe komendy, poprzedzone bitem nieparzystości i zakończone bitem stopu (zawsze 1). Przesłanie komendy resetu wygląda więc następująco:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dane do myszy wysyłane są przez pętlę:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Pętla wykonywana jest 10 razy, ponieważ wysyłane jest 10 bitów. Przesyłanie danych jest zsynchronizowane z sygnałem zegarowym.

    Procedura konfiguracji myszy w przedstawionym projekcie jest następująca:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Następnym, naturalnym krokiem jest odczyt danych z myszy poprzez wysłanie komendy ‘EB’. Po jej otrzymaniu mysz wyśle 4 bajty danych, a pierwszym z nich jest zawsze ‘FA’. Następne 3 bity zawierają:
    1. wskaźnik przepełnienia x, wskaźnik przepełnienia y, bit znaku y, bit znaku x, bit zawsze równy 1, stan środkowego przycisku, stan prawego przycisku i stan lewego przycisku. Te dwa są najistotniejsze, gdyż odzwierciedlają kliknięcia.
    2. dane wskazujące ruch myszy w kierunku osi X. Jeśli mysz jest nieruchoma, przekazywana jest wartość ‘00000000’. Czym szybszy ruch myszy, tym wyższa przesyłana wartość.
    3. dane wskazujące ruch myszy w kierunku osi Y.

    Poniższy kod odpowiada za odbiór i przechowywanie danych przesłanych przez mysz:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Kod obsługujący odebrane dane jest następujący:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Odebrane dane zapisywane są do globalnej zmiennej MouseDataIn.

    Kompletny kod obsługujący urządzenie jest następujący:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Na stronie źródłowej można znaleźć dokładniejsze omówienie działania całości kodu, jak i pliki źródłowe.


    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.