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į.
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
Download - project source code
Komentarų nėra:
Rašyti komentarą