
Witajcie moi drodzy
Dzisiaj przedstawię mojego pierwszego własnego shielda (nakładkę) dla Arduino UNO.
Jest to shield VGA (generator obrazu video dla monitora VGA) z bonusową obsługą klawiatury PS/2 i bazuje na wcześniej już opisywanej przeze mnie bibliotece 'ASCII Video Terminal' autorstwa Geoff dostępnej na licencji CC-BY-NC-SA 3.0.
Tak, pokażę tutaj jak praktycznie każdy początkujący (przy użyciu mojego shielda) może podłączyć monitor i klawiaturę do Arduino.
Co to za shield?
Shield VGA opracowałem z myślą o początkujących użytkownikach i miłośnikach Arduino. Jest prosty w użyciu i nie wymaga żadnego lutowania ani nawet kabelków by wyświetlać różne kształty na ekranie i obsługiwać klawiaturę PS/2. Moduł komunikuje się z Arduino z pomocą UART na wybranych przez użytkownika pinach.
Płytkę shielda utworzyłem od zera w Eagle. Software shielda chodzi na PIC32 i pochodzi projektu na licencji Creative Commons-NC dostępnego tutaj:
http://geoffg.net/terminal.html
Shield oferuje:
- kompatybilność z Arduino UNO
- generowanie jednobarwnego obrazu VGA o rozdzielczości do 24 linii po 80 znaków
- możliwość generowania obrazu PAL/NTSC dla telewizorów
- rysowanie tekstu i prostych kształtów
- wsparcie klawiatury PS/2
- komunikację z Arduino przez UART (czyli Serial lub SoftwareSerial; w zależności które piny wybierzemy)
- możliwość wyboru jednych z kilku pinów wejścia/wyjścia (UART)
- wybór baud rate UART komunikacji poprzez zworki
- jego użycie praktycznie nie zużywa wcale pamięci Arduino, wszystko dzieje się poza siedzącą tam ATmegą
- kod firmware autorstwa Geoff jest Open Source i znajduje się na licencji Creative Commons-NC
Schemat pierwowzoru shielda:

Ja na bazie tego schematu opracowałem shield dla Arduino i to poniżej opiszę.
Poprzedni projekt (warto zapoznać się)
Sam użyty tutaj firmware autorstwa Geoff (obsługa VGA/PS/2 na PIC32) opisywałem jakiś czas temu w dziale DIY Zagranica; polecam zapoznać się z tym opisem. Nie będę tutaj powtarzać drugi raz tych informacji.
https://www.elektroda.pl/rtvforum/topic3559090.html
W zalinkowanym powyżej temacie są też dodatkowe przykłady co można zrobić z pomocą tego modułu VGA.
Projekt płytki
PCB zaprojektowałem samodzielnie w programie Eagle. Wybrałem w pełni montaż przewlekany, aby ewentualnym naśladowcom mojego projektu było łatwo wszystko zlutować.
Płytka wygląda tak:

