Valid XHTML 1.0 Transitional

Projekti Arttu-1

Päivitetty viimeksi 7.9.2019


Perusasiat

Tämän projektin tarkoituksena on saada aikaan liikkuva olio, robotti, jonka nimi on Arttu-1. Arttu viittaa Arduinoon, mikä muodostaa laitteen 'aivot', ja numero 1 siihen, että laitteesta saattaa tulla myöhemmin muitakin versioita.

Arttu-1 on viereisen kuvan näköinen. Arttu-1

Artun rakenne on periaatteessa yksinkertainen: edessä on pienehkö vapaasti kääntyvä pyörä (kuten mm. toimistotuoleissa) ja takana on kaksi isompaa kumipintaista pyörää, joita pyrittävät sähkömoottorit. Artussa moottoreina ovat itse asiassa ympäri kääntyvät servot, mutta ne toimivat siis periaatteessa kuten tavalliset sähkömoottorit. Niiden ohjauksesta on jäljempänä tarkemmin.

Artulla on kolme ultaräänisensoria, joiden avulla Arttu mittaa etäisyyttä eteenpäin ja molemmille sivuille. Arttu mittaa etäisyydet yhden senttimetrin tarkkuudella.

Arttu joka odottaa komentoa käyttäjältä tai suorittaa valmiiksi määriteltyä tehtävää. Komentojen käsittelystä tarkemmin jäljempänä. Valmiina tehtävänä Artulla on yksinkertainen missio: saatuaan aloituskomennon (komentojen antamisesta Artulle tarkemmin jäljempänä) Arttu käynnistää molemmat moottorit, jolloin Arttu alkaa liikkua suoraan eteenpäin. Koko ajan liikkuessaa Arttu mitaa etäisyyttä edessä olevaan seinään tai muuhun esteeseen. Kun este tulee liian lähelle niin Arttu pysähtyy.

Seuraavaksi Arttu mittaa etäisyyttä molemmille sivuille ja kääntyy siihen suuntaan, missä on enemmän 'tilaa' eli este (seinä tms.) on kauempana. Seuraavaksi Arttu sitten käynnistää moottorit ja alkaa liikkua valittuun uuteen suuntaan.

Liikkumisen aikana Arttu mittaa etäisyyttä myös sivuille. Jos Arttu joutuu liian lähelle sivuseinää, niin se tekee pinen korjausliikkeen sivuseinästä poispäin. Näin Arttu yrittää pysyä suurin piirtein kulkuväylän keskellä.

Arttu pysähtyy pysähtymiskomennolla. Komentojen antamisesta on tarkemmin jäljempänä.

Artun 'äly' on sen ohjelmistossa, jota suorittaa Artun 'aivoina' toimiva Arduino Uno -mikrokontrolleri.


Arduino

Arduino on mikrokontrolleri, josta on olemassa erilaisia versioita. Tietoa Arduinosta löytyy sen virallisilta kotisivuilta Arduinon kotivivut. Tässä käytettiin Arduinon versiota Uno R3. Siinä on prosessorin ja muistin lisäksi mm. 14 input/output-porttia, joiden tilaa voidaan kontrolloida ohjelmallisesti. Output-moodissa portti voidaan asettaa joko HIGH- (+5V) tai LOW-tilaan (0V). Input-moodissa portin tilaa voidaan tutkia ohjelmallisesti, jolloin portti on joko HIGH- (yli n. 3V) tai LOW-tilassa (alle n. 1V). Lisäksi osa porteissa voi toimia ns. PWM-tilassa (Pulse Width Modulation), jolloin portti osaa lähettää halutun pituista (levyistä) pulssia. Tällä voidaa suoraan ohjata servoa, jonka kääntymiskulma riippuu pulssin pituudesta (leveydestä).

Arduinoa ohjelmoidaan C:n kaltaisella ohjelmointikielellä PC:ssä ajettavassa ohjelmointiympäristössä (Windows, Linux). Siitä löytyy tarkemmin Arduinon kotisivuilta. Tehty ohjelma ladataan Arduinoon USB-liitynnän kautta. Heti latauksen jälkeen ohjelman suoritus Arduinossa käynnistyy. Joissain tapauksissa lataus voidaan tehdä myös langattoman yhteyden kautta, mutta USB on ylksinkertaisempi käyttää.

