Toteutus - K1516/RobotCar1 GitHub Wiki

Työn toteutus

Kuvat näkyvissä paremmin Kuvat kansiossa

Työn toteutuksessa on käytetty android studiota sovelluksen tekemiseen ja Raspberry Pi:tä auton liikkuvuuden tekemiseen. Sovelluksen tekoa helpotti huomattavasti samaan aikaan käyty kurssi android ohjelmoinnista. Sen avulla sain sovelluksen tehtyä aika nopeasti ilman suurta tutkimusta. Ainoa ongelma oli tuo mqtt:n saaminen toimivaksi.

Python oli tosiaan itselle tuolloin vielä tuntematon kieli, joten piti aluksi hieman tutkia ja opetella sitä. Loppujen lopuksihan tuo sovellus on aika yksinkertainen. Uskoisin, että ilman pythonin tuntemustakaan siitä käy helposti ilmi mitä on tehty missäkin kohdassa.

Alkuun tarvittavia asennuksia raspberryyn, joita piti tehdä, ainakin nyt uuden raspberryn kanssa:

Ilman noita mqtt:n käyttö ei onnistu, itselläni oli python 2.7 suoraan asennettuna, joten jos sitä ei löydy niin joutuu myös erikseen asentamaan.

Aluksi piti tietenkin lisäillä kirjastoja, kuten raspberryn pinnien käyttöön, mqtt ja näppäimistön käyttö. Ilman raspberryn kirjastoa ohjelma ei osaisi tunnistaa pinnien käyttöä, liikkuvuus on tehty niin, että tietystä kirjaimesta liikkuu, joten näppäimistölle piti myös hakea kirjasto. Alla kuvassa kaikki kirjastot.

Aluksi piti vain luoda jokaiselle liikkeelle oma funktio ja määrittää mitä raspberryn pinnejä käytetään siinä, sekä tietenkin määrittää mitä raspberryn pinnejä ylipäätänsä käytetään (Netistä löytyy määrityksen raspberryn jokaiselle pinnille, josta käy ilmi mikä kyseisen pinnin toimintatarkoitus on, jossakin virta ja jokin ohjelmoitava). Alla ensimäinen kuva raspberryn pinnien käyttöön. Itse käytin siis neljää pinniä juuri sen takia, jotta voi myöhemmin lisätä kaksi moottoria autoon.

Jokaisen liikeen funktiot alla olevassa kuvassa. Piti siis vain määritellä mistä pinnistä tulee virtaa ja mistä ei ja nämä tietenkin piti kytkeä oikein.

Nyt kun pinnit ja liikkuvuus on määritelty, pitää kertoa milloin kutsutaan mitäkin funktiota. Tähän tosiaan aluksi käytetään näppäimistöä, eli tietyn kirjaimen painalluksesta liikkuu siihen suuntaan. Määritin itse perus kirjaimet w, a, s ja d:n. Silloin kun painat esim w:tä, se tulostuu raspberryn terminaaliin ja siitä tunnistaa mitä liikettä pitäisi tehdä. Tämä on myös mobiilisovelluksessa tehtynä niin, että viestinä tulee raspberryyn w, a, s tai d, joka määrritellään oikeaan muotoon pythonille eli tuo rivi teksti= str(msg.payload) msg.payload on se, minkä raspberry saa sovelluksesta ja teksti kertoo viestin sisällön raspberylle, josta se sitten valitsee toiminnon, jota käyttää

Yhteyden muodostaminen ja siihen tarvittava topicin määrittäminen tapahtuu seuraavasti alla olevassa kuvassa. Eli kun laitteet on yhdistetty raspberry tulostaa terminaaliin tekstin "Connected with result code ", tätähän ei tietenkään nähdä silloin, kun autoa käytetään, mutta auttoi testaamisessa, jotta tiesi onko laitteet yhdistetty vai ei. Myös määrritellään topic eli tuo "movement/move" on topic, jota mqtt etsii, jos viesti tulee jollakin muulla topicilla mqtt ohittaa sen suoraan, koska etsii tiettyä topicia ja sen sisältöä. Yhteyden muodostaminen on tehty tosiaan mqtt:n asennuksen mukana tulleilla esimerkkejä muokkaamalla. Linkki löytyy myös linkit osiosta.

Lopussa määrriteltynä mqtt:n asetuksia. Eli onko raspberry publisher vai subscriber, mitä tehdään yhdistäessä, määrritellään viestin sekä kerrotaan ip-osoite mitä käytetään. Molemmissa pitää olla sama ip-osoite, jotta lähetetään viesti oikeaan laitteeseen ja saadaan ne yhdistettyä. Ja lopuksi laitettuna looppi, jotta sovellus ei suljeudu itsestään tietyn ajan tai toiminnon jälkeen.

Ja sitten androidin puolelle. Tosiaan sovellus näyttää tältä:

Eli aika pelkistetyn näköinen. Tuossakin oikeastaan turhaa on nuo start ja stop, koska ohjelma yhdistää käynnistäessä suoraan raspberryyn itsensä, eikä tuo start nappi toimi muuten oikein, eli se yhdistää vain kerran, mutta jos painat stoppia niin ei yhdistä enää uudestaan, vaan pitää käynnistää sovellus kokonaan uudestaan (mahdollisesti korjaus tulossa). Stop puolestaan toimii, eli sitä painaessa sulkee yhteyden eikä sovelluksella pysty ohjaamaan auto sen jälkeen.

Sovellus toimii painalluksesta, eli pidät pohjassa niin auto menee siihen suuntaan kuin halutaan, siinä on pieni aikaviive eli ei pysähdy välittömästi, kun ottaa sormen pois napista.

Androidille piti ottaa aika monta kirjastoa käyttöön, jotta mqtt toimisi. Ainakin silloin, kun tämä projekti on tehty alunperin (voi olla nykyään jo vaihtunut). Alla kirjastot

Myös määrritellään kaikki napit, joita käytössä:

Myös nappien toiminnallisuuden tekeminen oli hyvin samankaltainen kuin raspberryllä. Eli määrriteltiin topic ja jokaiselle napille oma viesti mikä lähetetään.

Nappien tekeminen oli helppoa, määritin suurimmaksi osaksi suoraan koodilla kaikki, sijaintia jouduin hienosäätämään ihan layoutista suoraan, jottai sain halutun lopputuloksen. Alla kuva nappien määrritelmistä, jokainenhan on identtinen toiminnallisuuksiltaan, teksti ja sijainti vain vaihtuvat

Mqtt:n käyttöönotto oli myös osittain ongelmallinen itselle, lähinnä piti tajuta miten käytetään ja mitä kaikkea piti kirjastoista lisätä sekä mitä tarvittiin gradleen ja manifestiin lisätä. Oli loppuviimein aika moneen paikkaan lisättynä määrityksiä yms. jotta saatiin yhteys toimimaan. Raspberryllä huomattavasti helpompi operaatio. Alla kuvat mainactivitystä, gradlesta ja manifestistä. Kaikki siis kirjastoja lukuunottamatta mitä piti lisätä. Koodin rakentaminen oli silloin helppoa muuten, koska pahon sivuilla oli suoraan kerrottuna mitä tarvitaan, jotta saadaan homma toimimaan androidilla (nykyään voi olla täysin eri tyyli ja ohjeet, mutta silloin oli vain tämä tapaus näkyvillä heillä itsellään). Käytettyyn koodiin pääset täältä, mutta myös linkit osiosta löytyy linkki sivustolle. Eli alla olevat koodit lähestulkoon suoraan käytettynä eclipseltä, jottai sain yhteyden toimimaan

Näissä pääsin hyvin pitkälle ennen varsinaisen auton kokoomista. Siinä oli oma hommansa saada motor stepperi toimimaan oikein, koska tuntui siltä, että mitä enemmän tutkin asiaa netin syövereistä, sitä vanhemmalta komponentilta tuo oma tuntui. Johtojen paikkoja oli ehkä ylivoimaisesti suurin homma koko projektissa. Aina piti aloittaa alusta, jos ja kun jokin meni testauksessa pieleen piti miettiä johdotus uusiksi. Joissakin kohtaan sai virran jatkuvasti ja joissakin pelkästään toinen moottori sai virran eikä toinen, vaikka oli kytkettynä samalla tavalla. Välillä taisi olla myös niin, että toinen pyörä pyöri jatkuvasti ja toinen käskystä. Loppujen lopuksi sain onneksi jotenkin tuon kytkemisen toimimaan, mikä on myös uudestaan kokoamisessa ongelma. Muistaakseni olin ottanut kuvan kytkennöistä, mutta tähän hätään en löytänyt sitä mistään (luultavasti poistanut sen viime kurssin jälkeen). Kuva valmiista autosta löytyy etusivulta.

Viime hetken muutos ja kävin hakemassa uuden robottiauton pohjan, joka sisältää neljä moottoria. Viime hetken muutos ei välttämättä ollut paras ajoitus, mutta ajattelin vanhojen moottoreiden olevan kuluneita ja siksi eivät jaksaneet pyörittää kunnolla. Ongelmana tällä hetkellä neljällä moottorilla on virta. Piti aluksi muokata niin, että moottorit käyttävät 4 x AAA paristoja ja raspberry tuota virtalähdettä, mutta tämäkään ei näytä oikein riittävän tai sitten paristot alkavat vetämään viimeisiä. Kokoaminen ja johdotus vei aika paljon aikaa ja piti muutamia kertoja korjata, koska ongelmia välillä tuli vastaan virran kulkemisessa oikein.

Linkki Tarvikkeisiin