Na płytce znajduje się PIC32MX250F128B, czyli główne serce układu, wraz z rezonatorem kwarcowym 8MHz. Do tego drobnica i złącza, jak również USB PICa wyprowadzone jest na piny (przyszłościowo).
Pliki projektu Eagle można pobrać w załączniku:
Oraz pliki Gerber (dla płytkarni; jeśli nie chcemy generować ich sami):
Spis części - kosztorys
Tutaj przedstawiam spis części wraz z ich dokładnymi opisami i nazwami pod jakimi można je znaleźć w sklepach (zdaję sobie sprawę z tego, że początkujący nie wie że np. złącze PS/2 to inaczej MDC6) i orientacyjnym kosztorysem.
UWAGA: Drobnicę taką jak rezystory/kondensatory kupuje się po 50-100 sztuk, trudno jest tu podać cenę jednego elementu, więc podaje już ceny 'zbiorowe', dlatego w cenniku wygląda tak jakby kilka rezystorów kosztowało 1 zł, ale oczywiście wcale tak nie jest.
Element | Ilość | Opis | Cena |
PIC32MX250F128B | 1 | 32-bitowy mikrokontroler w obudowie DIP28, powinien mieć wgrany wsad, możecie wgrać go sami z pomocą PICKIT3 lub podobnego programatora, bądź poprosić o to kogoś | 15 zł |
Podstawka 28DIP | 1 | Podstawka DIP28 pod mikrokontroler, by można było go łatwo wyjąć w razie uszkodzenia lub potrzeby zaprogramowania (choć można go też programować bez wyjmowanie z pomocą ICSP, więc nie jest to niezbędne) | 1 zł |
Złącze MDC6, Mini DIN 6Pin | 1 | Złącze na klawiaturę PS/2. Można wylutować z płyty głównej od komputera | 1.5 zł |
Złacze VGA D-SUB 15 pin, DB15 | 1 | Złącze na monitor VGA. Ma 3 rzędy pinów po 5 pinów. Można wylutować z płyty głównej od komputera. | 2 zł |
Złącze RCA dla sygnału video, pojedyncze | 1 | Potrzebne tylko jeśli chcemy podłączyć do shielda telewizor a nie monitor, można wylutować z różnego rodzaju sprzętu | 1 zł |
Rezonator kwarcowy 8MHz | 1 | Źródło zegara PICa. Może być w obudowie HC49 | 1 zł |
Kondensator ceramiczny 100nF | 4 | Kondensator odsprzęgający zasilanie PICa | 1 zł |
Kondensator ceramiczny lub tantalowy 10uF | 1 | Kondensator wymagany przez PIC na pinie VCAP. Najlepiej low-ESR. | 1 zł |
Kondensator ceramiczny 27pF | 2 | Dwa kondensatory dla oscylatora 8MHz od PICa | 1 zł |
Rezystor 10k | 2 | Jeden rezystor 10k potrzebny jest dla pinu MCLR (RESET) od PICa, drugi do dzielnika napięcia przy pinie RxD od UART | 1 zł |
Rezystor 4.7k | 2 | Rezystory pull-up od podłączenia PS/2 | 1 zł |
Rezystor 150 | 1 | Rezystor do generowania poziomów sygnału HSYNC | 1 zł |
Rezystor 470 | 1 | Rezystor do generowania poziomów sygnału HSYNC | 1 zł |
Rezystor 220 | 1 | Rezystor do generowania sygnału VGA-VIDEO | 1 zł |
Rezystor 100-1000R | 1 | Rezystor dla diody LED, jego wartość nie jest krytyczna i zależy też od tego jakiej diody użyjemy | 1 zł |
Gniazdo szpilkowe 1x10 2.54mm długie | 1 | Inaczej pinheader, do podłączenia z Arduino | 1.5 zł |
Gniazdo szpilkowe 1x8 2.54mm długie | 2 | Inaczej pinheader, do podłączenia z Arduino | 1.5 zł |
Gniazdo szpilkowe 1x6 2.54mm długie | 1 | Inaczej pinheader, do podłączenia z Arduino | 1.5 zł |
Listwa szpilkowa Goldpin 1x5 2.54mm | 1 | Jako złącze ICSP do programowania PICa. Nie potrzebujemy go jeśli dostaniemy PICa z wgranym wsadem od kogoś | 1 zł |
Listwa szpilkowa Goldpin 2x3 2.54mm | 1 | Podwójny pinheader na PCB podpisany jako BAUD_SEL, na nim wybieramy prędkość transmisji UART z pomocą zworek | 1 zł |
Dioda LED | 1 | Dowolny kolor, nie jest niezbędna do uruchomienia płytki, ale jej miganie informować nas będzie o aktywności układu | 1 zł |
Zworka | 3 | Zworki przydadzą się nam przy ustawianiu prędkości transmisji BAUD z którą shield będzie komunikować się z Arduino | 1 zł |
Dodatkowo oczywiście potrzeba PCB - w razie czego mam kilka.
Bez PCB całość zamyka się w jakiś 30-40 zł, chociaż tak naprawdę jak ktoś ma mały zbiór części to pewnie kupować będzie tylko PICa...
Lutowanie płytki
Tutaj opiszę krok po kroku jak całość zlutowałem.
Montaż całości jest bardzo prosty i przyjemny, bo tak jak już wspomniałem, wszystko zostało zaprojektowane z myślą o początkujących - dlatego nie użyłem SMD (montażu powierzchniowego).
PCB pod projekt oczywiście nie wytrawiałem sam, tylko zamówiłem z Chin:


Jeśli ktoś chce, to kilka jeszcze tych płytek mam.
Złącza VGA oraz PS/2 wziąłem z starej płyty głównej od komputera:

Odlutowywanie ich opalarką poszło dość szybko:


Odzyskane elementy z komputera:



Po wylucie warto jeszcze się upewnić, że nie ma na nich resztek cyny która może robić zwarcia.

Złącze RCA dla wyjścia sygnału PAL/NTSC pod starsze telewizory z kolei wziąłem z szuflady, też z wylutu ze złomu elektronicznego, tyle że było podwójne i musiałem je przerobić::






W ten sposób przygotowałem sobie zestaw elementów:

Niestety pierwsza wersja PCB miała mały błąd na schemacie - jeden z pinów był podłączony do masy zamiast do zasilania. Wersja z załącznika jest już poprawna, ale ja musiałem to u siebie naprawić. Poradziłem sobie z tym poprzez odpowiednie poszerzenie jednego z otworów, usunięcie z niego miedzi, zaizolowanie pinu z podstawki i dodanie zworki:



