2012-10-26

Duomenų perdavimas Atmega mikrokontroleriui per USB


Visur kompiuteriuose vyraujant USB (angl. universal serial bus) jungčiai, kitos, paprastesnės jungtys kaip LPT ir COM tampa tiesiogine to žodžio prasme – atgyvena. Jau neberasime šių jungčių ir nešiojamuose kompiuteriuose, nebent iškrapštysime kokį seną, kuriame dar buvo. Na, kad stacionariose (desktop) darbo vietose vis dar jos dedamos - ne naujiena, bet galbūt jau nebeilgai? Bet kokiu atveju, progresas vyksta ir toliau jos galų gale liks tik reliktu - istorija. Problema su USB ta, jog sudėtingiau tiesiogiai prijungti išorinę įrangą kaip Atmega ar PIC mikrovaldiklius. Programuoti mikrovaldiklius per COM jau bandėme. Taip pat apžvelgėme, kaip tai būtų galima padaryti naudojant USBasp, tačiau būtų gerai mokėti perduoti duomenis per USB bei valdyti kompiuteriu tą prijungtą įrangą. Derinti mikrovaldiklių programas nėra pats lengviausias užsiėmimas, ypač jei programa blogai veikia, papildoma išvedama informacija kompiuterio ekrane visada praverčia aiškinantis galimus sutrikimus. Mokytis 500 puslapių USB specifikacijos nesinori. Kurti specializuotą techninę įrangą galima, bet ekonomiškumo ir laiko požiūriu – neverta. Galbūt yra kokių altvernatyvų? Šiame straipsnyje kaip tik ir bandysime tai išsiaiškinti bei išmokti, kaip perduoti ir gauti duomenis šią populiariąją USB sąsają į/iš Atmega mikrovaldiklio panaudojant minimalų skaičių diskretinių elektronikos komponentų.


I. Alternatyvos

Prieš imantis veiksmų apžvelkime tas alternatyvas, kurias aš minėjau. Pirmoji alternatyva, nereikalaujanti darbo – tai nusipirkti „USB to TTL UART“ arba kitaip „USB to RSR232” perėjimą iš ebay.com. Problema iškart išspręsta, tereikia šiek tiek investuoti. Gausime ne tokią sparčią kaip USB, bet vis gi nuoseklią USART sąsają, su kuria gana paprasta dirbti. Straipsnio rašymo metu peržiūrėjęs ebay.com radau gausybę pasiūlymų. Jei galite pirkti internetu, o laiko trūksta, galima pasirinkti šią alternatyvą.


Kita, kiek įdomesnė alternatyva – programiškai realizuoti ir emuliuoti USB protokolą pačiame Atmega mikrovaldiklyje! Tam viso labo tereikia turėti daugiau laisvos vietos (~2KB) mikrovaldiklio atmintyje ir porą diskretinių elektronikos komponentų. Bet kaip gi emuliuoti USB protokolų steką nežinant nei specifikacijos nei kitų USB realizacijos dalykų? Gali nuskambėti ir pasirodyti iškart labai baisiai ir pan. nors iš tikrųjų taip nėra. Jei teko susidurti su USBasp programatoriumi, kuriuo programuojama per USB sąsają, tai galbūt įsivaizduojate, kur lenkiu. Pasirodo, jog tiek USBasp, tiek mūsų atveju, reikia pasinaudoti jau kažkieno kito sukurta programine (virtualia) USB steko realizacija, kuri emuliuoja techninės įrangos darbą. Paieškojus internete, tokių realizacijų tikrai galima rasti. Populiariausia V-USB bei LUFA, beje pirmąją naudoja ir USBasp programatorius. Galime pabandyti pasižiūrėti, kaip tai būtų galima įgyvendinti.

II. Realizacija


Bandoma schema labai paprasta (pateikta viršuje). Kompiuteriu valdysime vieną LED diodą perduodant komandas Atmega mikrovaldikliui per USB sąsają. Kompiuteryje naudosime libUSB biblioteką ir C kalba parašytą valdymo programą (klientą). Toliau tarp PC ir Atmega yra minimali USB signalo įtampos lygius sutvarkanti schema (panaši į V-USB pateikiamą pavyzdžiuose) iš diskretinių komponentų. Mikrovaldiklyje naudosime specialią V-USB steko realizaciją. Tam teks paaukoti šiek tiek Flash atminties, bet užtant galėsime naudotis USB funkcionalumu! Valdiklio kodą kompiliuosime kartu su lemputės įjungimo/išjungimo logika.
Apžvelgsime visus etapus, kurių reikia, jog sėkmingai sujungtume Atmega ir PC per USB sąsają. Šiam darbui bus reikalinga labai minimali įranga, t.y. USB perduodamų signalų suvienodinimo iki Atmega mikrokontrolerio schema (žr. žemiau). Atmega bus maitinama per USB +5V liniją, todėl jokių papildomų šaltinių nereikia. Pora 3.6V stabilitronų duomenų linijose suvienodina įtampą iki reikiamo lygio. Kondensatorius C1 grandinėje yra papildoma apsauga nuo įtampos šuolių, rekomenduojamas, tačiau nėra būtinas.


