Ohjelmoinnin alkeita robotin kanssa

Viime syksynä Jyväskylän toimistollamme vieraili päiväkotiryhmä tutustumassa toimintaamme. Vaikka lapsiryhmän lyhyt vierailu ei vaatinut suuria järjestelyjä, pohdin pitkään miten kertoisin 4-5-vuotiaille ohjelmistokehityksestä. Pelkästään ohjelmointi käsitteenä on jo hyvin abstrakti. Mieleeni palautui 90-luvun alku ja ala-asteen opetuskokeilu, jossa luokallemme opetettiin ohjelmoinnin alkeita Logo-kielen avulla. Logo on opetuskieli, jossa yksinkertaisilla komennoilla liikutetaan ruudulla olevaa kilpikonnaa, joka jättää liikkuessaan jälkeensä viivan. Kilpikonnan ruudulle piirtämä viiva tällöin konkretisoi annettujen komentojen vaikutusta hyvinkin selkeästi. Vaikka ATK-luokkamme Commodoren ruuduilla se kilpikonnakin oli pelkistetty kolmio, oli Logo meille aikanaan mieluinen peli. Siis peli eikä ohjelmointiympäristö, joka kuulostaakin joltain hirveän vaikealta ja tylsältä.

Tulin lopulta siihen tulokseen, että yritän ohjelman käsitteen kautta avata lapsivieraille ohjelmistokehittäjien työtä. Alustin asiaa näin: “Tietokone on laite, joka noudattaa sille annettuja käskyjä. Se tekee vain sen mitä käsketään, ei muuta. Useammasta käskystä syntyy ohjelma. Eli ohjelma on sarja käskyjä, jotka kone suorittaa.” Konkretisoin asiaa leikin kautta esittämällä robottia, jota lapset saivat ohjata yksiselitteisin liikkumiskäskyin. Laitoin robottipäällä koristellun pahvilaatikon päähäni ja annoin ryhmälle tehtäväksi ohjata “robotti” istumaan taukotilan sohvalle. Reitti oli noin 10 metriä ja sisälsi useita käännöksiä. Ensimmäinen komento oli “Robotti, kävele!”. Aloin kävelemään ja jatkoin kävelyä suoraan eteenpäin kohti seinää, mutta juuri ennen törmäystä joukosta kuului “Pysähdy robotti!”. Lapset sisäistivät pelin idean vikkelästi ja komennot muuttuivat vähitelllen yksiselitteisemmäksi. Lopulta robotti pääsi määränpäähänsä ja näin robotin kävelytysohjelman ensimmäinen versio oli valmis.

Vierailun jälkeen mietin, että tämän saman esittelyn voisi tehdä aika helposti oikealla robotilla – joten ei muuta kuin tuumasta toimeen! Robotin rakennustarvikkeiksi valitsin omista kokoelmistani pyöreän, kahdella dc-moottorilla ja renkailla varustetun robottialustan, L293-pohjaisen moottoriohjainkortin sekä ESP8266 wifi-moduliin pohjautuvan Lolin V2-kehitysalustan, joka on NodeMCU-klooni. NodeMCU on hyvin edullinen avoimen lähdekoodin kehitysalusta, joka tarjoaa vakiona Lua-tulkin ja kattavan työkaluvalikoiman IoT-protoiluun. Sitä voi myös ohjelmoida esimerkiksi Arduino-ympäristössä c-kielellä. Valitsin robotin aivoiksi ESP8266-pohjaisen ratkaisun koska se mahdollistaa langattoman verkon hyödyntämisen paristovirralla ja tarjoaa samassa paketissa myös riittävästi IO-pinnejä laajentamiseen.

 

 

Koottuani robotin perusosat, toteutin ohjelmistoon ensin liikkumisrutiinit. Tämän jälkeen kyhäsin logiikan, joka muutti merkkimuotoiset käskyt ennaltamääritellyiksi liikesarjoiksi: liiku 15 cm eteenpäin, käänny 15 astetta, jne. Kun robotti pystyi liikkumaan ja tulkkaamaan ohjauskomentoja, oli aika rakentaa robottia ohjaava käyttöliittymä. Päädyin hyödyntämään ESP8266WiFi-kirjaston palvelinominaisuutta, jolloin robottia voi ohjata samassa lähiverkossa millä tahansa selaimella, tabletilla tai älypuhelimella. Robotin firmware toimii hyvin yksinkertaisena http-palvelimena ja tarjoaa HTML5-käyttöliittymän lisäksi HTTP-rajapinnan, johon komennot lähetetään GET-metodilla. Käyttöliittymän rakensin hyödyntäen vanhaa hyvää trioa: Bootstrap, Font awesome sekä jQuery. Sain näillä toteutettua hyvin kevyen, mutta käyttökelpoisen ohjausnäkymän.Ohjauskäyttöliittymä on staattinen HTML-sivu, käyttöliittymän vaatimat resurssit ladataan selaimessa CDN-palvelimelta ja komennot lähetetään palvelimelle Ajax-pyyntöinä. Käyttöliittymässä komennot ovat nappeja, joita painamalla käskyt siirtyvät jonoon. Kun painaa play-nappia, selaimesta lähtee http-pyyntö Ajax-kutsuna robotille, joka suorittaa annetun käskysarjan ja lopuksi pysähtyy. Koska monimutkaisempien rakenteiden toteuttaminen olisi vaatinut selkeästi enemmän aikaa, päätin että robotti tottelee yksinkertaisia liikkumiskäskyjä kuten eteen, taakse, käänny oikealle, käänny vasemmalle ja odota. Tämän lisäksi implementoin silmukkamekanismin, jolla komentosarjan voi toistaa kaksi tai viisi kertaa.

 

 

Jos haluat itse rakentaa samankaltaisen prototyypin tai tutkia miten robotti toimii, voit ladata lähdekoodin GitHubista: https://github.com/manujoha/simplewifibot/. Alustaksi käy jokin muukin ESP8266-pohjainen alusta, kuten esimerkiksi Wemos. Valmis moottoriohjainkortti helpottaa protoilua, mutta käytännössä mikä tahansa H-bridge mahdollistaa pienten dc-moottorien ajamisen mikrokontrollerista. Myöhemmin ajattelin lisätä käskykantaan myös audiovisuaalisia efektejä, ääniä ja valoja sekä mahdollistaa parametrisoidut komennot. Pohdiskelin että seuraava versio voisi olla myös ulkoisesti viimeistellympi. Sillä voisi olla esimerikisi ystävällisen näköiset kuoret tai koko robotin voisi rakentaa vaikkapa legoista.

Sain robotin ensimmäisen version valmiiksi juuri ennen marraskuussa vietettyä ”lapsi mukaan töihin” -päivää, jolloin toimistollemme saapui jälleen lapsivieraita. Tällä kertaa ohjelmaan ei kuulunut sen kummempaa esitelmöintiä vaan robotti oli esillä vapaasti kaikkien kokeiltavissa. Pienemmissä lapsissa karun näköinen robotti ei juurikaan herättänyt mielenkiintoa, mutta kouluikäiset leikkivät laitteella mielellään. Improvisoimme heille tehtäviä mitä robotilla pitää suorittaa: kierrä roskakori, siirry lattian sinisen laatan päälle, jne. Kun robotin ohjaus ei tue robotin ajamista radio-ohjattavan auton tavoin, vaan pakottaa pohtimaan mitä komentoja tietty liikerata vaatii, se muuttaa leikin enemmänkin ongelmanratkaisuksi. Koeajajat ja robotti suoriutui tulikokeestaan hyvin: teknisiä ongelmia ei tullut, eikä mitään mennyt rikki.