maanantai 6. helmikuuta 2017

DFROBOT Beginner Kit for Arduino - testauksessa

Nyt testauksessa DFROBOT:n Beginner Kit for Arduino -setti. Ensimmäinen LED:in vilkutus ainakin toimi, joten ensiviikolla sitten oppilaiden kanssa tekemään.

Ajatuksena oli seurata tämän tutoriaalin juttuja ja kopioida valmiita koodeja ja tehdä siitä sitten eteenäin. Katsotaan miten käy.


Laatikollinen leluja

1. Harjoitus: lataa koodi


Lataa kaikki mallikoodit: lataa koodi (zip)

torstai 30. kesäkuuta 2016

Peliohjelmointikurssilla opittua

Kahdeksannen luokan peliohjelmointikurssi jatkui keväällä. Ensimmäisellä kokoontumiskerralla tiimit viimeistelivät suunnitelmansa OneDrive:ssa oleviin dokumentteihin. Me opettajat toimimme katselmoijina ja kyselimme epäselviä asioita sekä tarkennuksia ja lopulta suunnitelmat olivat jotakuinkin yksiselitteisiä niin, että graafikot ja koodarit saattoivat aloittaa omat hommansa.

Koodarit aloittivat tutustumalla opettajan Racket:illä koodaamaan pelipohjaan, jossa oli valmiina hahmojen piirtäminen ruudulle, tietorakenteet "peli" sekä "hahmo", hahmojen liikkumiseen sekä pelaajan ja toisen pelihahmon törmäyksen havaitsemiseen liittyvät funktiot sekä pelimoottori big-bang. Tietorakenteen kentille oli myös valmiiksi koodaattu set- ja get-funktiot.

