Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Pierwsze urządzenie USB HID na mikrokontrolerze PIC (przewodnik)

mi_ma 06 Nov 2014 21:10 4821 0
e-mierniki
  • Pierwsze urządzenie USB HID na mikrokontrolerze PIC (przewodnik)
    W sieci coraz częściej można znaleźć urządzenia USB oparte na mikrokontrolerach. Poniżej przedstawiam wam przewodnik z waitngforfriday.com, który pokazuje krok po krok jak zbudować swoje własne urządzenie USB w oparciu o mikrokontroler z rodziny PIC. Ze względu na dużą wartość merytoryczną zamieszczam całość artykułu w języku polskim, na wypadek, gdyby jednak kiedyś strona źródłowa nie była dostępna. Mam nadzieję, że przyda się wszystkim tym, którzy przede wszystkim rozpoczynają przygodę z mikrokontrolerami PIC.

    Pierwsze urządzenie USB HID na mikrokontrolerze PIC (przewodnik)

    Autor po sukcesie swoich projektów takich jak adapter joysticka na USB do Atari czy emulatora C64 VICE Front-End otrzymał wiele maili z zapytaniami o tworzenie urządzeń USB HID w oparciu o mikrokontroler z rodziny PIC18F. Poniższy przewodnik jest odpowiedzią na te prośby i pokazuje jak w oparciu niewielki zestaw startowy zbudowany w oparciu o płytkę uniwersalną stykową zbudować własne urządzenie USB komunikujące się z Windowsowym oprogramowaniem. Demonstracyjnie urządzenie steruje diodą LED i odczytuje stan naciśnięcia przycisku na płytce. Taki prosty projekt pozwoli poznać podstawy budowy urządzeń USB HID. Ich zaletą jest niewątpliwe brak konieczności tworzenia dodatkowych sterowników. Same urządzenie zaczyna działać po podłączeniu bez konieczności wykonywania dodatkowych instalacji.

    Konstrukcja zestawu startowego jak wcześniej wspomniałem jest oparta o płytkę uniwersalną stykową, aby umożliwić początkującym łatwe i szybkie rozpoczęcie zabawy z przewodnikiem. Zawiera ona jedynie kilka elementów, w tym mikrokontroler Microchipa PIC18F4550. Kody źródłowe zostały opracowane w środowisku MPLAB z kompilatorem C18. Oprogramowanie dla Windowsa zostało stworzone z użyciem Visual C# 2010 express. Wszystkie te narzędzia są darmowe i można je bez przeszkód ściągnąć z sieci. Do programowania PICa będzie niezbędny programator. W tym wypadku użyty został Pickit3. Z pewnością jeżeli macie dostęp do jednego z klonów lub Pickit3, to też uda wam się zaprogramować mikrokontroler.

    Pomimo, że projekt został zbudowany w oparciu o mikrokontroler PIC18F4550, to można w jego zastępstwie użyć mikrokontrolera PIC18F2550. Projekt zaczynamy od budowy zestawu startowego zbudowanego zgodnie z zamieszczonym poniżej schematem.

    Pierwsze urządzenie USB HID na mikrokontrolerze PIC (przewodnik)

    Na płytce wyprowadzone jest złącze do programowania, gniazdo USB typu B oraz zamontowane są dioda i przycisk. Zestaw zasilany jest bezpośrednio z portu USB i nie wymaga dodatkowych źródeł zasilania. Zastosowany kondensator C3 o pojemności 470nF jest wymagany do poprawnej pracy wbudowanego interface'u USB PICa. W tym wypadku można wykorzystać jakikolwiek kondensator w zakresie 220nF do 470nF.
    W projekcie wykorzystano też zewnętrzny oscylator 20MHz, który jest także niezbędny do poprawnej pracy komunikacji po USB.
    Na poniższym zdjęciu pokazany jest montaż na płytce stykowej z opisem elementów. Do programowania PICa, także nie potrzeba dodatkowego zasilania, ponieważ jest on programowany wprost z programatora (5V). Nie zaleca się jednoczesnego podłączenia do portu USB i programatora.

    Pierwsze urządzenie USB HID na mikrokontrolerze PIC (przewodnik)

    Jeżeli nie posiadacie złącza USB przystosowanego do montażu na płytce stykowej, to możecie sami wykonać adapter w oparciu o niewielką płytkę uniwersalną. Nie jest to trudne i warto poświęcić chwilę czasu aby zrobić w miarę porządnie unikając później problemów z zakłóceniami w transmisji na obluzowanym złączu narażonym na dodatkowe naprężenia od przewodu podłączonego do komputera. Dla pewności poniżej zamieszczony jest schemat połączeń na kablu USB i gnieździe.

    Pierwsze urządzenie USB HID na mikrokontrolerze PIC (przewodnik)

    Maksymalne napięcie na płytce wynosi 5V, tak więc wszystkie elementy muszą być dopasowane do pracy z napięciem takim lub wyższym. Rezystory o mocy 1/4W będą w tym wypadku wystarczające.

    Po złożeniu zestawu startowego i dokładnym sprawdzeniu czy nie ma żadnych zwarć można przystąpić do programowania. Autor napisał krótki program demonstracyjny, która ma pomóc w nauce. Program ma wykonywać dwa ważne zadanie opisane poniżej:

    Wyliczanie urządzenia:

    Pierwszym krokiem jest wyliczanie urządzenia USB. Jest to nic innego jak komunikacja inicjująca pracę urządzenia z hostem USB. Urządzenie informuje host kim jest i w jaki sposób chce się skomunikować. Komunikacja USB realizowana jest poprzez "endpoint'y", które wysyłają informację zarówno do hosta jak i do podłączonego urządzenia. Oprócz ustawienia kanałów komunikacyjnych, urządzenie musi przekazać swoją nazwę oraz dwie istotne wartości VID i PID

    VID (Vendor ID) identyfikuje producenta urządzenia. Aby uzyskać swój unikalny VID należy zapłacić tysiące dolarów. Ale ponieważ programujemy mikrokontroler Microchipa, możemy wykorzystać jego VID. Jeżeli jednak urządzenie miałoby wejść do powszechnego użytku i być masowo produkowane, to niestety, będzie trzeba taki VID opłacić i uzyskać. Na potrzeby nauki i projektów hobbystycznych nie należy się jednak tym interesować.

    PID (Product ID) identyfikuje urządzenie. Razem z VID obie zmienne są unikalne dla naszego urządzenia. Po pierwszy wyliczeniu urządzenia, Wnidows zapamięta i będzie przechowywał VID i PID, aby w przyszłości skrócić czas jego uruchamiania. Jeżeli będziemy modyfikować oprogramowanie (np. dodawać więcej endpointów) to bardzo ważne jest zmienianie numeru PID. W przeciwnym wypadku próba podłączenia nie powiedzie się i będą wyskakiwały komunikaty błędów.

    Komunikacja z hostem:

    Jest to drugie istotne zadanie w całym programie. Komunikacja odbywa się poprzez odpowiednie standardowe komendy wysyłane do hosta, które mówią w jaki sposób interpretować przesyłane dane.
    Okresowo host będzie także wysyłał określone żądania do urządzenia. Jeżeli przyjżycie się zamieszczonemu kodu źródłowemu, to zauważycie, że jego główna część zajmuje się obsługiwaniem właśnie poleceń przesyłanych od hosta.

    Opisany wyżej program jest przeznaczony dla kompilatora C18 i prawdopodobnie nie będzie działał z innymi kompilatorami. Zostało stworzone w oparciu o stos USB Microchipa. Aby zainstalować program na mikrontrolerze należy utworzyć katalog, w którym umieszczone zostaną biblioteka oraz kod. Następnie należy uruchomić instalator Microchip Application Library i wybrać w naszym katalogu jako docelowy dla "Microchip Solutions v2011-07-14". Instalator biblioteki jest dostępny tutaj: http://ww1.microchip.com/downloads/en/softwar...n-libraries-v2011-07-14-windows-installer.exe .

    Następnie należy skopiować archiwum zip z oprogramowaniem (patrz na dole w linkach) i dekompresować go z użyciem bibliteki. Jeżeli wszystko pójdzie jak należy, powinniśmy widzieć dwa podkatalogi w tym samym katalogu o nazwach "Microchip Solutions v2011-07-14" i "WFF Generic HID Demo 3". Należy wejść do katalogu "WFF Generic HID Demo 3" i załadować plik projektu WFF_GenericHID_Demo_3.mcp. Nastepnie przy użyciu MPLABa należy program skompilować i wgrać na PICa.

    Jeżeli lokalizacje względnych ścieżek zmienią się lub będzie problem z ich odnalezieniem przez MPLAB, to można je zawsze wskazać ręcznie poprzez ustawienia w MPLABie Project -> Build Options Project -> Directories -> Include search path.

    W trakcie wykonywania powyższych czynności mogą pojawić się pewne problemy. Po pierwsze, bardzo ważne jest aby application library zainstalować w katalogu "Microchip Solutions v2011-07-14". Po drugie nie ma prostego sposobu na używanie ścieżek względnych dla plików w MPLABie (co jest dziwne zważywszy na to, że Application Library zmusza nas do ich używania). Bywa tak, że po otwarciu projektu część plików jest pokazywana jako brakujące. Wtedy należy każdy plik z osobna dołączyć do projektu.

    Wracając do samego kodu. W oprogramowaniu użyte są trzy komendy:


    0x80 - włącz diodę LED
    0x81 - odczytaj stan przycisku
    0x82 - odczytaj stan diody LED

    Instrukcje tych komend są zawarte w pliku main.c w funkcji processUsbCommands(), która jest odpowiedzialna za obsługę interpretowania danych przychodzących i wysyłania danych. Kod jest w zasadzie prosty. Jedynym dodatkowym zadaniem jest sprawdzanie czy urządzenie jest podłączone i czy host pozytywnie zakończył wyliczanie urządzenia.

    Funkcja main przywołuje stos USB do wykonywania zadań nisko poziomowych a następnie wywołuje funkcję processUsbCommands i tak w kółko. Program może wykorzystywać zarówno przerwania jak i pętle while(). Definicje zawarte w pliku HardwareProfile.h kontrolują sposób obsługi programu.

    Aby zrozumieć proces wyliczania urządzenia należy przyjrzeć się plikowi usb_descriptors.c oraz HardwareProfile.h, które zawierają informacje w jaki sposób urządzenie jest akceptowane przez host przy pierwszym podłączeniu. W pliku znajdziecie informacje na temat VID i PID oraz konfiguracji deskryptorów, które są przekazywane do hosta celem określenia typu interface'u, określają nazwę producenta i urządzenia (które później są przez Windows wyświetlane w nazwie urządzenia USB).
    Aby zrozumieć w pełni proces wyliczania urządzenia dobrze jest skorzystać z fachowej literatury. Autor tutaj wskazuje na książkę Jan Axelson'a "USB Complete - Everything you need to develop custom USB peripherals" (ISBN 978-1931448086). Znajdziecie tam też wszystkie niezbędne informacje do pracy nad urządzeniami wykorzystującymi komunikację USB.

    Po zaprogramowaniu mikrokontrolera przyszedł czas na podłączenie go do komputera. Windows 7 powinien bez problemu wykryć naszą płytkę startową i jak zwykle poinformować nas o instalacji nowego urządzenia.

    Pierwsze urządzenie USB HID na mikrokontrolerze PIC (przewodnik)

    W przypadku Windowsa 7 urządzenie pojawi się w zakładce "drukarki i urządzenia" dostępnej z menu start.

    Pierwsze urządzenie USB HID na mikrokontrolerze PIC (przewodnik)

    W ten sposób zakończyliśmy część związaną z instalowaniem sprzętu i czas rozpocząć pracę z nim poprzez oprogramowanie hosta stworzonym w Microsoft Visual C# 2010. Domyślnie dioda LED jest ustawiona na włączoną, tak więc po podłączeniu powinna świecić.
    Oprogramowanie hosta jest oparte na bibliotece open-source Generic HID autora. Wszelkie informacje o tym jak działa znajdziecie tutaj:

    http://www.waitingforfriday.com/index.php/Ope...c_HID_devices_based_on_the_PIC18F_and_Windows

    Program składa się w zasadzie z trzech części odpowiedzialnych za:
    - monitorowaniu czy urządzenie USB jest podłączone do komputera i nadzorowaniu połączenia
    - wyświetlaniu i kontrolowaniu interface'u użytkownika
    - komunikowaniu się z urządzeniem USB i aktualizowaniu statusu urządzenia.

    Aby uruchomić program należy go otworzyć w VS 2010, skompilować i uruchomić z poziomu środowiska. Po uruchomieniu powinniśmy zobaczyć następujące okno:

    Pierwsze urządzenie USB HID na mikrokontrolerze PIC (przewodnik)

    Jeżeli chcecie zobaczyć czy wykrywanie urządzenia działa prawidłowo po prostu je odłączcie. Wtedy w oknie pojawi się odpowiednia informacja:

    Pierwsze urządzenie USB HID na mikrokontrolerze PIC (przewodnik)

    Po ponownym podłączeniu możecie rozpocząć zabawę. Naciskanie przycisku Toogle LED State powinno zapalać i gasić diodę jednocześnie aktualizując jej status w oknie, natomiast naciskanie przycisku na płytce startowej powinno być w polu Push-button state także odnotowywane.

    I to by było na tyle. Zarówno kod źródłowy do mikrokontrolera jak i program hosta może wam posłużyć za bazę do własnych projektów. Możecie go dowolnie rozwijać i eksperymentować, powodzenia. Poniżej zamieszczam niezbędne linki, a także na wszelki wypadek pliki do pobrania bezpośrednio z naszego forum.

    Mam prośbę do osób czytających artykuł. Jest on dość obszerny i może nie być pozbawiony błędów i niejasności. Zamiast dawać wyraz niezadowolenia w dyskusji forumowej lub zgłoszeniach do moderatorów proszę o kontakt z konstruktywną krytyką lub zapytaniami do mnie na PW. W wolnej chwili sam przetestuję ten poradnik i postaram się dopracować go tak, aby był jak najbardziej przydatny użytkownikom elektrody. Spostrzeżenia innych doświadczonych użytkowników są jak najbardziej mile widziane, zwłaszcza jeżeli pozwolą ten artykuł dopracować. Zachęcam do konstruktywnej współpracy:)

    Źródło http://www.waitingforfriday.com/index.php/Building_a_PIC18F_USB_device
    Program PICa http://www.waitingforfriday.com/images/a/a6/WFF_Generic_HID_Demo_3_firmware.zip
    Mirochip Application library http://ww1.microchip.com/downloads/en/softwar...n-libraries-v2011-07-14-windows-installer.exe
    Program Hosta http://www.waitingforfriday.com/images/3/36/WFF_Generic_HID_Demo_3.zip
    biblioteka USB Generic HID http://www.waitingforfriday.com/index.php/Ope...c_HID_devices_based_on_the_PIC18F_and_Windows

    Cool? Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    mi_ma
    Translator, editor
    Offline 
    Has specialization in: elektronika wojskowa
    mi_ma wrote 831 posts with rating 789, helped 0 times. Live in city Wrocław. Been with us since 2006 year.
  • e-mierniki