Taigi turime užprogramuoti Atmegą ir tada sujungti schemą bandymui. Pirmiausia reikia parsisiųsti V-USB biblioteką. Straipsnio rašymo metu naujausia buvo vusb-20120109 versija. Joje yra visas reikalingas virtualaus steko kodas (firmware), kurį reikia įrašyti į mikrovaldiklio Flash atmintį. Pabandymui pasirinksime jau pateikiamus pavyzdžius iš „examples/custom-class“ direktorijos. Custom-class pavyzdys, tai LED diodo valdymo per komandinę eilutę programa. Sutrumpintas ir sutvarkytas kodo variantas taip pat pateikiamas ir straipsnio pabaigoje.
Pirmiausia sukompiliuosime mikrovaldiklio „firmware“ kodą. Tam mums reikės parsisiųsti WinAVR bibliotekas Windows sistemai, jei dar neturite. Straipsnio rašymo metu buvo prieinama WinAVR-20100110 versija. Rekomenduojama įsidiegti į „C:\WinAVR“ direktoriją ar pan. 
Prieš kompiliuojant kodą mikrovaldikliui, reikia sukonfigūruoti programos nustatymus. Jeigu LED diodą prijungėte prie kito nei pavaizduota PB0 išėjimo, tai faile „examples\custom-class\firmware\main.c“ būtina pakoreguoti LED_PORT_DDR, LED_PORT_OUTPUT ir LED_BIT reikšmes. Makefile dokumente būtina pasikeisti nustatymus. Pakeičiame DEVICE į „atmega8” arba kitą, kurią naudojate. F_CPU reikia nurodyti išorinio rezonatoriaus (kvarco) taktinį dažnį, būtinai ne mažesnį nei 12MHz, kadangi tai minimalus dažnis, su kuriuo veikia V-USB virtualus stekas. Taip pat reikia nustatyti ir FUSE bitų reikšmes, jos duotos žemiau tame pačiame faile. Mano atveju viską suderinau atmega8 mikrovaldikliui. Be to, priklausomai nuo turimo programatoriaus, reikia pakeisti programatoriaus pavadinimą, vietoj „usbasp“ įrašyti atitinkamą savo, o jei turite USBasp, tai nieko keisti nereikia. Mano konfigūracija atrodo taip:

DEVICE  = atmega8
F_CPU   = 12000000  # in Hz
FUSE_L  = 0x9f  # see below for fuse values for particular devices
FUSE_H  = 0xc9
AVRDUDE = avrdude -c usbasp -p $(DEVICE) # edit this line for your programmer

Na štai, dabar bus galima kompiliuoti. Atsidarome konsolės langą toje pačioje direktorijoje: "examples\custom-class\firmware" ir naudojame tokias komandas (jose atitinkamai reikia pasikeisti kelią iki WinAVR make programos):

"C:\WinAVR\utils\bin\make" clean
"C:\WinAVR\utils\bin\make" hex

Jei viskas pavyko, rezultatai turėtų atrodyti maždaug taip, kaip pateikta žemiau.


Toliau galime prijungti programatorių prie Atmega ir PC bei įrašyti į Flash atmintį .hex failo turinį su žemiau pateikta komanda (rezultatai paveiksle toliau). Fuse bitai įrašomi taip pat panašiai. Šių bitų įrašymą galima praleisti, jei mikrovaldiklis jau dirba su išoriniu kvarciniu rezonatoriumi. 
PASTABA: prieš FUSE bitų įrašymą būtina prijungti kvarcinį rezonatorių prie atmega mikrovaldiklio, nes bitai nustato, jog toliau atmega naudos išorinį taktų generatoriaus šaltinį, to nepadarius - teks ieškoti dirbtinio taktų generatioriaus ar pan., jog atgaivinti atmega mikrovaldiklį.

"C:\WinAVR\utils\bin\make" flash
"C:\WinAVR\utils\bin\make" fuse


Programą sėkmingai įrašius belieka kita dalis – sukompiliuoti klientinę, kompiuteryje veikiančią, testinę programą, su kuria komunikuos mikrovaldiklis. Šiam etapui bus reikalinga MinGW aplinka bei reikės įsirašyti libUSB biblioteką. Kaip tai padaryti rasite čia. Jei naudojate Linux, tai viskas labiau supaprastėja ir tereikia įsirašyti libUSB biblioteką (Debian atveju: apt-get install libusb-dev). Pasiruošus ir pasileidus MinGW konsolę galima sukompiliuoti programą komanda pateikta žemiau.  Linux naudotojams užteks parašyti tiesiog - make.

            make –f Makefile.windows


Sėkmingai viską įvykdžius, galima ištestuoti. Nepamirštam prijungti atmegos prie PC per USB taip, kaip parodyta schemoje aukščiau. Paleidus klientinę set-led programą per komandinę eilutę (Linux vartotojai tegul nepamiršta root „sudo“ teisių) galima pasinaudoti trimis komandomis: on, off, status. Jei gaunate klaidą, tai dažniausiai reiškia, jog nerandama prijungto įrenginio – tada pasitikrinkite, ar teisingai viskas sujungta, ar visi prieš tai buvę etapai buvo sėkmingi.


Demonstracija, kaip viskas veikia - video žemiau.


IV. Pabaigai

Reikia nepamiršti, jog V-USB naudoja GPL licenziją, todėl komerciniuose projektuose tikrai negalėsite jos panaudoti, nebent nusipirksite. Tačiau mėgėjiškiems pasižaidimams ir komunikacijai tarp įrenginių puikiai tinka. Dar taip pat galite pasinaudoti ir anksčiau minėta LUFA biblioteka, kuri turi liberalesnę MIT licenziją. Kaip naudotis LUFA galbūt apžvelgsiu sekančiuose straipsniuose ateityje. Tikiuosi, jog nuo šiol galėsite visus duomenis matyti kompiuterio ekrane bei valdyti bet kokią sistemą! Sėkmės.

Download - project source code

Komentarų nėra:

Rašyti komentarą