Następnie zacząłem lutować pozostałe elementy. Rezystory:

Kondensatory:

Złącza:

Złacza cd:

Reszta:

Prawie gotowy shield (kondensatorów 10-ileś pico nie miałem pod ręką):

Zostało tylko zaprogramować...
Wgrywanie firmware na PIC32
Jeśli sami składamy shielda to niestety po jego zlutowaniu trzeba raz wgrać firmware na znajdujący się na pokładzie PIC32. Ewentualnie możemy dostać PIC32 już z wgranym wsadem, lub poprosić kogoś z forum o jego zaprogramowanie dla nas.
Ja zaprogramowałem go z pomocą PICKIT3:

Użyłem do tego narzędzia MPLAB X IPE v5.20 na Windowsie:


Ale to jest jednokrotny proces, nie trzeba go powtarzać, więc do korzystania z tego shielda oczywiście nie potrzebujemy programatora PIC.
W razie czego, wsad (plik .hex dla PICa) do pobrania jest tutaj:
A tu jego źródła:
Lutowanie zworek na płytce
Po zlutowaniu płytki trzeba jeszcze dodać kilka zworek.
Pierwsza z nich to wybór pinu TX od UART. Ja wybrałem pin numer 2 z Arduino:

Druga zworka którą musimy zrobić to wybór pinu RX od UART (jest na spodzie PCB); ja wybrałem pin 3:

Ostatnia niezbędna zworka to wybór koloru VGA. Bez niej nie będzie obrazu. Ja wybrałem G - zielony.

Shield na Arduino
Po zlutowaniu wszystkiego, założeniu zworek i wgraniu firmware wystarczy tylko założyć shielda na Arduino i można sterować monitorem z poziomu skeczu, jak również odbierać znaki z klawiatury w skeczu.
Nie potrzeba żadnego lutowania, kabelków, po prostu bierzemy Arduino:

I nakładamy na niego mój shield:

Od tego momentu możemy obsługiwać monitor VGA i klawiaturę PS/2 poprzez bibliotekę Serial (software lub nie; zależy jakie piny wybierzemy) od Arduino.
Dokładna dokumentacja protokołu komunikacji ze shieldem znajduje się tutaj:
Wybór baud rate komunikacji z Arduino
Prędkość komunikacji UART z Arduino wybiera się tak jak w pierwowzorze z pomocą trzech zworek na PCB.
Znajdują się one tutaj:

Wartości poszczególnych ich konfiguracji pokazuje obrazek:

Należy pamiętać by tą samą prędkość komunikacji UART ustawić w naszym kodzie Arduino, w przeciwnym razie shield nic od nas nie odbierze (ani my od shielda).
Organizacja środowiska testów shielda
Chciałbym tutaj tylko podkreślić, że przedstawione tu przykłady naprawdę wymagają do uruchomienia tylko:
- Arduino UNO
- opisanego tu shielda
- zasilacza 5V dla Arduino
- monitora VGA
- klawiatury PS/2
Tak wyglądało to u mnie:

Praktycznie jest to mini-komputerek dla miłośników Arduino:

Zbliżenie na jego serce - mój shield na górze, na spodzie Arduino UNO:

I jeszcze zdjęcie zasilacza, którym zasiliłem Arduino. Zwykła ładowarka od telefonu. Wszystko działa bez komputera w pobliżu.

Mini-program 'Hello world'
Aby ułatwić zainteresowanym rozpoczęcie działania ze shieldem przygotowałem prosty program który realizuje zarówno wyświetlanie tekstu jak i odbiór tekstu z klawiatury.
Uruchamiałem go tak jak na zdjęciach powyżej. Jedynie podpinałem dodatkowo laptopa do Arduino by móc wgrywać skecz.
Przy uruchamianiu programu należy pamiętać o:
- o tym czy piny mySerial RX/TX zgadzają się z tymi na których mamy zworkę na PCB
- o tym czy baud rate ustawiony dla mySerial zgadza się z tym wybranym na PCB zworkami
Zasadniczo to tyle. Nie powinno być trudności z uruchomieniem. Oto kod:
Code: c
Kod korzysta z biblioteki SoftwareSerial aby poprzez piny 2 i 3 Arduino komunikować się ze shieldem. Najpierw wyświetla na nim tekst, a potem nasłuchuje naciśnięć klawiszy od klawiatury PS/2 i w razie takiego naciśnięcia podejmuje akcje.
Rezultat działania:

Po wciśnięciu kilka razy przycisków 1, 2, 3:

Program demonstracyjny
Program demonstracyjny opracowałem samodzielnie od zera w Arduino IDE. Zawiera on mój własny parser wyrażeń matematycznych oraz system rysowania wykresów funkcji na monitorze VGA. Funkcje oczywiście podajemy mu poprzez klawiaturę na PS/2.
Przy podawaniu funkcji obsługiwany jest backspace - można kasować znaki.
Parser wspiera następujące operacje:
- dodawanie, odejmowanie, mnożenie, dzielenie (wraz z kolejnością działań)
- zmienna 'x' (dla obliczania wartości dla x oraz rysowania wykresu)
- funkcja sinus
- stała pi
- różne kombinacje operacji są poprawnie parsowane, również poprawnie parsuje spacje
Główne menu programu prezentuje się tak:

Wybieramy na nim opcje z pomocą klawiszy 1, 2, 3, 4 na klawiaturze PS/2.
Po wyborze opcji 1 (obliczanie funkcji) mamy:

Możemy tu wpisać dowolną funkcję (w ramach tego co wspiera mój parser), przykładowo:

Po zatwierdzeniu enterem możemy podawać wartości X dla których program ma policzyć daną funkcję. Przykładowo:


Wychodzimy z tego z pomocą klawisza Escape.
Po wyborze opcji 2 (rysowanie wykresu) mamy:

Analogicznie, możemy tu wpisać funkcję:

Po zatwierdzeniu klawiszem enter program rysuje jej wykres:

Wybór zakresu wykresu oraz jego przesunięcia nie jest dostępny dla ustawienia dla użytkownika, ale dodanie tego nie jest żadnym problemem. Po prostu zostawiam to jako ćwiczenia dla ewentualnych zainteresowanych moim kodem.
Po wyborze opcji 3 (self-test parsera) mamy:

To jest po prostu mini-test programu na bazie funkcji wpisanych do pamięci. Używałem tego w trakcie pisania kodu do sprawdzania czy wszystko jest okej.
Program demonstracyjny - galeria
Teraz pokażę więcej zrzutów ekranu z mojego programu demonstracyjnego - parsera wyrażeń matematycznych.
Przypominam, że każde pokazane tu wyrażenie jest wpisywane poprzez klawiaturę PS/2 do Arduino, one nie są dane 'na sztywno' w kodzie.
Liczenie wartości funkcji sinus:

Liczenie wartości wielomianu:

Stała pi:

Wykres funkcji liniowej:


Wykres funkcji kwadratowej:


Wykres wyrażenia 4-1 (stała; dla testu parsera):


Wykres funkcji 2*sin(3x):


Wykres funkcji sin(x*x)


Wykres funkcji x * sin(x)


Kod źródłowy programu (.ino) demo do pobrania:
UWAGA: Program demonstracyjny nie posiada obsługi błędów i jego zachowanie w przypadku wpisania niepoprawnego zapisu równania jest niezdefiniowane.
Co można ulepszyć w projekcie?
Propozycji co do ulepszenia shielda z chęcią posłucham od Was, ale mam już pewne wrażenia co można by zmienić:
- można by zamienić miejsca do lutowania (te zworki 'cynowe') na zwykłe zworki, by jeszcze bardziej ułatwić użytkownikom konfigurację shielda
- można by spróbować generować obraz RGB (ale użyłem biblioteki Geoff'a i ona generuje jednokolorowy obraz)
- można by przerobić całość na SMD i na pokładzie zmieścić dodatkowo pamięci
- można by dać stabilizator 3.3V na płytkę shielda by nie przeciążać tego od Arduino
- ostatecznie można by całość przenieść na jakąś lepsza platformę do generowania sygnałów video (FPGA), ale dopiero zaczynam z tym przygodę dzięki pewnej książce...
Z kolei w projekcie parsera matematycznego/rysowania funkcji można by ulepszyć dużo. Kod jego nie był pisany na pokaz, był tworzony na szybko, ale mimo wszystko go tu umieszczam. Może ktoś zechce go ulepszyć.
Podsumowanie
Myślę, że zaprezentowany przeze mnie shield Arduino może być ciekawym projektem nawet dla bardzo początkujących elektroników. Jego uruchomieniu jest bardzo proste a sama obsługa z poziomu Arduino wręcz banalna. Użycie mojego shielda otwiera miłośnikom UNO nowe możliwości i z pewnością daje im szanse na to by lepiej wykorzystali swoje Arduino. Oczywiście zdaję sobie sprawę z tego, że można tworzyć video na samym Arduino (np. biblioteka TVout), ale mój shield to znacznie ułatwia i zmniejsza użycie pamięci względem takich rozwiązań.
Wszystkie pliki projektowe (kody, PCB, źródła płytki) załączam w temacie.
Cool? Ranking DIY