Peli-tietorakenteessa oli seuraavat kentät:
  • tilanne : Symboli (esim. 'alku 'käynnissä 'pause 'loppu)
  • taso : Luku
  • pisteet : Luku
  • aika : Luku
  • pelaajat : Lista<hahmo>
  • dynaamiset : Lista<hahmo>
  • staattiset : Lista<hahmo>
 Hahmo-tietorakenteessa oli seuraavat kentät:
  • tyyppi : Symboli (esim. 'pejaaja 'kerättävä 'vaara)
  • id : Luku
  • tila : Symboli (esim. 'elossa 'kuollut)
  • varusteet : Lista<symboli> (esim. 'lippis 'pipo)
  • sijainti : Posn (x- ja y-koordinaatti)
  • suunta : Posn (vektori jossa x:n ja y:n suuntainen siirtymä)
  • laskuri : Luku (jos 0 niin ei liiku)
  • asento : Symboli (esim. 'vasen 'oikea)
Vaikka pelipohjassa oli paljon koodia, se ei vielä toteuttanut yhdenkään pelin logiikkaa joten ensimmäinen vaihe oli suunnitella miten kunkin ryhmän peli käyttäisi tietorakenteita hyväkseen, millaisia tiloja pelillä ja hahmolla piti olla jne. Tämä tehtiin isolle paperiarkille.

T'ässä pelissä sipsipussin piti kerätä hyppimällä juomia ja vältellä sivulta tulevia Shrekkejä (toinen "vuoristo"-taso jäi toteuttamatta)
Kun suunnitelma oli valmis, lähdimme tekemään pelejä yhdessä. Vaikka pelit olivatkin hyvin erilaisia, yllättävän monessa pelissä oli samoja piirteitä, jotka saatoimme koodata yhdessä opettajan johdolla kuitenkin niin, että kukin koodaripari sovelsi vaiheen omaan peliinsä sopivaksi. Lähdimme ensin luomaan kuhunkin peliin liittyviä hahmoja ja laitoimme ne liikkumaan oikeaan suuntaan (säätämällä suuntavektoria). Koska meillä ei ollut grafiikoita, ryhmät käyttivät erivärisiä ympyröitä, kolmioita ja nelikulmioita hahmojen kuvina. Ensimmäisinä koodasimme siis funktiot: tee-hahmo ja piirrä-hahmo. Kutsuimme tee-hahmo-funktiota riittävän monta kertaa, että saimme big-bangin käynnistyttyä muutamia hahmoja liikkumaan. Seuraava vaihe oli lisätä funktio, joka toteuttaa pelaajan liikkumisen käyttämällä nuolinäppäimiä. Koodasimme siis funktion: hoida-näppäimet. Kun pelaaja liikkui saatoimme lisätä törmäyksen havaitsemisen sekä pisteiden lisäämisen tai vähentämisen riippuen törmäyksen kohteesta. Nämä toteutettiin funktioiden: päivitä-peli ja törmäsikö? avulla. Lopuksi lisäsimme funktion, joka automaattisesti arpoi peliin lisää hahmoja. Tämä toteutettiin funktion lisää-hahmoja ja arvo-hahmot avulla.

Zombipelissä piti ampua sivuilta tulevia zombeja (huomaa läpinäkyvä ase ja matalalla liitävät ammukset)
Näiden perustoimintojen lisäksi, yhdessä pelissä hahmolle (sipsipussi) piti lisätä painovoima, eli se piti saada hyppäämään ja sen jälkeen putoamaan takaisin. Toisessa pelissä pisteiden laskenta toimi niin, että kolmen "vihanneksen" jälkeen pisteet nollautuivat kokonaan, eli peli loppui ja alkoi taas uudelleen. Kolmannessa pelissä hahmojen lisäksi taustakuva liikkui ajan suhteen, näin saatiin aikaan hahmon putoamisilluusio. Neljännessä pelissä hahmo ampui luoteja hiiren avulla, joten siihen piti lisätä myös hoida-hiiri-funktio. Viides peli jäi alkutekijoihinsä, koska koodareilta loppui mielenkiinto koodaamiseen melko nopeasti. Tämän ryhmän kanssa teimme niin, että graafikot siirtyivät kuvien valmistuttua koodaamaan ja ne ottivat käyttöön Scratch-työkalun, että saisivat jotain valmiiksi siinä  lyhyessä ajassa mitä oli enää jäljellä.

Tässä pelissä sankari hyppää katolta ja kerää matkallaan ES:iä ja nugetteja ja samalla väistelee lintuja (pallot kuvaavat ruokia, jotka jäivät graafikoilta toteuttamatta)
Pelejä koodattiin 7 kaksoistuntia ja samaan aikaan graafikot tekivät peligrafiikoita kuvataiteen opettajan ohjauksessa. Ensimmäisen kerran yritimme liittää kuvia ja koodia yhteen toukokuun alussa. Siinä vaiheessa tuli ilmi montakin ongelmaa, hahmojen kuvissa oli turhia valkoisia taustoja ja kuvia ei oltu rajattu mahdollisimman pieniksi, jotta törmäysehdot toimisivat moitteetta. Myöskään putoamisilluusion luomiseen tarkoitetut talon palaset eivät olleet sellaiset kuin piti (palat olivat eri kokoisia). Graafikot saivat tärkeää palautetta ja he palasivat korjaamaan kuvia, ja koodarit koodasivat pelejä hieman lisää. Kurssin loppu tuli kuitenkin vastaan aivan liian nopeasti, ja lopulta sovimme niin että opettaja koodaa jokaista peliä eteenpäin max 1h per peli. Lopulta neljän pelin loppuun koodamiseen meni 2h15min. Hankalin peli oli zombiepeli, koska siinä sekä zombit että ammukset liikkuivat ja ammuksen ja zombin törmäys piti havaita, kuten myös zombin ja pelaajan törmäys.

Tässä pelissä tehtävänä oli syödä taivaalta putoavia ruokia ja vältellä vihanneksi, tosin vihannekset jäivät graafikoilta piirtämättä ja tilalle tuli läjä sitä itseään.
Pelin lisäksi ryhmän piti tehdä pelille mainossivu, ja tämä toteutettiin blogikirjoituksen muodossa. Ryhmän graafikko ja tarinavastaava tekivät tämän kurssin lopussa. Vielä viimeiselläkin kerralla työstimme vielä pelejä, koska grafiikoissa oli edelleen puutteita: kerrostalon seinässä oli reikiä joista paistoi taivas, pitsapalassa oli turhaa näkymätöntä reunaa ja zombit ja zombien ampuja oli vielä piirtopöydällä. Lopulta kaikki viisi peliä olivat jotakuinkin pelattavassa kunnossa, hyvin riisuttuina versioina tosin mutta kuitenkin. Muutama graafinen elementti jäi puuttumaan, ilmeisesti pienten kommunikaatio-ongelmien takia ja zombien ampujan asekin jäi läpinäkyväksi ja ammusten lähtötaso säätämättä mutta näin voi käydä kun aika vain loppuu kesken.

Tässä pelissä piti hyppiä tasoilta toiselle ja kerätä rahoja, tasoja piti olla eri värisiä ja niiden piti kadota ja tulla taas esiin mutta tämä peli ei toteutunut aivan suunnitellulla tavalla
Kaiken kaikkiaan tämä oli hyvin mielenkiintoinen projekti. Tässä kurssissa tarkoitus ei ollut varsinaisesti oppia ohjelmointia vaan pääpaino oli uuden pelin ideoinnissa sekä projektityöskentelyn opettelussa. Ainakin ryhmille tuli selväksi, että jokaisen työpanosta tarvitaan, eikä peli tule valmiiksi jos jokin osa-alue jää tekemättä. Pelin suunnittelu oli aluksi vaikeaa, mutta lopulta suunnitelluista peleistä tuli jopa hieman turhan monimutkaisia toteutettavaksi näin lyhyen kurssin aikana. Pelipohja toimi siinä mielessä, että sen avulla pystyttiin tekemään nämä pelit, mutta kovin helppokäyttöinen se ei vieläkään ole. Lausekielen (tällä kurssilla Racket) käyttäminen näin suppealla kurssilla ei ehkä vastaa tarkoitustaan varsinkin kuin osalla koodareista ei ollut aikaisempaa kokemusta ohjelmoinnista. Asian (ohjelmointi) syväoppiminen ja pelin valmiiksi saaminen eivät ehkä toteudu saman kurssin puitteissa... Ensi lukuvuonna 8. luokan kurssin nimi onkin pelkkä "ohjelmointi". Katsotaan saako "ohjelmointi" enemmän tilaa, kun "peli"-aspekti jää pois.

Tässä pelien esittelyt löytyvät kurssin blogissa.

sunnuntai 22. toukokuuta 2016

Lietsun koodauskerho RobocupJunior - kisoissa Helsingissä 19.-21.5.2016

Lietsun koodauskerho osallistui tänäkin vuonna RobocupJunior - kilpailuihin, jotka pidettiin Kaapelitehtaalla Helsingissä. Joukkueemme koostui 9 oppilasta, yhdestä huoltajasta ja yhdestä opettajasta. Osallistuimme XSumo-, Alkeispelastus- sekä Freestyle-kilpailuihin.

XSumo

XSumo on alakoululaisille tarkoitettu yleisöystävällinen kisalaji. Siinä kaksi robottia taistelevat sumoareenalla. Se joka jää viimeisenä taistelukentälle voittaa. Tänä vuonna kisaa oli vaikeutettu niin, että sumoareenalle päästäkseen robotin oli seurattava mustaa viivaa, jonka poikki kulki kolme kirkasta teippiä.

XSumo:n kisakenttä - Joona
Meillä oli tähän kilpailuun kaksi XSumo-robottia. Robotit saatiin valmiiksi jo Tampereella viikkoa ennen kilpailuja. Molemmissa oli toimiva värisensoreiden kalibrointiohjelma ja sumolaudalle pääsy oli huolella testattu joten olimme hyvässä iskussa, kun itse kilpailut alkoivat perjantaiaamuna.

Lietsun Xsumo - robotti
Palapelitehdas - robotti
Molemmat robotit pärjäsivät kilpailuissa todella hyvin. Lietsun Xsumo oli oman lohkonsa toinen ja pääsi ensimmäisen päivän jälkeen jatkoon. Palapelitehdas oli oman lohkonsa 4, ja oli siis myös hyvin lähellä päästä jatkoon, kun lohkon 3 parasta pääsivät kilpailemaan voitosta. Lietsun Xsumo ei päässyt semifinaaleihin mutta taisteli hyvin kahdella moottorilla ja kahdella renkaalla,  kun vastustajilla saattoi olla neljäkin moottoria ja 8 rengasta!!!

Jatkokilpailuissa vastustajat olivat enimmäkseen laatikkomallisia - Oliwer
Rakentelualueella sai tuunata robotteja - Verneri ja Lenni

Muutosten jälkeen Palapelitehtaan robotti kävi uusintakatsastuksessa
Lietsun Xsumon "lumikola" osoittautui tehokkaaksi tavaksi kammeta raskaampikin vastustaja kentältä. Myös Palapelitehdas rakensi omaan robottiinsa vastaavan mekanismin toisen päivän kilpailuihin, joten robotit myös kehittyivät hienosti kisan aikana.



Alkeispelastus

Alkeispelastuksessa meillä oli sama tiimi kuin viime vuonnakin: Lauri ja Ulrika. Tällä kertaa sekä robotti, että ohjelmisto olivat valmiina viikkoa ennen kilpailua (viime vuoden pelastajarobotti ei osannut seurata viivaa vielä Tampereelta lähdettäessä). Myös pelastusryhmä oli ottanut värisensorin kalibroinnin haltuun jo ennen kilpailuja.

Lietsun Pelastajat - robotti
Alkeispelastuksessa on kaksi yritystä suorittaa pelastusrata, jossa seurataan mustaa teippiä, joka kulkee useamman "huoneen" läpi. Reitillä on ramppi, oviaukkoja, esteitä, hidasteita, katkoksia seurattavassa viivassa, 90-asteen kulmia sekä kirkkaalla teipillä merkittyjä pelastettavia, joiden kohdalla on pysähdyttävä vilkuttamaan valoja tai annettava äänimerkki. Tehtävä on haastava, koska valaistusolosuhteet ovat hyvin erilaiset talon "alakerrassa" ja "yläkerrassa", samoin molemmat radat ovat erilaiset ja niiden keskinäinen valaistus on myös erilainen. Tällä kertaa ei ollut mahdollisuutta harjoitella harjoitusradalla, mikä vaikeutti entisestään kilpailua. Onneksi torstaina sai harjoitella hieman itse kisaradoilla, ja siinä selvisi se että robotti ei pääse mäkeä ylös ilman telaketjuja ja tämä muutos ehdittiin tehdä ennen kilpailujen alkamista.

Lietsun pelastajat - Lauri ja Ulrika
Ensimmäinen pelastusyritys lähti hyvin käyntiin, robotti selvisi ensimmäisestä huoneesta mutta sitten tapahtui jotain käsittämätöntä, robotti sekosi täysin eikä pystynyt jakamaan. Syytä sekoamiseen etsittiin ja lopulta selvisi, että moottorin johto oli irronnut mystisesti kesken kisasuorituksen. Onneksi joukkue ei tästä masentunut vaan jatkoi robotin kehittelyä, lisäsi siihen kolmannen värisensorin uhrin tunnistusta helpottamaan ja ohjelmoi paremman algoritmin viivan löytämiseksi uhrin tunnistuksen jälkeen. Nämä muutokset ja johtojen tiukentaminen siivittivät robotin kolmanneksi parhaaseen suoritukseen toisena kisapäivänä (78 pistettä). Tämä ei valitettavasti riittänyt aivan mitaleille asti mutta neljäs sija oli hieno tulos tässä kovassa kisassa, jossa voitto irtosi 91 pisteellä.

Freestyle

Viime vuoden Ultracar - joukkue jatkoi tänäkin vuonna valitsemallaan uralla legoautoteknologian kehittelyssä. Heidän kilpailutyönsä oli GyroEMT, eli kahden gyrosensorin avulla kauko-ohjautuva ralliauto. Työnjako toimi tässä tiimissä kuten viimevuonnakin: Onni rakensi auton, Kassu koodasi ja Joel teki videon. Tosin Tampereelta lähdettäessä valmiina oli vain auton ja kaukosäätimen mekaniikka, ohjelma ei toiminut eikä videota oltu kuvattu...

Gyro EMT : Joel, Onni ja Kasperi
Pojat joutuivatkin melko koville kisapäivinä. Torstai-ilta koodattiin ja yritettiin saada bluetooth yhteys toimimaan kaukosäätimen ja auton välillä. Ongelma ei selvinnyt ja autoon kovakoodattiin pieni ohjelma, että saatiin pieni videonpätkä seuraavan päivän Freestyle esittelyä varten. Yön yli nukkumisen jälkeen ongelmat alkoivat pikkuhiljaa ratketa (molempiin blokkeihin päivitettiin mm. firmware), ja lopulta kauko-ohjaus lähti toimimaan iltapäivällä vain hajotakseen jälleen.... Kassu teki koko ohjelman alusta alkaen uudelleen ja perjantai-iltana sitä debugattiin kahden läppärin (ja välillä kahden opettajankin) avulla majoituskoululla. Lopulta kun koko koodi ja kaikki bluetooth asetukset oli tarkistettu, kauko-ohjaus lähti toimimaan ja videota päästiin viimein kuvaamaan oikeasti. Video valmistui 23:30 viimeisenä kisailtana. Oli siis melkoinen suoritus, että tuomarit pääsivät katsomaan toimivaa tuotetta, josta oli myös esittelyvideo!


Työ ei kovasta ponnistelusta huolimatta voittanut mitalisijoja, ja jälkikäteen ajateltuna homma taisi tällä tiimillä jäädä vähän viimetippaan, joten loppusilaus jäi tekemättä. Silti hieno suoritus!!! Tässä nähdään robotin testailua Kaapelitehtaalla.



Kaiken kaikkiaan oli hieno huomata, että kerhomme oli kehittynyt kisalajeissa ja annoimme hyvän vastuksen jokaisessa lajissa. Ensivuonna voisi olla aika ottaa ohjelmistoon uusiakin lajeja. Alkeispelastusryhmämme olisi jo valmis siirtymään varsinaiseen palastussarjaan ja Freestyle - jengi voisi kokeilla alkeisjalkapalloa, kun tuo robotin kauko-ohjaaminenkin on jo tullut tutuksi :-) Erityiskiitos mukanamme olleelle huoltaja-Niinalle! Ensivuonna sitten Ouluun!