Arduino voi ottaa tarvitsemansa sähkön USB-liitännän kautta, mutta silloin se on riippuvainen USB-kaapelista. Lisäksi USB:n kautta ei saa välttämättä tarpeeksi virtaa esim. sähkömoottoreita varten. USB:n sijasta Arduinoon voidaan liittää oma virtalähde (akku), jonka kapasitetti vastaa tarpeita. Esim. Artussa itse Arduino toimii 9V:n paristolla ja moottoreita varten on erikseen n. 5V:n akusto.

Arttu-1 Huomattakoon vielä, että Arduinon output-portista ei voi ottaa kovin paljon virtaa (joitakin kymmeniä milliampeereja), joten sillä ei voi välttämttä ohjata suoraan esim. sähkömoottoria. Tällöin pitää käyttää erillistä moottoriohjainta ja siihen liitettyä erillistä virtalähdettä (akkua).

Viereisessä kuvassa vasemmalta oikealle: Arduino Uno, siihen sopiva XBee-shield, shieldin päälle asennettava XBee-moduli, PC:hen liitettävä XBee-usb moduli ja sen päälle asennettava XBee-moduli.


Artun rakenne

Viereisessä kuvassa on esitetty Artun sähköinen kytkentäkaavio.Arttu-1 kaavio Kumpikin sähkömoottori (itse asiassa ympäri pyörivä servo) on liitetty yhteen Arduinon output-porttiin, joka toimii PWM-tilassa ja ohjaa siten servon pyörimistä (tietty pulssin leveys -> servo pyörii eteenpäin, toinen pulssin leveys -> servo pyörii taaksepäin, kolmas pulssinlevys -> servo pysähtyy). Servoihin on lisäksi liitetty erillinen virtalähde niiden tarvitseman suht. ison virran vuoksi.

Etäisyyksien mittaamiseen käytetyt ultraäänisensorit (HC-SR04) liitetään kukin neljällä johdolla Arduinoon. Kaksi jodoista ovat virransyöttä varten (+5V ja maa eli 0V) ja kaksi varsinaista sensorin toimintaa varten. Trigger-johtimella käynnistetään mittaus (testiäänen lähetys) ja echo-johtimella saadaan tieto kaiun saapumisesta. Kaiun saapumiseen kuluva aika on sitten verrannollinen kaiun aiheuttaneen esteen etäisyyteen.

Vielä Arduinoon on liitetty kolme lediä (punainen, keltainen ja vihreä). Ne eivät varsinaisesti liity Artun toimintaan, mutta niiden avulla voidaan haluttaessa ilmaista Artun ohjelmiston eri tilanteita, kun Artulla ei välttämättä ole mitään muuta tiedotusmenettelyä toiminnastaan. Toki Arttu voi ottaa vastaan komentoja ja lähettää ilmoituksia kuten jäljempänä kohdassa 'Artun ohjaaminen' kuvataan. Moottorien akuston kytkemisestä kertoo vielä punainen merkkiledi.

Arttu voisi toimia itsenäisesti alkaen suorittaa sille ladattua ohjelmaa heti virran kytkemisen jälkeen. Monipuolisemman toiminnan mahdollistamiseksi Arttuun on lisätty langattoman yhteyden tarjoama XBee-moduli, joka liitetään Arduinon 'päälle' XBee-sovitinta (shield) käyttäen. Kun vaikka PC:hen liitetään toinen XBee-sovitin (XBee USB -moduli), niin niiden välille saadaan langaton yhteys, ja Arduino ja PC-ohjelma voivat lähettää ja vastaanottaa viestejä keskenään. Tätä hyödynnetään Artun ohjaamisessa, katso jäljempänä. XBee:n lisääminen ei vaadi mitään lisäkytkentöjä Arduinossa. XBee-modulissa on pieni kytkin, jolla valitaan, käyttääkö Arduino viestimiseen USB-liitäntää vaiko XBee:tä. Arduinon ohjelmassa molemmat tavat näkyvät samoina, nimittäin sarjaliikenteenä (PC:ssä COM-porttina).


Artun ohjelma

Arttu-ohjelman nykyinen versio (v0.3) löytyy täältä Arttu-ohjelma. Arduino-ohjelman tiedostotunniste (extension) on .ino ja ohjelmakoodia voi tarkastella melkein millä vain tekstiohjelmalla, esim. Notepad, Wordpad, Notepad++. Seuraavassa tarkastellaan lyhyesti ohjelman perustoimintaa.

