tiistai 26. toukokuuta 2015

7. luokan matematiikan tunneilla koodattiin Racket - pelejä

Syksyllä kun aloitimme Racket - koodauksen opiskelun, menin lupaamaan oppilaille, että koodaisimme vielä pelin. Keväällä viimeisen matikan kokeen jälkeen oli tullut aika lunastaa lupaukset...

Käytimme pelin koodaamiseen tekemääni Peruspelin pohjaa, eli hyvin pitkälle vietyä koodia, johon oppilaiden piti täydentää vain muutamia rivejä Racket - koodia. Päätin käyttää pelin tekemiseen Bootstrap - projektin WeScheme - sivustoa. Se mahdollistaa pelin koodaamisen selaimen kautta. Koska WeScheme toimii Google - tilin kautta, tein ryhmälle yhden yhteisen Google - tilin ja kopioin valmiiksi kahdeksan Peruspeli - pohjaa. Tähän päädyin, koska halusin, että peliä tehtäisiin pareittain useamman tunnin aikana (ja molempien oppilaiden piti päästä koodiin käsiksi).

Huom! Jos haluat kokeilla peruspelipohjaa, kirjaudu ensin WeScheme-sivustolle ja avaa sitten peruspelin linkki ja tallenna.
WeScheme.org sivustolle kirjaudutaan Google-tunnuksilla
Ensimmäiset kaksi tuntia meni pelin suunnitteluun ja grafiikoiden työstämiseen. Pelin idea on hyvin yksinkertainen: pelaaja liikkuu näppäimillä ylös ja alas, ja samalla väistelee vaaroja ja kerää kerättäviä, jotka liikkuvat vaakasuoraan. Oppilaat etsivät netistä taustakuvat sekä pelaajan, vaaran ja kerättävän kuvan. Tässä yhteydessä kävimme läpi myös sen, miten Googlen kuvahausta filteröidään näkyville vain sellaiset kuvat, joita saa uudelleenkäyttää ja muokata (kuinkahan moni lopulta näin teki?).

Pelaajan, kerättävän ja vaaran kuvista piti poistaa taustat (tehdä tausta läpinäkyväksi). Tähän käytimme GIMP2:sta (joku toinen ohjelma olisi voinut olla kätevämpi). Kuvat (png) ladattiin jokaisen omaan peliin WeSchemessä (kuvat tallentuvat samalla GoogleDriveen). Kuvan lataaminen generoi valmiin linkin koodin (HUOM! kursorin piti olla oikeassa kohdassa koodia, ettei generoinut linkkiä väärään kohtaan):

(bitmap/url "https://drive.google.com/uc?export=download&id=0B5CH7_F_YAvoX2RrbDl3N3JGam8")

Kuvat ladataan WeSchemeen Images-napin kautta
Kuvien lataamisen jälkeen niitä piti tietysti skaalata (scale) oikean kokoisiksi. Vaara ja kerättävä myös siirrettiin oikeille lähtöpaikoilleen, eli pelikentän reunoille. Tämä tehtiin muuttamalla kahden vakion arvioa:

(define VAARA-LÄHTÖ-X -50)
(define KERÄTTÄVÄ-LÄHTÖ-X 750)

Kun tämän jälkeen pelihahmot piti saada liikkeelle. Alussa "liikuta-varaa" - funktio näytti tältä:

;(check-expect (liikuta-vaaraa ..) ..)
;(check-expect (liikuta-vaaraa ..) ..)

;; liikuta-vaaraa : Number -> Number
(define (liikuta-vaaraa x)
  x)


Mietimme ensin mihin suuntaan vaaran piti liikkua ja teimme pari esimerkkiä. Jos vaara on kohdassa x=100 niin funktiokutsun jälkeen se on kohdassa x=110 (eli liikkuu oikealle). Tämä kirjoitettiin check-expect - lauseeseen:

(check-expect (liikuta-vaaraa 100) 110)

Kun funktion toiminta oli ymmärretty, täydennettiin funktion koodi toimivaksi:
;; liikuta-vaaraa : Number -> Number
(define (liikuta-vaaraa x)
  (+ x 10))