Lietsun koodauskerho korkeasaaressa jäätelöllä

torstai 28. tammikuuta 2016

Alakoulun koodaustunteja

Ensi syksynä uusi OPS vaatii ohjelmoinnin opettamista luokilla 1-6. Koska Lielahden koulussa ei alakoulun puolella ole vielä oppitunneilla koodattu päätin, että nyt oli korkea aika kokeilla miten se sujuu.

Luokanopettajat saivat varata 1-2h paja-aikoja ja vierailin oppitunneilla vetämässä ohjelmointia. Tässä lyhyesti kokemuksia.

Ekaluokkalaisten kanssa koodasimme kaksi tuntia. Paikalla oli puolikas luokka kerrallaan. Ensimmäiselle tunnilla tutustuimme Beebot-robottiohjelmointiin. Aluksi juttelimme hieman siitä mitä robotit ovat, mihin niitä voi käyttää ja miten ne saadaan liikkumaan. Kysyin oliko joku jo  sellaisen nähnytkin (Lielahden Prismassa kuulemma oli ollut yksi täyttämässä hyllyjä). Sitten esittelin Beebotin ja kerroin millasta peliä pelaisimme sillä.

Beebot:in piti "kerätä" loogisia paloja pelikentältä (4x4). Jokaisesta oikeasta palasta sai pisteen, väärästä menetti pisteen. Koska käytössäni oli vain yksi Beebot oppilaat ohjelmoivat sitä pareittain: ensin he sopivat mitä paloja kerätään (siniset tai pyöreät tms) ja missä palat sijaitsevat. Tämän jälkeen he saivat vuorotellen ohjelmoida robotin. Sillä aikaa muut pelasivat Beebot-peliä iPadeillä.


