AS-0.3200 Automaatio- ja systeemitekniikan projektityöt (6op) 16.09.2008-19.12.2008 A15 - Inertial Measurement Unit Mikko Virkkilä <mvirkkil@cc.hut.fi> Aki Juutistenaho <atjuutis@cc.hut.fi> Ohjaaja: Tapio Taipalus <tapio.taipalus@tkk.fi>
Johdanto... 3 Tehtävän kuvaus... 3 IMUn käyttö... 3 Mikrokontrollerin pakettirajapinta... 3 Mikrokontrollerin SPI-over-UART rajapinta... 4 C API... 4 Yksinkertaisen visualisoinnin API... 4 Ongelmatilanteissa huomioitavaa... 4 Mekaniikan toteutus... 4 Mikrokontrollerin ohjelmisto... 5 Käännösympäristö ja kirjastot... 5 Ohjelmiston sisäinen toiminta... 5 Havaitut ongelmat ja niiden ratkaisut... 6 Viitteet... 6
Johdanto jotain diibadaabaa projektin yleiskuvauksesta Tehtävän kuvaus IMUn käyttö Mikrokontrollerin pakettirajapinta Yhtenä tavoitteena oli tehdä IMU:sta yksinkertainen käyttää. Tätä tarkoitusta varten implementoitiin pakettirajapinta, jonka avulla IMU:n kaikki mittausarvot saa helposti siirrettyä tietokoneelle. Pakettirajapinta koostuu seuraavista kolmesta komentotavusta: 0x4F - O nce Lähetä yksi datapaketti 0x43 - C ontinuous Lähetä datapaketteja mahdollisimman useasti 0x53 - S top Lopeta datapakettejen jatkuva lähetys Datapaketti koostuu kahdestatoista kaksitavuisesta sanasta, eli yksi paketti on 24 tavua pitkä. Paketin sanat ovat big-endian muodossa, CRC sanaa lukuunottamatta. Paketin sisältö on seuraava: Sanan Lyhenne Kuvaus numero 0 header Yhden tavun tunnistetavu joka helpottaa epäsynkroniseksi tulleen liikenteen uudelleensynkronointia. Arvo on aina 0xF0F0 1 x accel X akselin kiihtyvyysanturin mittausrekisterin arvo 2 x gyro X akselin kulmanopeusanturin mittausrekisterin arvo 3 x temp X akselin kulmanopeusanturin lämpötilarekisterin arvo 4 y accel Y akselin kiihtyvyysanturin mittausrekisterin arvo 5 y gyro Y akselin kulmanopeusanturin mittausrekisterin arvo 6 y temp Y akselin kulmanopeusanturin lämpötilarekisterin arvo 7 z accel Z akselin kiihtyvyysanturin mittausrekisterin arvo 8 z gyro Z akselin kulmanopeusanturin mittausrekisterin arvo 9 z temp Z akselin kulmanopeusanturin lämpötilarekisterin arvo 10 timestamp Aikaleima, yksikkönä 64us 11 crc XMODEM CRC, erikoisuutena on että muista poiketen tämä sana on little endian muodossa eli tavut ovat käänteisessä järjestyksessä.[xcrc] Tarkemmat kuvaukset mittausrekistrekisterikenttien skaalauksista löytyy mittaussensorin datalehdestä.
Mikrokontrollerin SPI over UART rajapinta ADIS16350 sensorissa on useita konfigurointirekistereitä joiden avulla sensorin käyttäytymistä voidaan muuttaa. Esimerkiksi mittaustietosuotimen parametreja, mittaustaajuutta ja kalibrointiarvoja voidaan haluta säätää. Käytännössä kaikkia mahdollisia käyttötarpeita ei voida ennakoida, joten mikrokontrollerille implementoitiin raaka SPI viestien välitys moodi. Kun mikrokontrolleri tunnistaa että sille on lähetetty 16bit SPI komento (toinen bitti on alhaalla, kts ADIS 16350 datasheet), lähettää mikrokontrolleri sen ADIS 16350 sensorille sellaisenaan. Samalla se vastaanottaa edellisen viestin vastauksen, jonka se vuorostaan kirjoittaa USB sarjaporttiin. Mikrokontrolleri osaa erottaa ASCII komennot ja SPI komennot toisistaan automaattisesti. Kaikki SPI:n käytön yksityiskohdat löytyvät sensorin datalehdestä. C API Yksinkertaisen visualisoinnin API Ongelmatilanteissa huomioitavaa NetworkManagerin uusimmat versiot saattavat tunnistaa IMU:n usb modeemina, avata portin ja saada virheellisen vastauksen johtaen NetworkManagerin kaatumiseen ja IMU:n jäämiseen epämääräiseen tilaan. NetworkManager kannattaa ottaa pois käytöstä ennen IMU:n yhdistämistä PC:hen. Komentona voi toimia esim sudo /etc/init.d/networkmanager stop Mekaniikan toteutus AVR USB laudan portit alla olevassa taulukossa ovat numeroitu alkaen yhdestä, kuten piirilevyyn on painettu. Tämä poikkeaa kuitenkin AT90USB162 omasta dokumentaatiosta jossa portin pinninumerointi alkaa nollasta. IMU-piirin pinni 6 ei ole kytketty mihinkään, joten sitä ei reititetä AVR:lle. Toiminto AVR USB Johtimen väri IMU piirilevy Chip Select Port B Pin 1 Valkoinen Pin 4 Clock Port B Pin 2 Oranssi Pin 2 Master out, slave in Port B Pin 3 Vihreä Pin 1 Master in, slave out Port B Pin 4 Ruskea Pin 3 IMU Reset Port B Pin 5 Violetti Pin 5 Käyttöjännite VCC Sininen Pin 7 Maa GND Musta Pin 8
Mikrokontrollerin ohjelmisto Käännösympäristö ja kirjastot Yksinkertaisuudessaan projektin pitäisi kääntyä ja asentua AT90USB162 kontrollerille menemällä lähdekoodihakemistoon Projects/IMU ja komentamalla make flip. Tämä olettaa tietenkin että käännösympäristö on kunnossa ja että AT90USB162 on käynnistetty ohjelmointimoodiin. AT90USB162 käynnistyy ohjelmointimoodiin (dfu device firmware upgrade) kun HWB nappi on pohjassa käynnistyessä. Ohjelmiston kääntämiseen käytettiin standardia avr-gcc toolchainia, lopullinen koodi käännettiin Windowsilla käyttäen versiota WinAVR julkaisua 20080610 [wavr]. Mitään muutoksia kyseiseen asennukseen ei tarvinnut tehdä. WinAVR:n mukana tulevan avr-libc kirjaston lisäksi projektissa käytettiin USB kirjastona MyUSB 1.5.3. Kirjastoon ei tehty muutoksia. Oma projektimme rakennettiin MyUSB:n Projects/IMU hakemistoon. Käännetyn ohjelmiston siirtämiseen PC:ltä AT90USB162 piirille käytettiin Atmel Flip ohjelmaa jonka havaittiin toimivan luotettavammin kuin Linuxin dfu-programmer. Mikrokontrollerin ohjelmiston sisäinen toiminta Ohjelmisto on rakennettu MyUSB:n mukana tulevan CDC (usb sarjaportti) esimerkin päälle ja käytännössä kaikki sarjaportin hallintaan liittyvä on suoraan CDC esimerkkikoodia. Koodissa on kaksi pääkäsittelijää, keskeytysten käsittelijä ja sarjaportin käsittelijä. Sarjaportin käsittelijä Sarjaportin käsittelijä on kahdesta huomattavasti yksinkertaisempi. Sen tehtävänä on vain kopioida sisäisestä lähetyspuskurista dataa sarjaporttiin, ja lukea tulevaa data. Tulevasta datasta se päättelee, että onko kyseessä SPI viestin ensimmäinen tavu vai ASCII komento. Mikäli kyseessä on SPI komennon ensimmäinen tavu, se poimii tavun muistiin ja asettaa lipun WAITING_FOR_DATA. Seuraavan tavun vastaanoton kohdalla käsittelijä näkee WAITING_FOR_DATA lipun ja tietää, että kyseessä on SPI komennon jälkimmäinen tavu. Kun jälkimmäinen tavu on vastaanotettu, molemmat tavut kirjoitetaan SPI komentojen lähetyspuskuriin (josta ne myöhemmin lähetetään sensorille). Kun kyseessä on ASCII komento C asetetaan tilamuuttujaan CONTINUOUS_MODE lippu päälle ja herätetään SPI käsittelijä kirjoittamalla SPI viestin ensimmäinen tavu. Kun kyseessä on
Havaitut ongelmat ja niiden ratkaisut Viitteet [xcrc] http://www.nongnu.org/avr-libc/user-manual/group util crc.html [wavr] http://downloads.sourceforge.net/winavr/winavr-20080610-install.exe