Lappeenrannan teknillinen yliopisto Raportti LUT Energia Säätö- ja digitaalitekniikan laboratorio BL40A0901 Sulautettujen järjestelmien seminaarikurssi 2.12.2011 Legoajoneuvon ohjelmistorakenne ja ohjaussovellus 0281064 Henri Montonen, SÄTE N
1 SISÄLLYS 1 LEGO MINDSTORMS... 2 1.1 Käyttöjärjestelmä... 2 1.2 Liitettävyys... 3 1.2.1 Liitettävyys MATLABiin... 4 1.2.2 Esimerkki ulkoisen laskennan liittämisestä NXT:hen... 4 1.3 Antureita... 5 2 CASE LUISTONESTO... 6 2.1 Vaatimusmäärittely... 6 2.2 Toiminnallinen määrittely... 7 2.3 Tekninen määrittely... 8 3 SOVELLUSESIMERKKI... 9 3.1 Ympäristö... 9 3.2 Koodiesimerkki... 10 4 YHTEENVETO... 11 Lainatut lähteet... 12
2 1 LEGO MINDSTORMS Lego Mindstorms on Legon valmistama tuotesarja, joka sisältää ohjelmoitavan keskuspalikan (NXT) ja joukon siihen liitettäviä laitteita. Kuva 1 Lego Mindstorms NXT yhdistettynä ultraäänianturiin ja kolmeen askelmoottoriin NXT sisältää ARM7-suorittimen, neljä I 2 C sisääntuloa, kolme I 2 C lähtöä, USB-portin ja Bluetooth yhteyden. Kuvassa 1 NXT:n on liitetty ultraäänianturi ja kolme askelmoottoria. Askelmoottoreista kaksi pyörittää telaketjuja. Ultraäänianturia voidaan käyttää esteiden tunnistamiseen ja etäisyyden mittaamiseen. (Chikamasa, 2010) 1.1 Käyttöjärjestelmä Tässä tapauksessa Legon oman, rajoitteisen, käyttöjärjestelmän rinnalle on asennettu kolmannen osapuolen käyttöjärjestelmä nxtosek. nxtosek mahdollistaa NXT:n ohjelmoimisen C- tai C++kielellä. Käyttöjärjestelmä tarjoaa valmiit rajapintafunktiot NXT:n antureille ja moottoreille, jolloin ohjelmoijan ei tarvitse perehtyä suorittimen rekisterien muokkaukseen. Kuva 2 nxtosek-käyttöjärjestelmän osat
3 nxtosek koostuu kuvan 2 mukaisesti lejosnxj:stä, TOPPERS/ATK:sta ja TOPPERS/JSP:stä. lejos NXJ toimii ajurina tietokoneen ja NXT:n välillä. TOPPERS/ATK ja TOPPERS/JSP tarjoavat reaaliaikakäyttöjärjestelmän. TOPPERS/JSP sisältää lisäksi porttauksen NXT:n ARM7 prosessorille (ATMEL AT91SAM7S256). (Chikamasa, 2010) Näiden lisäksi NXT:hen on asennettu kolmannen osapuolen firmware, joka mahdollistaa nxtosek:in käytön. Asennettu firmware on John Hansen s Enhanced NXT firmware, joka sallii useiden nxtosek-sovellusten asentamisen mutta rajoittaa sovelluksen suurimman koon 64 kilobittiin. Toinen vaihtoehto olisi NXT BIOS:in käyttäminen. Tätä vaihtoehtoa käytettäessä NXT:llä voi olla vain yksi nxtosek-sovellus, mutta sen suurin koko voi olla 224 kilobittiä. Käytettäessä kumpaa tahansa firmwarea sovellus ladataan NXT flash-muistiin. Kolmas tapa on ladata sovellus NXT:n RAM-muistiin. Tätä tapaa käytettäessä vain yksi sovellus voidaan ladata muistiin ja sen koko on rajoitettu 64 kilobittiin. (Chikamasa, 2010) 1.2 Liitettävyys NXT:ssä on 4 sisääntuloa antureille ja 3 ulostuloa toimilaitteille, sekä USB-portti tietokoneyhteyttä varten. Lisäksi NXT voidaan liittää Bluetoothin avulla toiseen NXT:hen, tietokoneeseen tai matkapuhelimeen. Anturit ja moottorit liitetään NXT:hen RJ12-liittimillä. Liittimessä on analoginen sekä digitaalinen liityntä. Digitaalinen liityntä on I 2 C sekä RS-485 yhteensopiva. Liittimen pinnijärjestys on esitetty taulukossa 1. Taulukko 1 NXT:n sensoriliitäntöjen pinnijärjestys (Wikipedia, 2011)
4 1.2.1 Liitettävyys MATLABiin NXT voidaan liittää MATLABiin, jolloin sitä voidaan ohjelmoida ja komentaa suoraan MATLABista. Tarvitaan vain RWTH Aachen MINDSTORMS NXT Toolbox. Toolboxin avulla voi ohjelmoida NXT:tä ilman muita ohjelmia, visualisoida NXT:n sensoridataa, kehittää graafisia käyttöliittymiä NXT:n hallintaan. Yhteytenä toimii USB tai Bluetooth. Vaativampaan käyttöön sopii paremmin Embedded Coder Robot (ECRobot) Target, joka tarjoaa valmiin kirjaston Simulink-lohkoja NXT:n sensoreita ja toimilaitteita varten. Sovellusta voidaan kehittää ja simuloida tietokoneella, jonka jälkeen se voidaan kääntää ja ladata NXT:lle. Tällöin NXT on vapaa toimimaan itsenäisesti ilman rajoittavaa USB-johtoa tai Bluetooth-yhteyttä. (Mathworks, 2011) 1.2.2 Esimerkki ulkoisen laskennan liittämisestä NXT:hen Esimerkkisovelluksessa NXT:stä, webbikamerasta ja Texas Instrumentsin DSP:stä on rakennettu Tetristä pelaava robotti. DSP:hen on kytketty webbikamera, joka kuvaa tietokoneen näyttöä. DSP analysoi webbikameran kuvaa ja tunnistaa siitä putoavan palikan muodon sekä etsii sille sopivan paikan. NXT painelee tietokoneen näppäimistön nappeja ja ohjaa putoavan palikan oikealle paikalle. Tiedonsiirto DSP:n ja NXT:n välillä on toteutettu DSP-laudalla olevilla ledeillä, joita NXT:n valontunnistin tarkkailee. Sytyttelemällä ja sammuttelemalla ledejä DSP komentaa NXT:tä painelemaan oikeita näppäimiä, jotta palikka saadaan oikeaan paikkaan. (Saenz, 2010)
5 1.3 Antureita NXT:hen on saatavilla suuri joukko erilaisia antureita eri valmistajilta. Taulukossa 2 on esimerkkejä mindsensors.comin valikoimasta. Taulukko 2 Esimerkkejä NXT:hen saatavilla olevista antureista (Mindsensors, 2011) Anturi Kuvaus Vision Subsystem v4 for NXT (NXTCam-v4) Voidaan käyttää linjantunnistimena tai seuraamaan, jopa 8 eriväristä esinettä. Sensori lähettää NXT:lle esineiden koordinaatit. Touch Panel for NXT Kosketuspaneeli, jolla NXT:n LCD-näyttö voidaan muuttaa kosketusnäytöksi. Dual Range, Triple Zone Infrared Obstacle Detector for NXT (NXTSumoEyes-v2) Infrapunalla toimiva esteentunnistin, suurin tunnistusetäisyys 30 cm. Line Sensor Array for NXT (NXTLineLeader) Linjantunnistin kahdeksalla valonilmaisimella. Multi-Sensitivity Acceleration Sensor v3 for Kolmeakselinen kiihtyvyysanturi. Useita NXT - (ACCL-Nx-v3) herkkyysalueita (1.5 G, 2 G, 4 G, 6 G). Realtime Clock for NXT Reaaliaikakello, paristovarmennettu. Laskee sekunteja, minuutteja, tunteja, päiviä, vuosia, ottaa huomioon karkausvuoden. Pneumatic Pressure Sensor v2 for NXT (PPS35- Paineanturi. Voidaan kytkeä Legon Nx-v2) pneumatiikkajärjestelmään. Mittausalue 0 2.4 bar.
6 2 CASE LUISTONESTO Diplomityönä kehittämääni hybridityökoneen luistonestojärjestelmää oli tarkoitus testata Lego Mindstorms ajoneuvossa, mutta alusta osoittautui epäsopivaksi tähän tarkoitukseen. Ensinnäkin luistonesto olisi tarvinnut tiedon vetävien pyörien pyörimisnopeudesta ja vääntömomentista tai vaihtoehtoisesti kaikkien pyörien pyörimisnopeuden. Kumpaakaan ei ollut saatavilla. Toiseksi, NXT:hen ladattavan sovelluksen suurin koko voi olla maksimissaan 224 kilobittiä käytettäessä NXT BIOS firmwarea. Jos luistonestosovellusta olisi pitänyt karsia NXT:tä varten, sovellus ei olisi enää ollut sama. Kolmanneksi, NXT:tä ei ole tarkoitettu ajoneuvoksi, lähinnä robotiksi joka pystyy ryömimään paikasta toiseen. NXT:n moottorit eivät pysty pyörittämään pyöriä tarpeeksi nopeasti, jotta luistonestosta olisi jotain hyötyä. Seuraavassa käydään läpi luistonestosovellus UML-kaavioita apuna käyttäen, jos sellainen haluttaisiin toteuttaa ajoneuvoon. UML editorina on käytetty ilmaista, avoimen lähdekoodin, ArgoUML:ää. ArgoUML tukee UML 1.4 kaavioita ja koodin generointia UML diagrammeista. Generoitavia kieliä ovat C++, C#, Java, PHP4 ja PHP5. ArgoUML tukee myös koodin reverse engineeringiä eli UML kaavioiden muodostamista lähdekoodista. UML kaavioiden muodostaminen onnistuu Javasta. (ArgoUML kotisivut, 2011) 2.1 Vaatimusmäärittely Luistoneston tulee toteuttaa kuvassa 2.1 kuvatut toimenpiteet. Kuva 2.1 Luistonestosovellus välittää kuljettajan asettaman vääntömomenttiohjeen moottorille, pyörien luistaessa vääntömomenttia pienennetään kuljettajan asettamasta arvosta. Luistonestojärjestelmän actoreina toimivat luistoestimaattori ja ajoneuvon kuljettaja. Kuljettaja luo vääntömomentti- tai nopeusohjeen järjestelmälle. Säädin pienentää tarvittaessa ohjesignaalia luistoestimaattorilta saamansa luistotiedon perusteella.
7 2.2 Toiminnallinen määrittely Luistonestosovellus koostuu kuvan 2.2 mukaisista lohkoista. Kuva 2.2 Luistonestojärjestelmä koostuu luistoestimaattorista, säätimestä ja sensoreista Luistonestojärjestelmää varten tarvitaan estimaattori, joka arvioi vetävien pyörien luistoa. Luistotieto voi olla pyörän luistokerroin (välillä 0 1) tai sitten binäärinen: pyörä luistaa/ei luista. Tarvittavat tiedot estimaattori saa ajoneuvon antureilta, esim. pyörän pyörimisnopeus ja moottorin vääntömomentti. Säädin tarkkailee luistokerrointa ja pienentää tarvittaessa moottorille menevää kuljettajan määräämää vääntömomenttiohjetta. Lohkojen välinen vuorovaikutus on esitetty kuvassa 2.3 olevassa vuorovaikutusdiagrammissa. Kuva 2.3 Luistonestojärjestelmän osien vuorovaikutus Järjestelmän osien välinen signaaliliikenne on esitetty tarkemmin kuvassa 2.4 olevassa sekvenssidiagrammissa.
8 Kuva 2.4 Sekvenssidiagrammi luistonestojärjestelmän lohkojen välisistä signaaleista Säädin saa kuljettajalta vääntömomentti- tai nopeusohjeen ja luistoestimaattorilta tiedon pyörien luistokertoimesta. Säädin välittää korjatun ohjesignaalin moottorinohjaimelle. Luistoneston toteutuksesta riippuen moottorinohjaimelta voidaan saada moottorin pyörimisnopeus ja vääntömomentti. Esimerkiksi, jos käytetään binääristä luistotietoa, ei tarvita moottorin vääntömomenttia. 2.3 Tekninen määrittely Luistonestosovelluksen suoritus on esitetty kuvassa 2.5. Kuva 2.5 Tilakaavio luistonestosovelluksen suorittamisesta
9 Säädin saa luistotiedon luistoestimaattorilta, jonka perusteella se voi pienentää, pitää ennallaan tai kasvattaa moottorinohjaussignaalin arvoa (oli se sitten vääntömomentti- tai nopeusohje). Säädin ei tietenkään saa kasvattaa moottorin ohjearvoa kuljettajan asettamaa arvoa suuremmaksi. 3 SOVELLUSESIMERKKI Kappaleessa esitellään yksinkertainen nxtosek-sovellus, joka käyttää NXT:hen liitettyä ultraäänianturia etäisyyden mittaamiseen ja kirjoittaa tuloksen NXT:n LCD-näytölle. 3.1 Ympäristö Ennen kuin NXT:ssä voi ajaa omaa koodia, useita työkaluja on asennettava. Tässä kappaleessa esitellään vain tarvittavat työkalut, tarkemmat tiedot niiden asentamisesta ja käytöstä löytyy tämän kappaleen lähteeksi merkityltä sivustolta kohdasta Installation. Kaikki nämä työkalut voidaan ladata samasta paikasta, lukuun ottamatta Legon Fantom Driveria. Ensimmäinen asennettava työkalu on Cygwin. Cygwin tarjoaa Linuxin kaltaisen ympäristön Windowsiin ja mahdollistaa useiden Linux-sovellusten ajamisen Windowsissa (huom. sovellukset täytyy kuitenkin kääntää Windowsiin, Cygwin tarjoaa vain kirjastot). Toinen asennettava työkalu on GNU ARM, joka on GCC-kääntäjän distribuutio NXT:n ARM7 prosessorille. Lisäksi tarvitaan lataustyökalu ohjelman lataamiseksi NXT:hen. Lataustyökalu riippuu NXT:lle asennetusta firmwaresta. Jos käytetään John Hansen s Enhanced NXT Firmwarea, on lataustyökalu John Hansen s NeXTTool. Lopuksi tarvitaan Legon USB-ajuri PC-yhteyttä varten. Ajuri löytyy Legon internetsivuilta nimellä Fantom Driver. (Chikamasa, 2010) Kuten aiemmin mainittiin, NXT:lle voidaan kirjoittaa omia ohjelmia C-kielellä. Ohjelmoinnin avuksi edellisen kappaleen lähteestä, kohdasta ECRobot C/C++ API, löytyy rajapintafunktiot nxtosek-käyttöjärjestelmään. Ohjelmoinnissa kannattaa käyttää sopivaa koodieditoria esim. Eclipse. Koodi käännetään Cygwin-ikkunassa, siirtymällä koodin kansioon ja kirjoittamalla komento: make all. Kun käännös on valmis ohjelma ladataan NXT:lle komennolla./rxeflash.sh. NXT täytyy olla kytkettynä tietokoneeseen USB-johdolla ja virta päällä.
10 3.2 Koodiesimerkki Seuraavassa käydään läpi lyhyt koodiesimerkki, joka käyttää ultraäänianturia etäisyyden mittaamiseen ja tulostaa mittaustuloksen NXT:n LCD-näytölle. /* omatesti.c for TOPPERS/ATK(OSEK) */ #include <stdlib.h> #include "kernel.h" #include "kernel_id.h" #include "ecrobot_interface.h" /* OSEK declarations */ DeclareTask(Task1); /* nxtosek hook to be invoked from an ISR in category 2 */ void user_1ms_isr_type2(void){ /* do nothing */ } void ecrobot_device_initialize() { ecrobot_init_sonar_sensor(nxt_port_s4); } void ecrobot_device_terminate() { ecrobot_term_sonar_sensor(nxt_port_s4); } TASK(Task1) { float dist; while(1){ } TerminateTask(); dist = ecrobot_get_sonar_sensor(nxt_port_s4); display_clear(1); display_goto_xy(0,0); display_string("distance:"); display_goto_xy(0,1); display_int(dist,0); display_string(" cm"); display_update(); systick_wait_ms(500); } Koodissa on käytetty rajapintafunktioita, joten koodiin täytyy sisällyttää ecrobot_interface.h. Koodissa on yksi taski, joka on luotu käyttämällä DeclareTask-funktiota. User_1ms_isr_type2 on käyttäjälle luotu hook millisekunnin välein ajettavaan keskeytysrutiiniin. Ecrobot_device_initialize ajetaan kun ohjelma käynnistetään. Käyttäjä voi lisätä siihen käynnistyksessä alustettavia kohteita. Esimerkkikoodissa funktiossa alustetaan ultraäänianturin ja NXT:n välinen I2C liikenne funktiolla ecrobot_init_sonar_sensor. Vastaavasti ecrobot_device_terminate ajetaan kun ohjelma pysäytetään painamalla exit-painiketta. Itse taskissa ultraäänianturin mittaama etäisyys saadaan luettua ecrobot_get_sonar_sensor-funktiolla. Etäisyys kirjoitetaan näytölle ja odotetaan 500 ms ennen seuraavaa suoritusta.
11 4 YHTEENVETO Lego Mindstorms on sopiva alusta sulautettujen järjestelmien opetukseen ja ohjelmoinnin aloittamiseen. Suuren anturi- ja lisälaitemäärän ansiosta alusta taipuu useisiin erilaisiin projekteihin. Valmiin rajapintafunktiokirjaston ansiosta ohjelmointi on helppoa, mutta se antaa kuitenkin realistisen kuvan sulautettujen järjestelmien ohjelmoinnista. Mindstormsin ympärillä on suuri ja aktiivinen kehittäjäyhteisö, jolta saa tarvittaessa apua ja joka kehittää kolmannen osapuolen ohjelmia alustalle.
12 Lainatut lähteet ArgoUML kotisivut. (2011). ArgoUML Features. Haettu 29. 11 2011 osoitteesta http://argouml.tigris.org/features.html Chikamasa, T. (2010). nxtosek/jsp. Haettu 10. 11 2011 osoitteesta http://lejososek.sourceforge.net/ Mathworks. (2011). Mathworks Nordic. Haettu 29. 11 2011 osoitteesta MATLAB for LEGO MINDSTORMS Robots: http://www.mathworks.se/academia/lego-mindstorms-nxtsoftware/legomindstorms-matlab.html?sec=start Mindsensors. (2011). Mindsensors.com. Haettu 16. 11 2011 osoitteesta Advanced Sensors for MINDSTORMS NXT: http://www.mindsensors.com/index.php?module=pagemaster&page_user_op=view_page &PAGE_id=57&gclid=CLWOmszCu6wCFYQtmAodklBjjg Saenz, A. (19. 4 2010). Singularity Hub. Haettu 2. 12 2011 osoitteesta First Video of Lego Robot Playing Tetris: http://singularityhub.com/2010/04/19/first-video-of-lego-robot-playingtetris/ Wikipedia. (2011). Wikipedia. Haettu 10. 11 2011 osoitteesta Lego Mindstorms NXT: http://en.wikipedia.org/wiki/lego_mindstorms_nxt