Toisen ryhmän kanssa kokeilimme myös sitä, että pari teki ohjeet ensin paperille, ja vasta sitten tulivat ohjelmoimaan robottia. Olisi luullut, että koodin kirjoittaminen olisi auttanut pitkän ajatteluketjun saamista oikeaksi mutta tulokset olivat usein huonompia kuin ilman suunnittelua.

Toisella tunnilla tutustuimme ScratchJr iPad appsiin. Näytin ensin tykin kautta miten hahmot saadaan liikkumaan, miten hahmoja lisätään ja taustakuvaa vaihdetaan sekä miten hahmo saadaan puhumaan koskettamalla sitä (vuorosanojen äänittäminen). Toisen ryhmän kanssa ehdimme tehdä myös silmukoita ja siirtyä tasolta toiselle. Yllättävän paljon ekaluokkalaisetkin saivat tästä ohjelmasta irti.

ScratchJr
Nelos- ja viitosluokkalaisten kanssa aloitimme myös ScratchJr:lla. Ohjelma kiinnosti myös isompia oppilaita ja he tekivätkin näppärästi pidempiäkin tarinoita, joissa on useampia hahmoja sekä tasoja. Näiden ryhmien kanssa kävin läpi hieman tarkemmin ohjelman hallintaa: miten asiat saadaan tapahtumaan samaan aikaan ja miten ne saadaan tapahtumaan peräkkäin viestien avulla. Molemmat ryhmät opettelivat ohjelmaan kaksoistunnin ajan ja nelosluokka sovelsi tietojaan tekemällä Hölmöläistarinat animaatioksi. Tarinassa tarvittava esine piirrettiin ensin paperille ja sitten  valokuvattiin hahmoksi. Tämä ryhmä ei äänittänyt vuorosanoja vaan kirjoitti ne puhekupliin.