Kaikki Arduino-ohjelmat muodostuvat kahdesta metodista: setup(), joka suoritetaan kerran heti virran kytkemisen jälkeen, ja loop(), jota kutsutaan jatkuvasti setup():n suorittamisen jälkeen. Setup():ssa tyypillisesti alustetaan muuttujat, asetetaan porttien tilat(input/output), käynnistettään sarjaliikenne ja suoritetaan yms. kerran tehtäviä toimia. Loop():ssa taasen tapahtuu varsinainen toiminta, Artussa esim. kaikki moottorien ohjaukset, etäisyysmittaukset ja komentojen vastaanotto sekä käsittely. Seuraavassa tarkastellaan lyhyesti Artun loop()-metodin toimintaa.

Ensimmäiseksi loop():ssa tutkitaan, onko sarjalinjan (XBee tai USB) kautta tullut merkkejä. Jos on niin jokaisen merkin kanssa kutsutaan Artun omaa metodia (aliohjelmaa) processCommand(), joka käsittelee merkin (komennon) ja suorittaa sen edellyttämät toimet.

Kun sarjalinjan kautta ei enää ole käsittelemättömiä merkkejä niin ohjelma tutkii, onko tapahtumajonossa (event queue) tapahtumia, joiden suorituksen ajankohta on koittanut. Jos on, niin ao. tapahtuma aktivoidaan ja poistetaan jonosta. Jos ei ole niin poistutaan metodista loop(). Tämän jälkeen Arduino käynnistää uudestaan loop()-metodin, eli edellä kuvattu toiminta jatkuu 'ikuisessa loopissa'.

Kun Arttu saa esim. komennon 'kulje eteenpäin 1000 ms ajan' (eli merkkijonon 1000F), niin processCommand()-metodissa käynnistetään molemmat moottorit kulkemaan eteenpäin ja tapahtumajonoon lisätään tapahtuma niin, että se 'laukeaa' 1000 ms kuluttua ja kutsuu metodia, joka pysäyttää molemmat moottorit. Samalla periaatteella toimivat myös muut aikaan liitetyt komennot.

Kun mennään labyrinttitilaan (komento G, katso jäljempänä), niin Arttu käynnistää molemmat moottorit eli lähtee kulkemaan eteenpäin. Lisäksi ohjelma laittaa tapahtumajonoon tietyn ajan kuluttua laukeavat mittaustapahtumat, jotka mittaavat etäisyyttä eteen ja sivuille. Jos ollaan sivusuunnassa liian lähellä sivua, niin tehdään korjausliike. Jos taas edessä este on liian lähellä, niin pysähdytään, mitataan etäisyydet sivuille ja käännytään siihen suuntaan, missä esteen (seinän) etäisyys oli suurempi. Sitten jatketaan eteenpäin kuten aiemmin.

Tarkemmin ohjelman yksityiskohdat selviävät tutkimalla oheista ohjelmakoodia.


Artun ohjaaminen (komennot)

Käynnistyttyään Artun ohjelma odottaa komentoja sarjalinjan kautta (siis USB:n tai XBee:n kautta). Komennon (merkkijonon) saavuttua ohjelma tutkii komennon ja alkaa suorittaa sen vaatimia toimia. Varsinaista komentoa mahdollisesti edeltävät numeromerkit ohjelma muuttaa numeerikseksi arvoksi, jota varsinainen komento voi sitten hyödyntää. Esim. jos käyttäjä lähettää merkin '7', niin numeromuuttujaan tallettuu arvo 7, tai jos käyttäjä lähettää merkit '7', '5' ja '0', niin numeromuuttujaan tallettuu arvo 750. Kun käyttäjä sitten lähettää esim. merkin 'F', niin Arttu kulkee eteenpäin (forwards) 750 millisekunnin ajan.

Komennon muoto on joko X tai n..nX, missä X on komento ja n..n on komentoa mahdollisesti edeltävä kokonaisluku. Komento voidaan antaa isona tai pienenä kirjaimena. Ohjelmiston nykyisen version tuntemat komennot ovat seuraavat:

S (tai s) - stop, eli pysäytä molemmat moottorit
G (tai g) - go/end, eli käynnistä/pysäytä labyrinttiohjelma
n..nF (tai n..nf) - forwards, eli liiku eteenpäin n..n millisekunnin ajan
n..nL (tai n..nl) - turn to left, eli käänny vasemmalle n..n millisekunnin ajan
n..nR (tai n..nr) - turn to right, eli käänny oikealle n..n millisekunnin ajan
n..nB (tai n..nb) - backwards, eli liiku taaksepäin n..n millisekunnin ajan
n..nW (tai n..nw) - wait, eli odota n..n milliseknuttia
nH (tai nh) - put n HIGH, eli aseta portti n tilaan HIGH
nI (tai ni) - put n LOW, eli aseta portti n tilaan LOW
nT (tai nt) - trigger sonic sensor n, n=1 front, n=2 left, n=3 right
nP (tai np) - program n, eli suorita talletettu ohjelma
C (tai c) - calibrate, eli aseta tiettyjen muuttujien arvot; ei vielä toteutettu
n..nN (tai n..nn) - set number, eli talleta luku n..n
nV (tai nv) - set value, eli talleta arvo n..n muuttujaan n
nM (tai nm) - set mode, eli aseta toimintatila
Q (tai q) - quit, eli lopeta ohjelman tallennus