Vastaava operaatio tehtiin kerättävälle. Tietysti mielessä piti pitää mihin suuntaan halusi hahmojen etenevän (mahdollisesti tarvittiin miinusmerkkiäkin).

Nyt hahmot jatkoivat eteenpäin tulematta koskaan takaisin joten lisäsimme testin, jolla voitiin testata ollaanko vielä sallitulla alueella. Aloitimme chack-expect - pohdinnoilla, ja sitten kirjoitimme funktion.

(check-expect (alueella? -100) false)
(check-expect (alueella? 100) true)
(check-expect (alueella? 1000) false)

;; alueella? : Number -> Boolean
(define (alueella? x)
  (<= -50 x 750))
 

Tässä piti tajuta ottaa mukaan välin päätepisteet (jos käytti samoja lukemia kuin VAARA-LÄHTÖ-X ja KERÄTTÄVÄ-LÄHTÖ-X) muuten hahmo jäi nykimään eikä lähtenyt enää liikkeelle ollenkaan.

Seuraava vaihe oli näppäinohjauksen lisääminen pelaajalle. Suunnittelimme senkin ensin yhdessä check-expect lauseiden avulla. Nuolinäppäimet ovat "up" ja "down", tässä voi käyttää myös "w" ja "s" näppäimiä:

(check-expect (siirrä-pelaajaa 100 "up") 120)
(check-expect (siirrä-pelaajaa 100 "down") 80)
(check-expect (siirrä-pelaajaa 100 " ") 100)

;; siirrä-pelaajaa : Number Key -> Number
(define (siirrä-pelaajaa y näppäin)
  (cond [(key=? näppäin "up")(+ y 20)]

        [(key=? näppäin "down")(- y 20)]
        [else y]))

Nyt hahmot liikkuivat mutta mitään ei tapahtunut vaikka ne törmäsivät. Peruspelissä hahmojen törmääminen päätellään siitä, ovatko ne pelaajan ympärille piirretyn laatikon sisällä. Säädimme ensin laatikon koon sopivaksi ja katselimme sitä "pause"-moodissa (painetaan pelissä p-näppäintä).

(define TÖRMÄYSVARA-X 50)
(define TÖRMÄYSVARA-Y 80)


Pause - moodissa nähdään hahmojen sijainnit sekä laatikon koko (keltainen)
Koko pelin vaikein lauseke oli törmäysehtojen kirjoittaminen. Aloitimme x-suunnasta. Jotta törmäys tapahtuisi, täytyisi hahmon x-koodinaatin (x2) olla laatikon koordinaattien sisällä. Vasemman reunan x-koodinaatti saataisiin laskemalla: x1 - TÖRMÄYSVARA-X ja oikea laita laskemalla x1 + TÖRMÄYSVARA-X. Matemaattisesti ilmaistuna siis:

(x1 - TÖRMÄYSVARA-X) <  x2  < (x1 + TÖRMÄYSVARA-X)


Törmäysvarat
Ensimmäinen ehto Racket - muotoon kirjoitettuna olisi:

(define (törmäsikö? x1 y1 x2 y2)
  
(< (- x1 TÖRMÄYSVARA-X) 
       x2 
      (+ x1 TÖRMÄYSVARA-X))

Tätä testattaessa käy nopeasti ilmi, että törmäys tapahtuu aina kun pelaaja ja vaara/kerättävä ovat samalla linjalla, joten tarkistus on tehtävä myös y-koordinaatille. Tähän tarvitaan myös and:iä. Valmis funktio oli tällainen:

(define (törmäsikö? x1 y1 x2 y2)
  
(and (< (- x1 TÖRMÄYSVARA-X) 
         x2 
        (+ x1 TÖRMÄYSVARA-X))
        (< (- y1 TÖRMÄYSVARA-Y) 
         y2 
        (+ y1 TÖRMÄYSVARA-Y))))

Viimeinen silaus pelille saadaan, kun lisätään pisteiden päivittäminen. Pelissä on kaksi tilannetta "törmäys-vaara" ja "törmäys-kerättävä". Tämänkin funktion suunnittelu tehtiin check-expect:ien kanssa:

(check-expect (päivitä-pisteet 100 "törmäys-vaara") 90)
(check-expect (päivitä-pisteet 100 "törmäys-kerättävä") 110)

;; päivitä-pisteet : Number String -> Number
(define (päivitä-pisteet pisteet tapahtuma)
  (cond [(string=? tapahtuma "törmäys-vaara") (- pisteet 10)]

        [(string=? tapahtuma "törmäys-vaara") (+ pisteet 10)] ))        
  
Pelien tekemiseen meni kaikkiaan 6 matematiikan oppituntia (niistä kaksi kuvien käsittelyyn). Aivan kaikki parit eivät saaneet peliänsä valmiiksi mutta valmiitakin pelejä saatiin aikaiseksi. Yksi pari jatkoi koodauskerhossa aloitettua peliänsä (Bootstrap II pelipohjalla tehty). Pelin tekeminen tuntui kiinnostavan oppilaita, ja oli tärkeää että jokaisella oli oma ideansa toteutettavaksi. Peliä tehdessään oppilaat kyselivät mm. miten kerättävät saisi liikkumaan pystysuuntaan tai pelaajan sivusuuntaan, miten voisi vaihtaa pelaajan hahmoa, zoomata lähemmäs tms. Peruspelin pohjalla ei näitä muutoksia kuitenkaan tässä ajassa olisi pystynyt tekemään, vaikka kaikki on tietysti periaatteessa mahdollista... Aikaa oli nytkin hieman liian vähän, asioiden sulatteluun menee  yllättävän kauan. Pari tuntia olisi tarvittu vielä lisää niin olisimme saaneet kaikki pelit valmiiksi, ja ehtineet hieman pelatakin niitä.

Tällaisia esimerkkejä siitä millaisia pelejä matikan tunnilla syntyi (osasta puuttuu pisteiden laskeminen). Pelaaminen joko nuolinäppäimillä tai s ja w näppäimillä. Peli alkaa välilyönnillä (myös uusi peli alkaa välilyönnillä). Voit katsoa törmäysaluetta pause - moodilla (paina "p"):

Ammu tuomari - peli (pelaa)
Racket War:issa kerätään Sprite - juomia ja vältellään punaista rakettia (pelaa)
Apinapelissä kerätään banaaneja ja vältellään leijonaa (pelaa)
Homer-pelissä pisteitä saa, jos hamppari osuu Homerin suuhun, pisteitä lähtee jos se joutuu roskikseen (pelaa)
Avaruuspelissä ammutaan vihreitä ammuksia ja pujotellaan asteroidien välistä (pelaa)
Tämä ryhmä oli koodanneet Racket - kielellä jo aikaisemmin, pohjalla oli n. 10 tuntia Racket-koodausta. Osalle oppilaista oli selvästikin syntynyt jonkinlaista ymmärrystä ohjelmoinnista, joten pelin tekeminen ei tuntunut ollenkaan mahdottomalta. Mielenkiinnolla odotan mitä tämä porukka saa aikaan syksyllä kun peliohjelmoinnin kurssi alkaa. 

sunnuntai 24. toukokuuta 2015

Vierailu Tampereen Hacklabiin

Innokas-verkoston Tampereen aktiivit kävivät tutustumassa Tampereen Hacklabin tiloihin ja toimintaan tiistaina 19.5. Hacklab on Mode 5w Ry:n ylläpitämä ja pyörittämä harrastustila, jossa jäsenet voivat käyttää tiloista löytyviä työkaluja ja koneita. Jäsenmaksun lisäksi Hacklab-yhteisön jäsenten odotetaan osallistuvan tilan välineiden huoltamiseen ja kunnostamiseen.

Hacklab:in tiloista tuntui löytyvän aivan kaikkea. Jäsenten käytössä on: CNC-laserleikkuri (puulevyt, muovilevyt, nahka jne.), CNC-plasmaleikkuri (metallilevyt), iso ja pieni CNC-jyrsin (puu), hiekkapuhallin sekä 3D-tulostin. Elektroniikan tekemiseen oli varattu kaksi työpistettä välineineen ja työkaluseinällä oli mistä valita. 

Plasma- ja laserleikkurit, 3D-tulostin, työkaluseinä sekä Mika, Timo, Auli ja Juha

Hacklab:ssä voi siis tehdä lähes mitä vaan: koristeleikkauksia puulevyihin, leikatuista puulevyn paloista koottavia esineitä, tulostaa muoviesineitä, rakentaa robotteja jne.

Hacklabin tuotteita ja Timo
Hacklabissä tapasimme myös Arnon, joka esitteli meille uskomattomia robottejaa. Robotit olivat kuin pieniä eläviä olentoja, liikkuvia taideteoksia! Tässä videota Arnon roboista:


Suuri kiitos Hacklabille vierailusta, saimme paljon ideoita myös Innokas-verkoston toiminnan kehittämiseen!

lauantai 23. toukokuuta 2015

Käsityökerho Robotin Arduino - kurssi 16.5.

Osallistuin Käsityökerho Robotin Arduino-kurssille lauantaina 16.5. Kurssi pidettiin Espoossa taidekeskus Aurorassa sijaitsevissa Käsityökerho Robotin tiloissa. Kurssin vetäjänä toimi Tomi Dufva, toinen Käsityökerho Robotin perustajista.

Arduino Uno, ledejä ja koekytkentälevy
En ollut aikaisemmin tehnyt mitään Arduinoilla, olin toki nähnyt niitä ja tiesin, että niiden avulla voi rakennella pieniä robotteja, kuten OpinSys Nallen tai viivanseuraajarobotin. Ennen kurssia latasin valmiiksi Arduinon ohjelmointiympäristön täältä. Arduinoja voi ohjelmoida myös selaimen kautta Codebenderillä.

Lähdimme tietysti liikkeelle ledin vilkuttelusta. Kiinnitimme yhden ledin pinniin 13 ja pistimme sitä päälle ja pois (pinniin 13 voi kytkeä ledin suoraan ilman vastusta). En ollut aikaisemmin ohjelmoinut ledejä vilkkumaan (saati tehnyt elektronisia kytkentöjä) joten riemu oli suuri kun se todellakin rupesi vilkkumaan. Kytkentä oli siis näin yksinkertainen (piirretty 123D Autodesk Circuit - palvelussa):

Yksi led pinnissä 13
Ja käytetty ohjelmakoodi oli näin yksinkertainen:

// yhden valon vilkutus

// vakiot


int led1 = 13; //led on pinnissä 13 (pitkä haara), lyhyt on GND:ss
 
void setup() {
  // put your setup code here, to run once:
  pinMode(led1, OUTPUT); // pinnissä 13 on "ulostulo"

}

void valonVilkutus(int pinni){
  digitalWrite(pinni, HIGH);
  delay(1000);       //
aika mikrosekunneissa, yksi sekunti
  digitalWrite(pinni,LOW);
  delay(1000);

}
    
void loop() {
  // put your main code here, to run repeatedly:
  valonVilkutus(led1);   // kaikki koodi laitetaan "loop":in sisään

}

Ledin sai vilkkumaan satunnaisesti tällä koodilla:

void randomValo(int pinni){
  digitalWrite(pinni, HIGH);
  delay(random (1000));            

  digitalWrite(pinni,LOW);
  delay(1000);
  }


Ledin himmentäminen ja kirkastaminen automaattisesti menee näin (ledin pitää olla kiinni ~merkin omaavassa pinnissä, jotta himmentämisessä tarvittava PWM = Pulse Width Modulation toimii). Kykentä tehdään näin:
Himmennettävä led kiinnitetään pinniin, jossa on ~
Ja koodissa ledin arvo asetetaan analogWrite:lla (ei digitalWrite:lla):

// ledin himmennys ja kirkastus

// vakiot
int kirkkaus = 0;  // kuinka kirkas led on
int lisays = 5;    // paljonko kirkkaus lisääntyy (255 maksimi)
int led1 = 11;     // tukee PWM:ää

void setup() {
  // put your setup code here, to run once:
  pinMode(led1, OUTPUT);    // kytkentälevyn led1
}

 
void himmennys(int pinni){
  analogWrite(pinni, kirkkaus);
  kirkkaus = kirkkaus + lisays;
 

  if (kirkkaus == 0 || kirkkaus == 255){
  lisays = -lisays;
  }
  delay(30);

}
     
void loop() {
  // put your main code here, to run repeatedly:
  himmennys(led1);
}


Yksinkertaisen kytkimen voi tehdä kahden johtimen kanssa näin (johtimet yhdessä -> valo palaa, johtimet irti valo sammuu):

Oikealla olevat punaiset viivat esittävät irtonaisia johtimen päitä, joilla voi sulkea virtapiirin
// kytkin

// vakiot

int led1 = 11;
int kytkin = 7;
int kytkimentila = 0;

void setup() {
  // put your setup code here, to run once:
  pinMode(led1, OUTPUT);
  pinMode(kytkin, INPUT_PULLUP);
/* PULLUP=alasvetovastus, jännite jää alas */ 
}
 
void valokytkin(int pinni){
  kytkimentila = digitalRead(kytkin);
  if (kytkimentila == LOW)  {  // jos johdot koskevat eli maadotettu
    digitalWrite(pinni, HIGH);
    }
    else {
      digitalWrite(pinni, LOW);
    }

}
   
void loop() {
  // put your main code here, to run repeatedly:  

  valokytkin(led1);
}

Ledin himmentäminen valovastuksen avulla onnistuu tällä koodilla. Valovastus kytkettiin vastuksen kanssa niin, että jännite otetaan ulos niiden välistä. Eri komponenttien kytkentätavat voi katsoa esim. Autodesk 123D Circuits sivuilta. Siellä voi myös simuloida Arduino koodin toimintaa. Toinen vastaava ohjelma on Fritzing (tosin se vaatii asentamisen).

Valovastuksella himmennetty led
Tässä koodin pätkässä käytetään myös sarjamonitoria lukemaan valovastuksen arvoja sekä seuraamaan skaalauksen tulosta:

int valoisuus = 0;
int skaalattu = 0;
int valovastus = A2;    // analoginen sisääntulo
int led1 = 11;          
String vakioteksti1 = " valovastus = ";
String vakioteksti2 = " skaalattu = ";

void setup() {
  Serial.begin(9600);    // otetaan sarjamonitori käyttöön
  // put your setup code here, to run once:
  pinMode(led1, OUTPUT);
  pinMode(valovastus, INPUT);
}
 

void himmennin(int pinni){
  valoisuus = analogRead(valovastus);
  Serial.println(valoisuus);    // "serial print line"
  delay(30);

  // mäppää arvot välille 0 - 255 (alussa 20 - 800)  

  skaalattu = map(valoisuus, 20, 800, 0, 255);   
  Serial.println(vakioteksti1 + valoisuus);       
  Serial.println(vakioteksti2 + skaalattu);
  analogWrite(pinni, skaalattu);  // skaalattu on välille 0-255



void loop() {
  // put your main code here, to run repeatedly:
 himmennin(led1);
}

Huomaa valovastuksen kytkentä!
Tässä käytetään valovastuksen arvoa sytyttämään yksi led kun on kirkasta, kaksi kun on vähän hämärämpää ja kolme kun on pimeää:

Kolme lediä ja valovastus
int valoisuus = 0;
int valovastus = A2; // analoginen
int led1 = 11;
int led2 = 12;
int led3 = 13;

void setup() {
  // put your setup code here, to run once:
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(valovastus, INPUT);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  valoisuus = analogRead(valovastus);  

  delay(30);
 
  if (valoisuus > 700){
    digitalWrite(led1, HIGH);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    }
   else if(valoisuus > 100 && valoisuus < 700) {
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, LOW);
     } else
     {
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    }

Normaalissa valaistuksesssa palaa kaksi lediä
Tällä koodilla säädellään ledin vilkkumisnopeutta valoisuuden mukaan (kirkkaassa valossa hidas vilkkuminen, pimeässä ei vilkuta ollenkaan ja normaalissa valaistuksessa nopeasti). Tässä voidaan käyttää samaa kytkentää kuin valovastuksella himmennetyssä ledissä (kytkennän ja koodin toiminta  on simuloitu 123D Autodesk Circuit - palvelun avulla):


int valoisuus = 0;
int valovastus = A2; // analoginen
int led1 = 11;

void setup() {
  // put your setup code here, to run once:
  pinMode(led1, OUTPUT);
  pinMode(valovastus, INPUT);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  valoisuus = analogRead(valovastus);
  delay(30);

 
  if (valoisuus > 700){
    digitalWrite(led1, HIGH);
    delay(1000);
    digitalWrite(led1, LOW);
    delay(1000);
    }
   else if(valoisuus > 100 && valoisuus < 700) {
     digitalWrite(led1, HIGH);
     delay(100);
     digitalWrite(led1, LOW);
     delay(100);
     } else
    digitalWrite(led1, LOW);
}


Ja tältä se ledien vilkuttelu sekä valovastuksen toiminta sitten näyttää livenä (kuvassa näkyy Arduino Uno, koekytkentälevy sekä käytetyt komponentit: vastukset, ledit, johtimet sekä valovastus):


Tässä linkkejä, joista voi olla apua kun lähtee suunnittelemaan omia projekteja:
Voisin kuvitella, että 9. luokan sähköopin opiskelun yhteydessä voisin hyvinkin käyttää Arduinoja sekä koodauskerhon touhuissa. Nyt pitäisi vain ostaa sellainen itselle, että pääsisi kokeilemaan kurssilla opittua. Toinen kurssi olisi vielä tarpeen, että osaisi ohjata mottoreita (että aukeaisi mikä se mystinen H-silta ja shield-juttu ovat...).

maanantai 18. toukokuuta 2015

lauantai 2. toukokuuta 2015

Lietsun koodauskerhon kevät

Lietsun koodauskerho jatkoi monipuolista ohjelmointiin tutustumista myös kevätkaudella. Syksyllä aloittaneista kerholaisista vain 4 innokkainta jatkoi keväällä mutta onneksi saimme kaksi uutta 7. luokkalaista täydentämään tiimiä.

Tammikuussa syntyi pari Racket-peliä Bootstrap-projektin ohjeiden mukaan. Sitten kerholaiset tutustuivat Lego-robotteihin rakentamalla robotteja netistä löytyvien valmiiden ohjeiden pohjalta. Varsinainen RoboCupJunior-kilpailuihin valmistautuminen lähti liikkeelle sumorobotin rakentamisella.

Hiihtoloman jälkeen saimme viimein lisää Lego-robotteja ja samoihin aikoihin syntyi poikien päässä idea huippunopeasta UltraCar:ista. Aivan viime metreillä päätimme koota vielä yhden alkeispelastus-robotinkin. Näiden kolmen robottin rakentelun sekä ohjelmoinnin parissa vierähtikin sitten koko loppukevät.

Sumo-Lietsu
Sumo-Lietsu posteri
Sumo-Lietsun rakensi ja ohjelmoi 6. luokkalainen Lauri Pahkala. Hän suunnitteli, rakensi, ohjelmoi ja testasi väsymättä robottiaan koko kevään. Sumo-Lietsu osallistui RoboCupJunior kisoissa Innokas-robottisumoon.

Aivan ilman kommelluksia ei Sumo-Lietsukaan selvinnyt kisoissa: se ei päässyt läpi ensimmäisestä katsastuksesta pituutensa takia. Painon kanssa ei onneksi ollut ongelmia (700g).

Sumo-Lietsu ei mennyt ensimmäisestä katsastuksesta läpi
Sumo-Lietsu taisteli älykkyytensä avulla hienosti jopa itseään paljon isompia vastustajia vastaan.

The Saviour

Kerhomme alkeispelastusrobotti ei osannut Tampereelta lähtiessä seurata mustaa viivaa. Robottiin oli kiinnetty ensin yksi, sitten kaksi valosensoria ja ohjelmointi-ideoita oli haettu katselemalla useampikin youtube-video mutta siitä huolimatta robotti ei selvinnyt edes siitä ensimmäisestäkään mutkasta.

Onneksi menomatkalla Joensuuhun pelastustiimimme ohjelmoijat (Ulrika Kaara ja Lauri Pahkala) saivat Pohjois-Hervannan koulun robottiguruilta arvokkaita vinkkejä. Vinkki nro 1 oli käyttää värisensoria "reflected light"-asetuksella (ei "color").

Kisapaikalla tiimimme keksi Vinkki nro 2:n seuraamalla muiden kilpailijoiden robottien toimintaa: valosensoreita ei kannattanut laittaa aivan kiinni toisiinsa! Tämän oivalluksen jälkeen robotti korjattiin ja ohjelmoitiin uudelleen ja kuin ihmeen kaupalla se alkoi seurata viivaa torstai-iltana!

The Saviouriin tehdään tärkeitä muutoksia kisapaikan rakentelupisteessä
Tässä The Saviour seuraa ensimmäisen kerran mustaa viivaa! Voi sitä riemua!


Lopulta The Saviour:ia testattiin, korjattiin ja koodattiin tiiviisti koko kilpailun ajan. Sen renkaat vaihdettiin telaketjuihin ja sen koodiin tehtiin lisää tarkennuksia. Erityisesti palastusradalla oleva ylämäki osoittautui vaikeaksi päästä ylös samoin 90-asteen mutkat tuottivat ongelmia. Lopulta koodi oli niin herkkä, että jos sen sääti toimimaan hyvin ylämäessä niin tiukat käännökset eivät enää toimineetkaan. Myös kisapaikan valaistusolosuhteet olivat hankalat: testiradalla ja kisaradalla valaistus oli erilainen, joten vaikka robotti suoritti testiradan hyvin, itse kilpailussa se ei enää onnistunutkaan. Pitänee harjoitella valosensorin kalibrointi ensivuoden kisoja silmällä pitäen... 

Lauri ja Ulrika tekivät kisan jälkeen vielä esittelyvideon, josta näkyy mitä kaikkea The Saviour lopulta osasi tehdä (ja miltä se lopulta näytti):


UltraCar

Team UltraCar:in tavoitteena oli tehdä mahdollisimman nopea auto. Pojat rakensivatkin auton, jossa jokaisella renkaalla oli kaksi moottoria sekä nopeutta lisäävä vaihteisto. Moottoreita ohjasi kaksi NXT-yksikköä, jotka keskustelivat toistensa kanssa BT-yhteyden avulla.

UltraCar osallistui Innokkaan Freestyle-kisaan. Kilpailusuoritukseen kuului robotin esittely SciFest-messuilla, posterin tekeminen sekä mainosvideon teko.

Team UltraCar:in muodostivat kolme 7.luokkalaista: Onni Pakka, Joel Ålander sekä Kasperi Kirijatshenko.
UltraCar posteri
Team UltraCar sai kisoissa Kunniamaininnan

 Tässä vielä videokooste kerhomme kisasuorituksista ja vähän muidenkin.


Kerhon vetäjän näkökulmasta nämä Lego-projektit olivat todella onnistuneita monestakin syystä.  Ensinnäkin kerholaisia ei ollut vaikea motivoida tekemään robotteja, koska heillä oli tavoite selvänä: kisareissu odottaisi kaikkia, jotka saisivat robotin kisakuntoon. Toinen erittäin tärkeä aspekti oli  tiimien muodostuminen ja toisten auttaminen. Erityisesti Freestyle-robotin tekemisessä tiimin jäseniltä vaadittiin monenlaista osaamista: ideointi, rakentaminen, ohjelmointi, valokuvaaminen, videokuvaaminen, editointi, messuilla esittely jne. Myös alkeispelastus osoittautui mielenkiintoiseksi ja sangen haastavaksi lajiksi, ei vähiten sen takia, että kerhon vetäjä ei ollut koskaan itse tehnyt, saati nähnyt toimivaa viivanseuraajarobottia. Ja ilman näitä kisoja viivanseuraajan tekeminen olisi saattanut jäädäkin vain haaveeksi. Onneksi kisoissa oli vallalla auttamismentaliteetti ja muiden joukkueiden vinkkien ja vihjeiden avulla robottimme ja ohjelmoijamme kehittyivät huimasti!

Kiitos Innokas-verkosto ja RCJ-Finland hienoista kisoista! Ensivuonna uudelleen!