Hölmöläisten TV animaatio ScratchJr
Lego-ohjelmointia kokeiltiin kolmos-, nelos- ja viitosluokkien kanssa. Meillä oli valmiina EV3:n perusrobotit ja käytimme iPadin Lego Programming appsia. Kävimme ensin läpi robotin osat ja sen mikä niiden rooli on. Sitten näytin miten robotin saa kulkemaan eteenpäin ja kääntymään. Helpoin tapa säätää robotin kulkemaa matkaa sekä sen tekemää käännöstä tuntui olevan moottorin pyörimisajan säätö. Sitten näytin vielä miten robotin saa pysähtymään seinään ultraäänisensorin avulla.

EV3 Lego Programming iPad appsi

Tämän jälkeen oppilaat saivat haasteeksi ohjelmoida robotin kiertämään esteen (penaali) ja palaamaan lähtöviivalle (maalarinteippi). Toinen haaste oli saada robotti pysähtymään mustalle viivalle. Ja kolmas oli tehdä "pölynimurirobotti" joka toimisi lakkaamatta. Oppilaat ohjelmoivat robotteja pareittain ja koska kaikille pareille ei riittänyt robotteja he aloittivat pelaamalla Robo logic HD iPad peliä. Kun jokin pari sai haasteen valmiiksi he siirtyivät pelaamaan ja pelaajat siirtyivät robottihaasteen pariin. Kaksoistunnin aikana kaikki saivat tehtyä ensimmäisen haasteen ja puolet toisen haasteen. Muutama oppilas sai tehtyä myös pölynimurin.