Jos aika-arvo n..n komennoissa F, L, R tai B on nolla, niin haluttu liike jatkuu loputtomiin, siis kunnes annetaan jokin uusi komento. Jokaisen komennon jälkeen numeroarvo nollautuu, ei siis siirry seuraavalle komennolle, jos sen antaa ilman numeroarvoa.

Arttu lähettää jokaisesta komennosta kuittauksen tai tarvittaessa virheilmoituksen. Vastauksena trigger-komentoon (nT tai nt) saadaan ao. sensorilla mitattu etäisyys senttimetreinä.

Arttu tuntee kolme toimintatilaa: 0-manual mode, 1-auto mode, 2-save mode. Tilaa vaihdetaan komennolla nM (tai nm). Oletustila on 0, jossa Arttu kuuntelee komentoja ja toteuttaa niitä yksi kerrallaan. Tilassa 2 (save) Arttu komennon toteuttamisen lisäksi tallettaa sen muistiinsa ohjelmapaikkaan 2. Talletus päättyy komennolla Q (tai q) ja Arttu siirtyy takaisin 0-tilaan. Talletetun ohjelman suoritus voidaan käynnistää sitten komennolla 2P (tai 2p). Tilaa 1 (auto) ei ole vielä toteutettu.

Kalibroinnin (komento C tai c) ajatuksena on, että ohjelma voisi asettaa joitakin parametrejaan riippuen siitä, millainen sen toimintaympäristö on. Esim. kuljettavan labyrintin leveys voisi vaikuttaa käytettäviin suunnan korjauksiin tms. Komentoa ei ole vielä toteutettu.


PC-ohjelma Controller.exe

Tässä yksinkertainen PC-ohjelma Windows-ympäristöön komentojen lähettämiseksi Artulle ja viestien vastaanottamiseksi Artulta pc_program.

Ohjelman voi ladata täältä Controller-ohjelma PC:lle. Ohjelma on .exe-muotoinen ja sen voi ajaa suoraan ilman erillistä asentamista. Tietoturvaohjelmat eivät välttämättä ole tuosta riemuissaan.

Ohjelman käynnistyttyä ensiksi pitää valita käytettävä COM-portti niiden listasta. Tämän jälkeen voidaan lähettää komentoja. Komentoa mahdollisesti edeltävä numeerinen arvo valitaan listasta 'Value' (tai none, jos numeroarvoa ei tarvita). Seuraavaksi valitaan haluttu komento listasta 'Command' ja lopuksi painetaan painiketta ' Send val+cmd', jolloin ohjelma lähettää komennon Artulle. Lähetetty komento näkyy listalla 'Sent/rcvd' kuten myös Artun lähettämät viestit. Lähetetyn komennon edessä näkyy merkintä '->', joka ilmaisee kyseessä olevan lähetetty komento. Listan voi halutessa tyhjentää painikkeella 'Clear'.

Kenttään 'Free command' voi kirjoittaa haluamansa komennon, jos vaikka 'Value' ja 'Command' -listoista ei löydy tarvittavaa yhdistelmää, tai jos haluaa lähettää useampia komentoja yhdellä kertaa. Tämä komento lähetetään painikkeella 'Send free cmd'.


Muuta

Viereisessä videossa Arttu selvittää Helsinki Hacklab:n robottikisan labyrintin (kesäkuu 2019). Artun aika oli n. 30 s, nopein aika oli n. 15 s, joten Artulla on vielä parannettavaa. Arttu-1 The Movie

Jos Sinulla on kysyttävää Artusta tai Arduinosta yleisemmin tai muuta kommentoitavaa, niin voit lähettää viestiä osoitteeseen cpo miukumauku funnyimagination piste com. Laita aiheeksi Arttu-1. Tuota postia ei seurata kovin aktiivisesti, joten vastaus voi kestää. Kärsivällisyyttä !