Kaiken kaikkiaan oppilaat olivat innostuneita ohjelmoinnista. Robottien ohjelmointiin pystyi sitomaan mukaan hyvin tosielämän aihepiirejä kuten liikenne, fysiikka (ääni, valo, sähkö, energia) ja sekä matematiikkaa (pienempi kuin vertailuja, etäisyyden ja ajan mittaamista, logiikkaa). Animaatioiden tekeminen soveltui puolestaan äidinkielen ja kuvataiteen kanssa yhdistettäväksi projektiksi. Hieman jäin miettimään onnistuuko tämä ensi vuonna ilman minua (kuten toivon). Ehkä näillä ohjeilla?

torstai 17. joulukuuta 2015

Lietsun koodauskerhon syksy 2015

Tänä syksynä kerhon aloitti huimat 21 kerholaista (luokilta 5 - 8). Joulukuussa mukana oli vielä 13 innokasta koodaria. Syksyn aikana kerholaiset ovat saaneet valita erilaisia projekteja oman kiinnostuksensa mukaan. Tässä niistä muutamia.

Lego-robotit

Kerhossamme on rakennettu ja koodattu syksyn aikana mm. kolmea sumo-robottia, yhtä koirarobottia, kahta viivan seuraajaa, yhtä musiikkia soittavaa robottia sekä yhtä "fantasia-ajoneuvoa". Viivan seuraajat eivät vielä seuraa viivaa, mutta yritys on kova. Tässä pieni pätkä toisen viivan seuraajan koodia:

EV3:n ohjelmointi ympäristö on graafinen
Tässä sumorobotit ottavat toisistaan mittaa:


Ja tässä robottikoira yrittää kävellä (tosin vähän hassusti käy):

Racket - koodaus

Racket:llä syntyi syksyn aikana nämä hienot kuvat (osa vaati jopa rekursiivisen funktiokutsun ja listojen käyttämisen!). Myös yksi Packman animaatio/peli on hyvässä vauhdissa.

Death Pack Crystal

Death Pack Ellipse

Juuson talo


Death Star 2.0


Crazy Pixel
3D - mallinnus

Kaksi kerholaista teki 3D - malleja, sekä Blenderillä että SketchUp:illa. Myös ensimmäinen kerhossa mallinnettu esine tulostettiin 3D - tulostimella (lentokone).

Tässä kerhossa tehtyjä SketchUp - malleja:

Ilves - logo

Näsinneula

Laurin talo
Arduino - koodaus

Tänä syksynä kokeilimme ensimmäisen kerran ohjelmoida Arduinoa ja saimme ledit vilkkumaan. Teimme sen DrRacket - ohjelmalla käyttämäll ASIP - protokollaa:


Keväällä jatkuu

Keväällä onkin edessä sitten osallistuminen Tampereen Innokas kick-off:in näytöslajeihin sekä toimiminen tutoreina opettajien työpajoissa. Toukokuussa osallistumme myös Helsingissä järjestettävään Robocup Junior SM - kisoihin. Jännittävää!

tiistai 1. joulukuuta 2015

Peliohjelmointikurssin ensimmäinen askel: Whack-a-mole

Tänä syksynä aloitimme uuden mielenkiintoisen yhteistyöprojektin kuvataiteiden opettaja Jussi Kapasen kanssa: 8.lk peliohjelmointikurssi. Kurssin ideana on lähteä ideoimaan täysin uusi peli, luoda siihen tarina, pelilogiikka, grafiikat ja ohjelmoida se, kaikki tiimityönä niin kuin oikeassakin elämässä.

Ensimmäisellä kaksoistunnilla lähdimme liikkeelle niin, että muodostimme viisi devaustiimiä, jotka keksivät itselleen nimen. Jotta jokaiseen ryhmään tulisi tasaisesti koodareita, graafikoita jne. jokainen sai valita itselleen kaksi mieluisinta tehtävää, ja näin saimme jaettua porukan ryhmiin joihin jokaiseen tuli 2 koodaria, 1-2 graafikkoa ja 1 tarina/pelilogiikkasuunnittelija.

Luovan prosessin ainekset
Ennen kuin ryhmät päästettiin ideoimaan, Jussi esitteli hieman luovan prosessin taustoja, miten ideat löytyvät ja miten niiden ympärille rakennetaan kokonaisuus. Sitten keräsimme listan yksinkertaisia mutta koukuttavia pelejä, mietimme erilaisia pelikategorioita, jopa sitä miten seitsemän kuoleman syntiä liittyvät peleihin. Alustuksen jälkeen ryhmät saivat eteensä litoposterin ja tusseja ja he ryhtyivät ideoimaan omaa peliä. Ensimmäisellä kerralla ei tuntunut vielä syntyvän kovin paljoa  ideoita, mutta ryhmät oli saatu kasaan, ja jokaisella oli oma vastuualueensa.

Ensimmäisellä kerralla paperi jäi vielä aika tyhjäksi...
Koska ideointityötä tuntui hieman vaikeuttavan konkretian puute, päätimme tehdä ryhmien kanssa yhden helpon pikkupelin alusta loppuun niin, että koodarit pääsevät näkemään mitä koodaaminen on ja graafikot pääsevät käytännössä suunnittelemaan ja toteuttamaan peligrafiikkaa. Peliksi valikoitui Whack-a-mole, koska se on hyvin yksinkertainen peli, joka sallii vapausasteita grafiikan luomiseen, myyrän kun ei tarvitse olla myyrä...

Pelin koodaaminen lähti liikkeelle siitä, että suunnittelimme sen ensin yhdessä isolle valkoiselle paperille. Analysoimme mitkä asiat pelissä ovat vakioita ja mitkä muuttujia. Sitten esittelin miten käyttämämme pelimoottori toimii, ja kävimme läpi mitä funktioita (toiminnallisuuksia) pelissämme tarvitaan. Suunnittelimme myös pelin tietorakenteen paperille. Tätä "karttaa" tutkisimme sitten jokaisella koodauskerralla: mitä on jo tehty, mitä vielä puuttuu.

Tällä suunnitelmalla edettiin
Valitsin koodauskieleksi Racket-kielen, koska noin puolet kurssin koodareista oli jo koodannut Racket:illä 7. luokan matikan tunneilla ja koska se mahdollistaa grafiikoiden vaihtamisen helposti (koodi/pelilogiikka ja grafiikka ovat täysin erillään). Se mahdollistaa myös pelin muuntamisen helposti selaimella pelattavaksi versioksi (WeScheme). Harkitsin aluksi pelien tekemistä myös Scratch:illä mutta hylkäsin sen, koska siinä koodin kirjoittaminen vaatii sen, että grafiikka on jo valmiina. Lisäksi isomman pelin tekeminen Scratchillä ei houkutellut, koska kokemukseni viime vuodelta oli sellainen, että oppilaiden pelit menivät usein sellaiseen solmuun, ettei niitä pystynyt saamaan toimiviksi. Epäilen, että se johtuu osittain siitä, että siinä koodin logiikka hajoaa niin moneen pieneen osaan eri säikeisiin, jotka toimivat toisistaan riippumatta, että kokonaiskuvan saaminen koodin toiminnasta on lähes mahdotonta ja testaaminen/debuggaaminen hidasta ja hankalaa. Myös omien tietorakenteiden ja funktioiden puuttuminen vaikeuttaa monimutkaisemman  pelin tekemistä. Kolmas työkalu johon tutustuin oli MIT Appinventor mutta sen jätin pois, koska se olisi vaatinut Android puhelimia (tai emulaattoria), ja sen myötä aivan liikaa ylimääräistä säätöä, joka ei suoranaisesti liity ohjelmoinnilliseen ajatteluun tai pelin luovaan suunnitteluun.  

Koodarit työskentelivät niin, että jokainen teki omaa koodiansa, mutta tiimin sisällä vastuu oli molemmilla koodareilla yhteisesti. Eli, jos kävi niin, että toinen oli pois oppitunnilta, läsnä ollut koodari jatkoi koodia eteenpäin ja antoi sen seuraavalla kerralla koodauskaverillensa ja selitti mitä siihen oli lisätty. Ryhmät myös auttoivat toisiaan ja debuggasivat toistensa koodia. Tässä helpotti se, että koska teimme samaa peliä ryhmillä oli myös samoja ongelmia. Jokaisella kerralla alussa kertasimme suunnitelmamme kanssa mitä olimme tehneet viime viikolla, mitä pitäisi tehdä tällä tunnilla ja mitä jäi seuraavalle kerralle. 

Samalla kun teimme koodia, tutustuimme ohjelman rakennuspalikoihin: vakioihin, funktioihin ja muuttujiin, tietueisiin ja niiden kenttiin, ehtolauseeseen, hiiritapahtumiin (events) sekä testaamiseen check-expect:ien avulla. Myös boolean logiikkaa ja vertailuoperaattoreita jouduttiin käyttämään, kun koodasimme predikaattia, joka huomaa onko hiiren klikkaus osunut hahmoon vai ei. Koska meillä ei ollut tietoa tulevien "myyrien" koosta, teimme koodimme "hit-box":in sellaiseksi, että minkä tahansa kokoinen myyrän kuva toimii (säätyy kuvan koon mukaan).

Koodatessa opettelimme käyttämään myös Koodarin käsikirjaa, katsoimme sieltä mm. miten merkkijonoja käsitellään, että saimme pisteet näkymään ruudulle.  Koodaamiseen meni kolme kaksoistuntia, jonka ainaka graafikot ideoivat ja piirtelivät peligrafiikat. Neljännellä kaksoistunnilla kokoonnuimme koko ryhmä tietokoneluokkaan ja integroimme grafiikat peleihin. Monelle graafikolle ei ollut vielä selvinnyt, että kuvat piti eksportata GIMP2:sta .png muodossa, että niitä saattoi käyttää pelissä. Myös melkoinen määrä valkoista taustaa jouduttiin poistamaan pelihahmojen ympäriltä ja rajaamaan hahmojen kuvat tarkemmin, että koodiin ohjelmoitu "hit-box" toimisi oikein. Melkoisen sähellyksen jälkeen saimme kuitenkin kaikki pelit toimimaan.

Tämä harjoitus auttoi selvästi ryhmiä hahmottamaan, mitä pelin tekeminen vaatii, mitkä eri vaiheet ovat, mitä koodari tekee ja mitä graafikko tekee ja miten lopputulokseen vaaditaan jokaisen jäsenen panos.

Tämän jälkeen jatkoimme jälleen oman pelin suunnittelun kanssa koko devaustiimin voimin. Suunnittelun rinnalla porttasimme Racket - koodit WeScheme palveluun, jotta tehtyjä pelejä pääsisi pelaamaan selaimen kautta. Tässä ensimmäiset pelit!

Pelit toimivat myös iPadin kosketusnäytöllä.

Blacker Blue -tiimi


Mars - tiimi

Arcaid3 - tiimi
Swag Lords - tiimi
Tämä on erittäin mielenkiintoinen kokeilu, jännä nähdä mitä tästä vielä syntyy! Tulen tekemään myös tutoriaalivideon pelin koodaamisesta, kunhan ehdin sinne asti...

perjantai 27. marraskuuta 2015

Programming Arduino UNO with Racket

Some weeks ago I found out about this Arduino-RaspberryPi robot that you can program using Racket language and DrRacket. I contacted the creators and got some Arduino boards and accessories to play with.

Normally you would program Arduino using C/C++ and their own development environment. Since I have chosen to use Racket for teaching programming in my math class and other computer science classes, to make it easier to me and my students I would prefer to use Racket also in my physics class. And thanks to Mr Raimondi and Mr Margolis now I can!

In addition to DrRacket installation you need to install Arduino UNO USB driver to your laptop. It comes with the Arduino IDE. Arduino UNO needs to have the ASIP firmware installed, also you need to include one Racket - file "AsipMain.rkt" and you are good to go.

Here are our first two working demos:

First one blinks two leds:



(require "AsipMain.rkt")
(define LED 13)
(define LED2 12)

(open-asip)

(set-pin-mode! LED OUTPUT_MODE)
(set-pin-mode! LED2 OUTPUT_MODE)

(define (my-program)
  (begin
    (digital-write LED HIGH)
    (sleep 0.2)
    (digital-write LED LOW)
    (digital-write LED2 HIGH)
    (sleep 0.2)
    (digital-write LED2 LOW)
    (my-program)))

(my-program) 


And in the second one the led is controlled from the laptop's keyboard (spacebar):



(require "AsipMain.rkt")
(require 2htdp/universe)
(require 2htdp/image)


(define LED 13)
(open-asip)
(set-pin-mode! LED OUTPUT_MODE)

(define (draw-image y)
  empty-image)

(define (key1 y n)
  (if (key=? n " ")

      (begin (digital-write LED HIGH)
             #t)
      y))      

(define (key2 y n)
  (if (key=? n " ")

      (begin (digital-write LED LOW)
             #f)         
      y))

(big-bang #f
          (on-key key1)
          (on-release key2)
          (to-draw draw-image))


One of my students, 13 year old Lauri wrote a big part of this code and connected the wires for the demo. Thanks! We will develop this further in the coming weeks. I'm planning to use this to teach physics and programming this spring.