sunnuntai 6. toukokuuta 2018

Neuroverkoista - perseptronit ja sigmoid-neuronit


Olen kurssilla Johdatus tekoälyn taustalla olevaan matematiikkaan, ja siitä innostuneena päätin kirjoittaa hieman neuroverkoista. Todella mielenkiintoinen aihe ja kurssi! Olen jo pitkään haaveillut tekoälyyn liittyvistä kursseista, ja vihdoin se toteutui! Opin paljon paremmin silloin, kun kirjoitan aiheesta, joten päätin kirjoittaa tänne blogiini. Teksti on melko suoraan otettu sivulta http://neuralnetworksanddeeplearning.com/chap1.html, jota kurssilla tulee lukea. Kiinnostuneet voivat siis tutkailla aihetta enemmän sieltä! Sivusto on ilmainen nettikirja, mikä on todella hienoa. En siis väitä näitä tekstejä tai esimerkkejä omikseni, kaikki on kyseiseltä sivulta oppimistarkoituksessa suomennettuna. Olen ottanut myös hieman infoa kurssini luentomonisteesta, eli Jyväskylän yliopiston Johdatus tekoälyn taustalla olevaan matematiikkaan -kurssin Tim-sivuilta. P.s. jos tiedätte paremman suomennoksen jollekin termille, saa vinkata! :)

NEUROVERKOT


https://3c1703fe8d.site.internapcdn.net/newman/gfx/news/hires/2017/algorithmlev.jpg


Ihmisillä on näköaivokuoressa 140 miljoonaa hermosolua, joiden välillä on kymmeniä miljardeja yhteyksiä. Silti ihmisen näköön ja kuvien prosessointiin tarvitaan monia muitakin näköaivokuoria. Käsinkirjoitettujen numeroiden tunnistaminen ei siis ole helppoa, ja se tapahtuu ihmisillä alitajuisesti.

Visuaalisten kuvioiden tunnistamisen vaikeus tulee esille silloin, kun täytyy kirjoittaa tietokone-ohjelma, joka tunnistaisi käsinkirjoitettuja numeroita. Vaikka tunnistaminen on meille helppoa, se on todella vaikeaa ohjelmille. Ei ole helppoa ilmaista algoritmisesti muotojen tunnistamista. Esimerkiksi numerossa 9 tunnistamisen ohje voisi olla: "Numerossa 9 on silmukka ylhäällä ja pystysuuntainen veto oikealla alhaalla".

Neuroverkot lähestyvät ongelmaa eri tavalla. Ideana on ottaa suuri määrä käsinkirjoitettuja numeroita harjoitusesimerkkeinä ja kehittää siitä systeemi, joka voi oppia kyseisistä esimerkeistä. Toisin sanoen neuroverkko käyttää esimerkkejä apunaan tehdäkseen automaattisesti johtopäätöksiä, jotta se voi tunnistaa käsinkirjoitetut numerot. Mitä enemmän harjoitusesimerkkejä on, sitä paremman tarkkuuden verkko voi oppia käsinkirjoitetuista numeroista.

Keinotekoisia neuroneja on kahta tyyppiä, perseptroni (perceptron) ja sigmoid-neuroni (sigmoid neuron). Standardi oppimisalgoritmi neuroverkkoihin on stokastinen gradienttimenetelmä (stochastic gradient descent).

PERSEPTRONIT


Yksi keinotekoinen neuroni on perseptroni. Frank Rosenblatt kehitti perseptoronit 1950- ja 1960-luvulla Warren McCullochin ja Walter Pittsin töiden innoittamana. Nykyisin käytetään tavallisesti toisenlaisia keinotekoisten neuronien malleja, yleisesti sigmoid-neuroneja. Jotta voi kunnolla ymmärtää, miksi sigmaneuronit määritetään niin kuin ne määritetään, on hyvä ymmärtää perseptroneja.

Perseptroniin syötetään useita eri binäärisiä syötteitä (inputeja), ja se tuottaa yhden binäärisen ulostulon (outputin). Ulostulo, joka on arvoltaan 0 tai 1, lasketaan syötteiden painotuksien summan ∑jwjxj  avulla. Painotuksien summan tulee olla yli tai alle jonkin tietyn raja-arvon.

output = 0 jos ∑jwjxj ≤ threshold

output = 1 jos ∑jwjxj > threshold


Perspetronia voi ajatella laitteena, joka tekee päätökset painottamalla eri asioita. Esimerkiksi jos viikonloppuna on festarit, saatat painottaa eri asioita päättääksesi, menetkö sinne vai et. Päätökseen voi vaikuttaa 3 tekijää:

1. Millainen sää on 
2. Haluaako ystäväsi tulla mukaan 
3. Onko festivaaleille helppo päästä julkisilla kulkuvälineillä. 

Päätöksentekoa voi helpottaa mallintamalla sitä perseptroneilla. Näitä kolmea yllä mainittua tekijää voi vastata muuttujat x(sää), x(ystävä)ja x(julkinen liikenne). x1:n arvo voi olla 1, jos sää on hyvä ja 0, jos sää on huono. x2:n arvo voi olla 1, jos ystävä haluaa tulla mukaan ja 0, jos hän ei halua tulla mukaan. x3:n arvo on 1, jos festareille pääsee bussilla ja 0, jos sinne ei pääse bussilla. 

Eri tekijöille voi antaa erilaisia painotuksia. Pidät festareista niin kovasti, ettei päätöksentekoon vaikuta kovin paljon se, tuleeko ystäväsi mukaan vai ei tai se, onko sinne helppo päästä. Näissä painotukset ovat siis pienet ( w1 = 2 ja w3 = 2). Mutta et todellakaan haluaisi olla siellä sateessa, joten sää painaa vaakakupissa enemmän kuin seura ( w2 = 6). Valitset lopuksi perseptronin raja-arvoksi numeron 5. Näillä valinnoilla perseptroni toteuttaa päätöksenteon mallinnuksen tuottamalla ulostulon 1 jos sää on hyvä ja 0, jos sää on huono. Tulokseen ei vaikuta paljoakaan se, onko ystävä tulossa mukaan tai pääseekö sinne bussilla.

Painotuksia ja raja-arvoa muuttamalla saadaan erilaisia päätöksenteon malleja. Jos esimerkiksi raja-arvo olisi 3, halukkuus festareille menemiseen kasvaisi. Perseptronit voivat siis punnita erilaisia tekijöitä tehdäkseen päätöksiä. Mitä mutkikkaampia verkostoja, sitä hienovaraisempia päätöksiä tulisi.

Kuva on otettu osoitteesta http://neuralnetworksanddeeplearning.com/images/tikz1.png


Perseptroneja voi olla eri kerroksissa. Jokainen uusi kerros voi tehdä monimutkaisempia päätelmiä, koska se painottaa aiemman kerroksen syötteitä. Perspetronin kuvausta voidaan yksinkertaistaa esimerkiksi korvaamalla raja-arvo vaikotermillä (bias, b). En mene tässä postauksessa kovin paljon syvällisemmin matematiikkaan, kiinnostuneet voivat katsoa sitä alkuperäiseltä sivulta http://neuralnetworksanddeeplearning.com/chap1.html. Vakiotermi kertoo, miten helppo perseptronin on saada arvo 1, eli miten helppoa perseptronin on aktivoitua. Suurella vakiotermillä perseptronin on todella helppo tuottaa ulostulo 1.  Jos b on hyvin negatiivinen, perseptronin on vaikea saada arvoa 1.

Perseptroneja voidaan käyttää myös laskemaan loogisia funktioita, kuten AND, OR ja NAND-funktioita. NAND-portilla voi laskea mitä tahansa loogisia funktioita, koska se on universaali. Perseptronit ovat tavallaan vain uusi tyyppi NAND-porteista. 

Oppimisalgoritmien avulla voidaan kuitenkin automaattisesti säätää keinotekoisten neuroverkkojen painotuksia ja vakiotermejä. Kyseinen säätäminen tapahtuu vasteena ulkoiseen ärsykkeeseen ilman, että ohjelmoija vaikuttaa siihen suoraan. Oppimisalgoritmien avulla keinotekoisia neuroneja voidaan käyttää tavalla, joka on erilainen verrattuna loogisiin portteihin. Neuroverkot voivat oppia ratkaisemaan ongelmia, jotka olisi vaikea pala perinteisille virtapiireille, esimerkiksi loogisille porteille. Perseptronin ongelmana kuitenkin on, että pienet muutokset painotuksissa tai syötteissä aiheuttavat ison muutoksen tuloksessa (0 /1).


SIGMOID-NEURONIT


Miten oppimisalgoritmeja voi suunnitella neuroverkoille? Olkoon meillä perseptronien verkosto, jota haluaisimme käyttää ongelmanratkaisuun. Syötteet voivat olla esimerkiksi raakapikselidataa skannatusta, käsinkirjoitetusta numeron kuvasta. Verkoston halutaan oppivan painotukset ja vakiotermit niin, että verkoston ulostulo luokittelee luvut oikein. Jotta näemme, miten oppiminen voisi toimia, teemme pienen muutoksen joihinkin painotuksiin tai vakiotermeihin. Tämän pienen muutoksen painotusten suuruudessa tulisi muuttaa ulostuloa vain hieman. Verkosto voisi esimerkiksi virheellisesti luokitella numeron 8 numeroksi 9, jolloin voisimme selvittää, miten tehdä pieniä muutoksia painotuksiin ja vakiotermeihin, jotta verkosto osaisi paremmin luokitella kuvan numeroksi 9. Tätä toistettaisiin niin kauan, kunnes ulostulo olisi parempi, eli verkosto oppisi.

Näin ei kuitenkaan tapahdu, kun käytetään perseptroneja. Perseptroneja käytettäessä pienet muutokset painotuksessa tai vakiotermissä voi aiheuttaa verkon ulostulon ”flippaamisen” radikaalisti esimerkiksi nollasta ykköseen. Esimerkiksi 9 voidaan muutosten jälkeen tunnistaa oikein, mutta muiden kuvien tunnistaminen olisi tällöin luultavasti muuttunut vaikeasti kontrolloitavaksi. Tällöin on vaikea huomata, millä tavalla kannattaa vähitellen muokata painotuksia ja vakiotermejä, jotta verkosto pääsisi lähemmäksi haluttua lopputulosta. Ei siis ole täysin selvää, miten perseptronien verkko voidaan saada oppimaan.

Ongelma ratkeaa uuden tyyppisten keinotekoisten neuronien,  sigmoid-neuronien, avulla. Ne ovat samanlaisia kuin perseptronit, mutta pienet muutokset niiden painotuksissa ja vakiotermeissä aiheuttavat vain pienen muutoksen niiden ulostuloon. Se on tärkeä tekijä  sigmoid-neuronien kyvyssä oppia.

Kuva otettu osoitteesta http://neuralnetworksanddeeplearning.com/images/tikz11.png


Sigmoid-neuroneilla on sisääntulo, mutta ykkösen ja nollan sijaan ne voivat olla mitä tahansa arvoja 0:n ja 1:n väliltä. Sigmoid-neuroneilla on jokaiselle sisääntulolle painotus ja vakiotermi, mutta ulostulo ei ole 0 tai 1, vaan sigmoid-funktio σ(wx+b), joka määritellään σ(z)≡    1 / 1+e−z

Sigmoid-neuronin ulostulo syötteillä x1, x2,..., painotuksilla w1, w2,..., ja vakiotermillä b on

1 / 1+exp(−∑jwjxj−b)


Perseptronien ja sigmoid-neuronien väillä on kuitenkin monia yhtäläisyyksiä, sillä sigmoid-funktion algebrallinen muoto on lähinnä tekninen yksityiskohta. Havainnollistetaan sigmoid-funktion samankaltaisuutta perseptronimallin kanssa: olkoon z≡wx+b jokin suuri positiivinen luku. Tällöin e−z ≈ 0 ja σ(z) ≈ 1. Eli kun  z = w * x + b on suuri ja positiivinen luku, sigmoid-funktio on noin 1, kuten perseptronissa. Mutta jos z = w * x + b on hyvin negatiivinen, e−z → ∞ ja σ(z) ≈ 0, eli ulostulo on 0. Eli kun z = w * x + b on hyvin negatiivinen, sigmoid-neuronin käyttäytyminen on myös lähellä perseptronin käyttäytymistä. Vain silloin, kun z = w * x + b on maltillisen kokoinen, sigmoid-neuroni poikkeaa perseptronin mallista.

Sigmoid-funktion huono ominaisuus on se, että se kasvaa hyvin hitaasti kun x kasvaa ja vähenee hyvin hitaasti kun x vähenee. Sen derivaatta on hyvin lähellä nollaa kun x on suuri tai pieni. Tästä seuraa ongelmia, kun verkkoa opetetaan derivaattoihin perustuvilla menetelmillä. Koska virhefunktion osittaisderivaatat neuronin painotuksien ja vakiotermien suhteen riippuvat aktivointifunktion derivaatasta, ja painotuksien ja vakioiden muutokset koulutettaessa ovat pieniä jos osittaisderivaatat ovat pieniä, verkko oppii hitaasti. Toinen sigmoid-funktion huono puoli on se, että se ei ole symmetrinen nollan suhteen. Nykyisin sitä käytetään lähinnä ulostulokerroksessa varsinkin jos verkon tulokset ovat välillä [0,1][0,1].

HERMOVERKKOJEN ARKKITEHTUURI


Kuva otettu osoitteesta http://neuralnetworksanddeeplearning.com/images/tikz11.png


Vasemmanpuoleisin kerros on syötekerros (input layer), jossa olevat hermosolut ovat syöteneuroneja (input neurons). Oikeanpuolimmaisin ulostulokerros (outputlayer) sisältää ulostuloneuronit (output neurons), joissain tapauksissa vain yhden. Keskimmäinen kerros on piilokerros (hidden layer), koska siinä olevat neuronit eivät ole syötteitä tai ulostuloja. Jos piilokerroksia on useita, niitä kutsutaan joskus perseptronien monikerrokseksi eli MLP:ksi, vaikka siinä olisikin sigmoja.

Syötekerroksen ja ulostulokerroksen verkon suunnittelu on yleensä suoraviivaista, mutta piilokerrosten suunnittelu on usein melkoista taiteilua: ei ole peukalosääntöjä, joilla niitä voisi suunnitella. Piilokerrosten suunnittelussa käytetäänkin apuna heuristiikkaa.

Eteenpäin kytketyiksi verkoiksi (feedforward neural networks) kutsustaan neuroverkkoja, joissa yhden kerroksen ulosotuloa käytetään seuraavan kerroksen syötteenä. Verkossa ei ole siis loopeja eli kiertoja, koska informaatio syötetään aina eteenpäin, ei ikinä taaksepäin.

Toistuviksi / uusiutuviksi keinotekoisiksi neuroverkoiksi (recurrent neural networks) kutsutaan verkkojen malleja, joissa kierto on mahdollista. Näiden mallien ideana on neuronit, jotka ovat aktiivisia tietyn osan ajasta, ennen kuin niistä tulee uinuvia. Aktivointi voi stimuloida muita neuroneja vaikka hieman myöhemminkin, mikä johtaa lopulta monien neuronien aktivoitumiseen. Loopit eivät aiheuta mallissa ongelmia, koska neuronin ulostulo vaikuttaa sen sisääntuloon vasta vähän myöhemmin eikä heti. Nykyisin toistuvien neuroverkkojen opettelualgoritmit ovat vielä vähemmän voimakkaita kuin eteenpäin kytkettyjen verkkojen. Mutta toistuvat neuroverkot ovat silti mielenkiintoisia, koska ne toimivat samankaltaisemmin kuin omat aivomme.

YKSINKERTAINEN VERKKO KÄSINKIRJOITETTUJEN KIRJAINTEN TUNNISTAMISEEN



Käsialan tunnistaminen voidaan jakaa kahteen alaongelmaan.  Ensin kuva lukusarjasta tulisi jakaa yksittäisiin kuviin, esim 456 olisi 4, 5 ja 6. Kuvan jakaminen on helppoa meille ihmisille, muta haasteellista tietokoneohjelmalle. Toiseksi, kun kuva on jaettu, jokainen yksittäinen numero tulee luokitella. Lukusarjan jakaminen yksittäisiin lukuihin onnistuu esimerkiksi siten, että numeroiden luokittelua käytetään lähestymistapana. Kannattaa siis keskittyä toiseen ongelmaan eli numeroiden luokitteluun.

Erottelu saa korkeat pisteet, jos yksittäisen numeron luokittelija on varma kaikkien numeroiden luokittelussa. Alhaisen numeron erottelu saa, jos luokittelijalla on ongelmia joidenkin numeroiden kohdalla. Ideana on, että jos luokittelijalla on jossain ongelma, sillä on luultavasti vaikeuksia siksi, että erottelu on valittu väärin perustein. Tätä ja muita vaihtoehtoisia tapoja voidaan käyttää ratkaisemaan erotteluongelma melko hyvin.

Kuva otettu osoitteesta http://neuralnetworksanddeeplearning.com/images/tikz12.png


Käsinkirjoitetun yksittäisen numeron tunnistamiseen tarvitaan kolmekerroksista neuroverkkoa (yllä). Syötekerros sisältää neuroneja, jotka koodaavat syötepikselien arvot. Verkoston harjoitteludata koostuu monesta 28 x 28 pikselin käsinkirjoitettujen numeroiden kuvista, joten syötekerros koostuu 784 = 28 x 28 neuronista. Syötteen pikselit ovat harmaaväriskaalattuja: arvo 0.0 esittää valkoista, arvo 1.0 esittää mustaa ja väliin jäävät arvot esittävät asteittain tummenevia harmaan sävyjä.

Piilokerroksen neuronien lukumäärää kuvataan n:llä. Ulostulokerros sisältää 10 neuronia. Jos ensimmäinen neuroni aktivoituu eli sen ulostulo on 1, se merkitsee, että verkko ajattelee numeron olevan 0. Jos toinen neuroni aktivoituu, se osoittaa, että verkko ajattelee numeron olevan 1 jne. Tarkemmin sanottuna ulostuloneuronit numeroidaan luvuilla 0-9 ja selvitetään, millä neuroneista on korkein aktivointiarvo. Jos se on kutosella, verkko arvaa, että syötekuva oli 6.

OPPIMINEN GRADIENTTIMENETELMÄN AVULLA


Miten neuroverkko voi oppia tunnistamaan numeroita? Sen täytyy ensin oppia ns. harjoitusdatasetistä.  Esimerkiksi MNIST datasetti sisältää kymmeniätuhansia skannattuja kuvia käsinkirjoitetuista numeroista sekä niiden oikeat luokittelut. MNIST data on kaksiosainen. Ensimmäinen osa sisältää 60 000 kuvaa, joita käytetään harjoitusdatana. Nämä kuvat on skannattu 250 ihmisen käsinkirjoitetuista näytteistä. Kuvat harmaaväriskaalataan ja asetetaan 28 x 28 pikselin kokoisiksi. Toinen osa MNISTin datasetistä sisältää 10 000 kuvaa, joita voi käyttää testidatana. Nekin ovat 28 x 28 harmaaväriskaalattuja kuvia. Testitataa käytetään arvioimaan, kuinka hyvin hermoverkko on oppinut tunnistamaan numeroita. Jotta saavutettaisiin mahdollisimman hyvä suoritus, testitdata otettiin 250 eri ihmiseltä kuin alkuperäinen harjoitusdata. Se varmistaa, että systeemi kykenee tunnistamaan numeroita ihmisiltä, joiden kirjoitusta se ei ole nähnyt harjoituksen aikana.

x:llä ilmaistaan harjoitusyötettä. Jokainen harjoitussyöte x on 28 x 28=784 -ulotteinen vektori. Jokainen vektorin alkio edustaa kuvan yksittäisen pikselin harmaa-arvoa (grey value). Haluttua ulostuloa merkitään y = y(x), missä y on 10-ulotteinen vektori. Halutaan algoritmi, mikä auttaisi löytämään painotukset ja vakiotermit niin, että verkon ulostulo vastaisi y(x):ää kaikilla harjoitussyötteillä x. Jotta voidaan arvioida, miten hyvin tämä tavoite on saavutettu, määrittetään virhefunktio C:


Virhefunktio C kertoo, miten hyvin verkon ulostulo vastaa y(x):ää kaikilla harjoitussyötteillä x. Jos C on lähellä nollaa, harjoitusalgoritmi on suoriutunut hyvin. Mikäli C:n arvo on suuri, se tarkoittaisi, ettei y(x) ole monilla syötteillä lähellä ulostuloa a. Halutaan siis löytää sellaiset painotukset ja vakioarvot, jotka tekevät C:n mahdollisimman pieneksi. Se onnistuu käyttämällä algoritmiä nimeltään gradienttimenetelmä.

Gradienttimenetelmän päämääränä on siis löytää painotukset ja vakiotermit, jotka minivoivat virhefunktio C(w,b):n arvon. Oppimisessa gradienttimentelmää käytetään korjaamaan neuronien parametrit. Tarkempaa tietoa gradienttimenetelmän matemaattisesta puolesta ja sen periaatteista voi lukea alkuperäiseltä sivulta http://neuralnetworksanddeeplearning.com/chap1.html
_________________________________________________________________________

Siinä oli hieman infoa ja käsitteitä neuroverkoista ja siitä, mihin koneoppiminen neuroverkkojen avulla perustuu. Hirmuisen mielenkiintoista! 

lauantai 24. helmikuuta 2018

Piin ohjelmointia Arduinolla ja säikäyttäviä tilanteita

"Pieni Pii, niin viaton ja vapaa" ajattelin mielessäni, kun mietin pientä Piitäni. Mutta sitten hoksasin että hetkinen, vapaako? Eihän se pidäkään paikkaansa, sillä olen ohjaillut Piitä vain kaukosäätimellä. Se ei siis ollut vielä liikkunut ohjelmoinnin avulla satunnaista kokeilua lukuunottamatta! Kokeilin joskus kauan sitten Scratchia eli ohjelmaa, jolla palikoita siirtämällä voidaan ohjelmoida. Mutta tietotekniikan opinnoissani olin jo oppinut jonkin verran ohjelmointia, ja siitä itseluottamukseni syttyikin! Halusin tarjota Piille vapauden kaukosäätimen kahleista ja kokeilla, miten saisin sitä ohjelmoitua kunnolla. No, onhan se koodatessakin koodien vanki, mutta ei kerrota sitä vielä hänelle...katsokaa, miten touhuissaan se lähtee kohti seikkailuja!



En oikeastaan ollut täysin varma, voiko Makeblockin robottia ohjelmoida muutoin kuin mBlockilla, mikä siis on graafinen ohjelmointiympäristö, joka perustuu Scratchille:

MBlock-ohjelmointiympäristö, joka perustuu Scratchille.


Kesti oma aikansa selvittää asiaa, mutta sain vihdoin googlen avulla selville, että mBlockilla pitäisi pystyä siirtymään Arduinon kehitysympäristöön ja koodata siellä. Sen löytää avaamalla mBlockin, valitsemalla Edit ja Arduino mode, jolloin koodilaatikko ilmestyy oikealle puolelle. Jee, olin askelen lähempänä!




Mutta ei kyseisestä laatikosta vielä voinut siirtää koodia Piihin. Sitten hoksasin pienen Edit with Arduino IDE-napin yläkulmassa:


Jipii, tein sen! Paitsi hetkinen, mitään ei tapahtunut, kun painon kyseistä nappia. Googlettamalla selvisi, että mBlockin päivityksen pitäisi auttaa avaamisongelmiin. Päivitystä etsiessäni törmäsin alla olevaan kuvaan ja innostuin valtavasti mBlock 5:sta: pääsisinkö sen avulla harjoittelemaan Pythonia?! Olen haaveillut Pythonin opettelusta, koska sitä kuulema käytetään tekoälyn kanssa työskennellessä. No, voihan sitä kyllä opetella helposti miten vain, mutta olisi kiva, jos voisin yhdessä Piin kanssa harjoitella sitä <3 Vielä ei kuitenkaan ole Pythonin aika, sillä kädet on tällä hetkellä täynnä Java-kielen opettelussa, koska käyn ohjelmoinnin kakkoskurssia. Se on melko työläs kurssi! Oli ihme, että löysin aikaa edes tämän blogin kirjoittamiseen!

mblock 5, joka tukee Python-kieltä. Jee!

Jihuu, päivitys auttoi! Pääsin avaamaan mblockista Arduinon kehitysympäristön! Se on siis alla olevassa kuvassa näkyvä turkoosi laatikko. Siihen vain koodia kirjoittamaan!



Latasin Makeblockin Arduinon koodikirjaston täältä. Sen avulla voin siis avata Arduinon kehitysympäristössä valmiita koodeja, joilla esimekiksi testata Piin toimivuutta. Testaaminen on hyvä tehdä aina aluksi, koska siten nähdään heti, toimiiko kaikki kuin pitääkin. Jos koodia kirjoittaessa ja ladatessa kaikki ei toimikaan kuin pitää, voi siten olla varmempi siitä, ettei vika ole ns. perusjutuissa, vaan todennäköisesti itse koodissa. Valitsin ensin työkaluista oikean alustan, eli "Työkalut - Kortti: Arduino/Genuino Uno". Tarkistin myös, että portti on oikea, mutta siinä ei ollutkaan muita vaihtoehtoja kuin yksi. Testasin ensin moottoreita valitsemalla alla olevan kuvan mukaisesti kirjastosta esimerkkikoodin, painoin lähetä-nuolta (Pii oli tässä vaiheessa jo kytkettynä koneeseen), ja laitoin Piin päälle:



Ja hyvin moottorit hurisivat! Näettehän, miten hurjasti Piin telaketjut rullaavat, en haluaisi olla tuon pikkukaverin tiellä!


Päätin kokeilla, saisinko Piin kulkemaan ympyrää. Otin mallia, miten moottoritestikoodi toimi, ja muokkasin sitä niin, että toinen moottori pyörii vauhdikkaammin kuin toinen. 


Erittäin yksinkertainen koodi, mutta sitäkin riemastuttavampi kokemus, kun Pii alkoi piirtää lempimuotoani eli ympyrää! Tuntui, että mikä tahansa on mahdollista, koska sain sellaisen aikaan. Voi Pii, rakas apurini elämän leikkikoulussa <3



Halusin sen jälkeen testata koodin avulla Piin ultraäänisensoria. Se olikin hieman kinkkisempi toteuttaa, koska en aluksi saanut Piitä pysähtymään, kun jokin tulisi liian lähelle. Ultraäänisensori näytti kyllä toimivan, koska sarjamonitori näytti sen lukemia. Koodi ei vain toiminut niin, että Pii olisi pysähtynyt, kun välimatka on tarpeeksi pieni. Arduino käyttää käsittääkseni ohjelmointikielenä C:tä tai C++:aa, eikä kumpikaan ole minulle tuttuja. 

Olin kuitenkin oppinut jotain koodauskursseilla, joten jonkin ajan kuluttua koin valtavan upean jipii-elämyksen, kun Pii vihdoin pysähtyikin seinän sattuessa kohdalle! En valitettavasti enää viikon parin jälkeen muista, mikä koodissa alunperin oli minulle ongelmana ;__; Harmittaa, etten päässyt tarpeeksi ajoissa dokumentoimaan touhujani. Käytin koodissa Makeblockin koodikirjaston moottori- ja ultraäänisensoripohjia, mutta rakensin koodin kuitenkin lopulta itse, mistä olen ylpeä <3 Vielä vuosi sitten en edes ymmärtänyt, mistä koodaamisessa oli kyse! Todella upeaa huomata oma kehittymisensä. Käytin seuraavanlaista koodia:

Koodissa on käytetty pohjana makeblockin koodikirjaston moottoripohjaa.

Alla vielä avopuolisoni kuvaama taiteellinen otos siitä, miten hienosti Pii pysähtyy seinän sattuessa liian lähelle <3


Touhuillessa sattui tosin vielä tilanne, mikä säikäytti: en saanutkaan millään johtoa enää irti Piistä! Mietin kauhuissani, olinko innoissani runnonut johdon liian ronskisti Piihin. Pieni raukka... Kauhukuvat vilisivät silmissäni, joudunko kenties ostamaan Piille uuden alustan? Jonkin aikaa meni, ennen kuin vihdoin sain johdon irti. Mutta nähtävästi kaikki sujuu vielä kuin pitääkin. Johto taas irtoaa, sen jälkeen, kun sen laittaa liittimeen. Huh! Pitää olla tästä lähin varovaisempi.


Lopuksi vielä vihjekuva siitä, mitä seuraava projektini tulee sisältämään. Jeee, sain vihdoin hommattua hieman työkaluja! Yksisarvinen ei valitettavasti tule kuulumaan mukaan projektiin, se vain halusi mukaan kuvaan <3 


maanantai 6. marraskuuta 2017

Herkkuvahti

Oletko ikinä haaveillut herkkuvahdista, joka hälyttää, jos joku lähestyy aarteitasi? Sellainen on nimittäin helppo tehdä! No, oikeastihan herkkuja on kiva jakaa ja syödä muiden kanssa: jaettu ilo on kaksinkertainen ilo. Ehkä vahti voisi siis olla vaikka itseä varten. Ehkä haluat vähentää herkuilla mässäilyä, mutta kädet kulkeutuvat automaattisesti niitä kohti. Silloin herkkuvahti antaisi muistutuksen!



Herkkuvahti-projektissa opin, että projektia kannattaa lähteä rakentamaan vaihe vaiheelta. Jokaista osaa kannattaa testata erikseen, jotta näkee, missä mahdollinen vika on. Opin myös yhdistämään koodia, testasin ensimmäistä kertaa Arduino Nanoa ja liitin ensimmäisen kerran ulkoisen virtalähteen Arduinoon. Katsoin Herkkuvahtiin ohjeet pääosin Tero & Kimmo Karvisen kirjasta Sulautetut - Opi rakentamaan robotteja ja muita sulautettuja järjestelmiä. Olin todella innoissani, kun ystäväni halusi myydä kirjan minulle! Olin etsinyt kyseistä kirjaa kaikkialta, mutta se oli loppuunmyyty.

http://sulautetut.fi/img/cover-sulautetut.jpg

Kirjassa neuvottiin, miten rakennetaan Väijyvahti. Se mittaa ultraäänisensorilla edessään olevaa etäisyyttä ja hälyttää värinällä, jos jokin tulee ultraäänisensoria liian lähelle. Kirjan Väijyvahdissa käytettiin tärinämoottoria, jota minulla ei ollut. Aloin pohtia, osaisinko käyttää sen tilalta summeria. Tutkailin netistä kummankin komponentin liittämistä koekytkentälevyyn. Kytkennät vaikuttivat samanlaisilta. Luin niistä esimerkiksi täältä ja täältä. Tiedän myös jo koodaamisesta jotakin, joten luotin siihen, että osaan kirjoittaa ja yhdistää koodit oikealla tavalla, vaikken kirjasta sanasta sanaan niitä kopioisikaan. Törmäsin muuten värinämoottoreita tutkiessani todella loistavaan Ihmevekotin- nettisivustoon, jossa myydään mm. erilaisia sensoreita ja muuta elektroniikkaa. Tuntui kuin olisin eksynyt lelukauppaan, koska siellä vaikutti olevan niin paljon kaikkea mielenkiintoista! Pitää tutustua sivustoon tarkemmin. Tai no enpä tutustukaan enempää, koska sitä selaillessani tekee mieli tilata sieltä kaikki! :|

Päätin käyttää tässä projektissa ensimmäisen kerran Arduino Nanoa; aiemmin olen käyttänyt Arduino Unoa. Luin, että Uno ja Nano toimivat käytännössä samalla tavalla, Nano on vain pienempi ja siinä on nähtävästi pari pinniä vähemmän. Mutta saman koodin pitäisi toimia niihin kumpaankin. Liitin Nanon suoraan koekytkentälevyyn, toisin kuin Unon. Täällä on vertailtu eri Arduino-malleja. Kirjan mukaan tarvitsin seuraavanlaiset varusteet:

Kuva on kirjasta Sulautetut - Opi rakentamaan robotteja ja muita sulautettuja järjestelmiä. Tero karvinen & Kimmo Karvinen (2010).

Minulla ei ole leikkureita eikä johdonkuorintapihtejä, ja värinämoottorin tilalta käytin summeria. Alla minun varusteeni (johtoja tarvitsin enemmän kuin vain kuvassa olevat, ja paristokin puuttuu kuvasta):



Rakensin projektin seuraavalla tavalla:

1. Testasin Arduinon toimivuuden

Ensin testasin, että Arduino toimii. Liitin sen tietokoneeseen usb-johdolla, avasin Arduino-sovelluksen ja latasin Arduinoon Blink-koodin. Sen pitäisi siis saada Arduinon sisäänrakennettu valo vilkkumaan. Aluksi se ei toiminut, mutta en ollut vain hoksannut valita oikeaa porttia. Jee, sain ladattua kaikki testaamani koodit arduinoon! Yksi testattavista on myös tekemäni SOS-koodi, eli Arduino vilkuttaa SOS-merkkiä. Mutta Blink tulee valmiina Arduino-sovelluksessa, ja senkin testaaminen riittää.

2. Ultraäänisensorin kytkeminen koekytkentälevyyn


Kirjan ohjeessa käytetään Ping-ultraäänisensoria, mutta minulla on vain HC-SR04-ultraäänisensori. Olin muistavinani, että Piillä olisi Ping-sensori, mutta sillä olikin joku ihan oma! Suloista <3 Kirjassa Make:Sensors -Projects and Experiments to Measure the World with Arduino and Raspberry Pi (Tero karvinen, Kimmo Karvinen & Ville Valtokari) on kerrottu Pingin ja HC-SR04-sensorin eroista. Erona on, että HC-SR04 käyttää erillisiä pinnejä äänen tuottamiseen ja kaiun mittaamiseen. Sen koodi eroaa siis hieman Ping-sensorin koodista. Luin sensorien eroista jo jossain aiemmassa projektissani, mutta olin jo unohtanut. Sulautetut-kirjassa on käytetty Ping-sensoria, joten otin projektiini koodin samojen tekijöiden Make: Sensors kirjasta. Toivoin, että koodi toimii Nanollakin, koska Make: Sensors kirjassa on käytetty puolestaan Unoa. Mutta luin, että saman kodin pitäisi toimia kummassakin, ja toimihan se. Koodit vaikuttivat kirjoissa myös hieman erilaisilta, muttei paljon. Ping ja HC-SR04 kytketään melkein samanlailla koekytkentälevyyn, mutta HC-SR04:ssa pitää otta huomioon se yksi ylimääräinen pinni. Alla on kuvat kytkentöjen eroista:

HC-SR04-sensorin kytkeminen koekytkentälevyyn ja Arduino Unoon. Kuva kirjasta Make:Sensors -Projects and Experiments to Measure the World with Arduino and Raspberry Pi.Tero karvinen, Kimmo Karvinen & Ville Valtokari(2014).




Ping-sensorin kytkeminen koekytkentälevyyn ja Arduino Unoon. Kuva kirjasta Make:Sensors -Projects and Experiments to Measure the World with Arduino and Raspberry Pi.Tero karvinen, Kimmo Karvinen & Ville Valtokari(2014).

Tältä valmis kytkentäni näytti!



Koodi ultraäänisensoriin on otettu siis samasta kirjasta kuin yläpuolella olevat kytkentäkuvat.

Koodi kirjasta Make:Sensors -Projects and Experiments to Measure the World with Arduino and Raspberry Pi.Tero karvinen, Kimmo Karvinen & Ville Valtokari(2014).


3. Summerin kytkeminen

Minulla oli sekä passiivinen että aktiivinen summeri, kumpaahan kannattaisi käyttää? Luin netistä, että aktiivinen summeri tuottaa ääntä itse, kun taas passiiviselle pitäisi itse lähettää äänisignaali. Päätin siis käyttää aktiivista. Mutta mitenhän erotan aktiivisen ja passiivisen summerin toisistaan tämän projektin jälkeen, koska ne kummatkin on merkitty alla olevassa kuvassa näkyvällä plussalla? Oletin, että passiivisessa summerissa olisi ollut miinus. Hetkinen, tätä kirjoittaessani hoksasin, että plus tarkoittaa positiivista jalkaa! Olin kytkentöjäni tehdessä pohtinut, kumpi on positiivinen ja kumpi negatiivinen jalka. Päädyin siihen, että jalat ovat varmaan samanlaiset kuin ledeissä, eli pitempi olisi positiivinen. Olihan se!



Summerin kytkeminen mietitytti, koska Väijyvahdin kuvissa, joissa oli käytetty tärinämoottoria, moottori oli kytketty johtojen avulla koekytkentälevyyn, kun taas minun summerissani oli vain jalat. Toinen, positiivinen, pää tulisi liittää Arduinon pinniin ja toinen , negatiivinen, Groundiin sekä värinämoottorin että summerin tapauksessa. Olisi hankala liittää summeri vain jalkojen avulla kokeytkentälevyyn: en olisi saanut venytettyä sitä niin, että toinen jalka osuisi samalla riville Arduinon GND:n kanssa ja toinen pinnin kanssa. Mutta onneksi muistin toimineeni aiemmassa projektissani niin, että kytkin komponentin uros-ja naarasjohtojen janalla kiinni komponenttiin tai koekytkentälevyyn. En tosin tiedä miten järkevää se on, mutta se toimi myös summerin kohdalla! Tältä kytkentäni näytti.



Otin summeriin koodin tältä sivulta. Muutin vain pinnin tilalle pinnin 5.



4. Koodien yhdistäminen


Yhdistin ultraäänisensorin ja summerin koodit muutoin Sulautetut-kirjan ohjeiden mukaan, mutta muuntelin sitä summerille sopivaksi. Yllätyin, että koodi toimi ensimmäisellä yrittämällä, kuten kaikki muukin tässä projektissa! Kuva lopullisesta, yhdistetystä koodista:

Koodi on mukailtu kirjan Sulautetut - Opi rakentamaan robotteja ja muita sulautettuja järjestelmiä. Tero Karvinen &     Kimmo karvinen (2010) ohjeen mukaan.

5. Pariston liittäminen 

Halusin luomukseni toimivan myös ilman usb-kaapelia, jotta sitä voisi siirrellä vapaasti. Sulautetut-kirjan ohjeiden mukaan siihen tarvitsisi vain paristonepparin, joka minulla oliki tullut Arduino-paketin mukana. Ongelmana vain oli, että paristonepparissa oli päässä tällainen liitin:



Liitin sopii Arduino Unon alustaan, mutta Nano oli kiinni koekytkentälevyssä, eikä Nanossa ollut liitoskohtaa nepparille. Huomasin Ihmevekotin.fi-sivulla myytävän halvalla paristoneppareita, joten päätin katkaista omasta nepparistani pään pois, jotta voisin liittää ne koekytkentälevyyn. Käytin tähän operaatioon saksia, koska minulla ei ole leikkureita. Hoksasin leikkaamisen jälkeen, että johdot pitää kuoriakin, jotta sähkö pääsee virtaamaan. Kokeilin mattoveistä, ja pienen urakoinnin jälkeen onnistuinkin! Mutta Charmmy Kitty vihkoni hieman kärsi, koska käytin sitä alustana. No, uhrauksia pitää välillä tehdä.




 Nyt vain tungin johtojen päät koekytkentälevyn koloihin ja liitin toisen pään paristoon, joka tuli myös Arduino-pakettini mukana. Tältä lopputulos näytti!


Nyt viritelmääni voi liikuttaa vapaasti ilman, että tietokone roikkuu siinä kiinni. Tulen vielä  jossain vaiheessa opettelemaan koteloiden tai muiden suojien kasaamista virityksilleni, jotta ne näyttäisivät nätimmiltä. Tadaa, nyt herkkuvahti on valmis! Se päivystää tässä sipsipussiani. Voisin myös laittaa summerin piippaamaan SOS-merkkiä aina, jos joku lähestyy soveltamalla koodiin aiemmin ledeille tekemääni SOS-koodia.



Olin todella innoissani ja inspiroitunut tehdessäni tätä projektia, koska olin iloinen siitä, että huomasin edistyneeni! En ollut enää epävarma otteissani, eikä  koekytkentälevyn kanssa puuhailu tuntunut enää uudelta ja vieraalta asialta. Huomasin, että tekemällä oppii: osasin yhdistää aiemmissa projekteissani saavuttamaani tietoa tähän nykyiseen projektiin. Olen opetellut tietotekniikan opinnoissani koodausta, joten osasin myös jo hieman soveltaa koodia. Olen huomannut, että sekä tietotekniikan opinnoissani että näiden projektien rakentelussa opin ja minun kannattaa opetella ongelmanratkaisua, eikä pyrkiä osaamaan kaikkea ulkoa. Se taitaa olla melko itsestäänselvyys. Jos on jokin ongelma, miten sitä kannattaa lähteä ratkomaan? Mistä saan tietoa, jota tarvitsen esimerkiksi projektin tekemiseen? Jos osaan selvittää kysymyksiin / ongelmiin ratkaisut, kaikki on mahdollista! Olen huomannut, että olen melko hyvä etsimään tietoa. Hyödynnän ja yhdistelen monia eri kirjoja ja internetiä, ja toimin paljon myös intuitioni pohjalta kun etsin vastauksia. Pääsen myös helposti flow-tilaan. Ehtisinpä pian tehdä taas uuden projektin! Koulu vie käytännössä kaiken aikani työni kanssa, mutta se on sen arvoista.

_______________________________________________________________________

Projekti herkkuvahti - yhteenveto:


Ongelmakohtia, joita kohtasin, mutta jotka selvitin
- värinämoottorin korvaaminen summerilla
- koodien kirjoittaminen ja yhdistäminen värinämoottorin sijaan summerille
- koodien kirjoittaminen ja yhdistäminen Ping-sensorin sijaan HC-SR04-sensorille
- onko Arduino Unon ja Nanon koodeissa eroavaisuuksia
- kumpaa summeria käyttää, aktiivista vai passiivista?
- paristonepparin liittäminen koekytkentälevyyn

Mitä opin
- Käyttämään Arduino Nanoa
- Yhdistämään koodeja
- Projektin rakentamisen periaatteet - testaaminen vaihe vaiheelta
- Ulkoisen virtalähteen liittäminen Arduinoon
- Ultraäänisensori Pingin ja HC-SR04:n eroja

Projektissa käyttämäni tietolähteet
-  Sulautetut - Opi rakentamaan robotteja ja muita sulautettuja järjestelmiä. Tero Karvinen &     Kimmo karvinen (2010).
- Make: Sensors. Projects and Experiments to measure the World with Arduino and        Raspberry Pi. Tero karvinen, Kimmo Karvinen & Ville Valtokari (2014).
- https://forum.arduino.cc/index.php?topic=129741.0



perjantai 11. elokuuta 2017

Tarvitsevatkohan kasvini kastelua?

Seuraava kokeiluni oli todella kiva projekti! Laitoin kasvin multaan maaperänkosteussensorin, joka mittasi mullan kosteutta. Mikäli multa oli liian kuivaa, ledi valoi punaisena ja ohjelma tulosti tekstiä "Time to water your plant". Mikäli multa oli tarpeeksi kosteaa, ledi paloi vihreänä, ja ohjelma tulosti tekstiä "Doesn't need watering". Se oli helppo tehdä ohjeita seuraamalla, ja lopputulos näytti tältä:



Miten päädyin kyseiseen lopputulokseen? Minun oli ollut tarkoitus jo pitkään rakentaa automaattinen kastelujärjestelmä, joten teki mieli kokeilla ensin pelkästään mullan kosteuden mittaamista maaperänkosteussensorilla. Päädyin testailemaan kahta eri projektia, joista toisen esittelin yllä, ja se on mielestäni parempi. Ensimmäisen projektin lopputulos oli mielestäni hieman epätarkka, eikä se sisältänyt kivoja ledejä!

Projekti 1


Katsoin Make: Sensors kirjasta, olisiko siinä neuvoja kasvin mullan kosteuden mittaamiseen, ja olihan siinä! Kirjassa kerrottiin, että normaali hanavesi ja maaperän vesi sisältävät liuenneita suoloja ja muita materiaaleja, mikä tekee vedestä sähköä johtavan. Maaperänkosteussensorit mittaavat kyseistä sähkönjohtavuutta. Mutta minun kosteussensorini näyttivät erilaisilta kuin kirjassa:


Kirjan sensoriin ei kuulunut elektronista osaa, toisin kuin minun sensoreihini. Lisäksi sensorini numerointi oli erilainen kuin kirjassa. Minun sensorini oli nimeltään YL-69, kun taas kirjassa sensori oli  nimeltään FC-28.



No, kirjan kytkentäkaaviosta ei olisi apua, koska ne on tehty sensorille, joka liitetään vain Arduinoon. Päätin etsiä netistä ohjeita, jotka sopisivat minun varusteisiini. Törmäsin create.arduino.cc:n sivuilla ohjeeseen, jossa on käytetty samaa sensoria ja sen mukana tulleeseen elektronista osaa, jotka minullakin ovat. Jee! Elektroninen osa on nimeltään YL-39 ja suluissa kerrottiin sen olevan "logic", minkä arvelen viittaavaan siihen, että osa voisi olla looginen piiri. Arvelen, että looginen piiri muuttaa sensorin tiedot Arduinolle luettavaan muotoon binääriluvuiksi. Kävin viime vuonna hieman kurssia "Tietokoneen rakenne ja arkkitehtuuri", mutten saanut käytyä sitä kovin pitkälle. Tänä vuonna uudestaan!

Luin projektin kytkentäkaavion Fritzing -ohjelmalla. Sillä voi testailla erilaisia kytkentöjä, kätevää! Kytkentäkaavio (ja Fritzing-ohjelma) on tämän näköinen:


Ongelmana oli, että sekä sensorien mukana tulleet johdot että arduinon nastojen kytkentäkohdat olivat naaras-tyyppiä (punaiset ympyrät kuvassa). Jotta Arduinon nastaan voisi kytkeä johdon, sen tulisi olla koiras-tyyppiä (turkoosi ympyrä kuvassa). YL-39:n nastat puolestaan ovat koiras-tyyppiä, joten niihin tulee liittää naaras-tyyppinen johto. En siis voinut liittää omaa koiras-johtoani Arduinosta YL-39:iin, koska siihen tarvitaan naaras-päätteinen johto.


Päätin liittää koiras-johdon Arduinoon ja myös naaras-johtoon. Naaras-johto sopisi sitten YL-39:iin. Ehkä tuollainen johtojen yhdistely on jokin yleinen käytäntö elektroniikassa, tai sitten on olemassa jotain adaptereita, en tiedä kun ei ole kokemusta. Mutta kokemusta onneksi koko ajan kertyy! Testaamisvaiheessa näkisi, toimiiko tuollainen. Tosin miksei toimisi?

 

Tällainen kytkennästä tuli!


Sitten vain koodin lataus samalta sivulta kuin ohjekin eli osoitteesta https://create.arduino.cc/projecthub/nekhbet/using-the-yl-39-yl-69-soil-humidity-sensor-with-arduino-968268. Luin muuten tänään uudesta kirjastani Exploring Arduino - Tools and techniques for engineering wizardy (kirjoittanut Jeremy Blum) Arduinon koodaamisesta. Tiedän nyt siis tarkemmin, mitä alla olevassakin koodissa on tehty! Kirjoitan Arduinon koodaamisesta myöhemmin. Kirja vaikuttaa muuten todella loistavalta!

// YL-39 + YL-69 humidity sensor
byte humidity_sensor_pin = A1;
byte humidity_sensor_vcc = 6;

void setup() {
  // Init the humidity sensor board
  pinMode(humidity_sensor_vcc, OUTPUT);
  digitalWrite(humidity_sensor_vcc, LOW);

  // Setup Serial
  while (!Serial);
  delay(1000);
  Serial.begin(9600);
}

int read_humidity_sensor() {
  digitalWrite(humidity_sensor_vcc, HIGH);
  delay(500);
  int value = analogRead(humidity_sensor_pin);
  digitalWrite(humidity_sensor_vcc, LOW);
  return 1023 - value;
}

void loop() {
  Serial.print("Humidity Level (0-1023): ");
  Serial.println(read_humidity_sensor()); 
  delay(10000);
}

Sitten laitoin vain sensorin multaan, ja valmista tuli! 


Johtoviritelmäni toimi! Aluksi ohjelman tulostus ei näyttänyt mitään, mutta muistin ultraäänisensorikokeilusta, että pitää valita oikea baudi. Tässä se oli 96000, joten valitsin sen. O-ou, kasvini multa näytti melko kuivalta! Sen arvo oli vain 20 väliltä 0 ja 1023!


Päätin kokeilla ohjesivuston kommenteissa kerrotua juttua, eli sensorin kastamista vesilasiin.


Mutta hetkinen, kosteusarvo näytti vain noin viittäsataa. Mikäli vedessä ollessaan kosteusarvo ei ole maksimissaan eli 1023, niin milloin sitten? Onkohan tässä asetelmassa tai koodissa jotain vikaa? Vai johtuukohan tulos kraanaveden ominaisuuksista, jos jotkin tekijät vaikuttavat sen sähkönjohtokykyyn? En halunnut vielä kastella kasviani, koska halusin kokeilla toisenlaistakin projektia, joten en tiedä, paljonko kosteusarvo olisi ollut märällä mullalla. Päivitän tänne sitten, jos joskus kokeilen! Hmm, mittausta olisi mielenkiintoista kokeilla myös esimerkiksi kivennäisvedellä, maaperän vedellä ja sadevedellä.


Projekti 2


Halusin kokeilla myös toisenlaista projektia kasvien mullan kosteuden mittaamiseksi, koska en ollut varma, oliko ensimmäinen kokeiluni onnistunut. Tämä projekti vaikutti kivalta! Siinä käytettäisiin myös koekytkentälevyä ja ledejä. Tarvitsin projektiin Arduinon, kosteussensorin ja sen elektronisen osan lisäksi siis myös koekytkentälevyn, kaksi lediä, kaksi 220 ohmin vastusta sekä johtoja.



Kytkentäkaavio näytti tältä:




Ja tällainen se oli minun tekemänäni:




Latasin ohjeen sivulta eli osoitteesta https://randomnerdtutorials.com/guide-for-soil-moisture-sensor-yl-69-or-hl-69-with-the-arduino/ koodin, joka näytti tältä:



Pistin sensorin kasvin multaan (keltainen nuoli), latasin koodin Arduinolle ja katsoin, mitä tapahtuu!



Jee, olipas kivaa! Punainen ledi paloi, ja ohjelma tulosti tekstiä joka kertoi, että kasvini tarvitsee kastelua. Tai no, ei se kasvini kannalta ollut kivaa, anteeksi :(





No, ei kasvini välttämättä oikeasti kärsinyt. Raja-arvon, jossa ledi muuttuu punaiseksi, voi itse määrittää. Se pitäis määrittää kasvilajin mukaan, eli paljon vettä tarvitsevilla lajeilla raja olisi erilainen kuin kuivan kasvupaikan lajeilla. Sivulla sanotaan, että sensorissa on potentiometri (säädettävä vastus), jonka avulla sensorin herkkyyttä voisi säädellä. En vielä kokeillut sitä. En ole itseasiassa vielä kokeillut lainkaan potentiometriä! Ehkä käytän sitä seuraavassa projektissani. Miksihän sivuilla sanotaan, että kuivalla maaperällä on suurempi jännitteen ulostulo (output) kuin märällä? Luulisi, että märässä maaperässä olisi enemmän vettä, jolloin siinä olisi enemmän liuenneita suoloja jotka johtavat sähköä.

No, oli aika ryhtyä kasvin pelastustoimiin! Kutsuin hätiin norsuapurini, joka ruiskutti kasville vettä. Katsokaa, miten uutterana hän ahertaa, kun tietää toisen olevan hädässä <3 


Jippii, elvytystoimet auttoivat! Nyt vihreä ledi syttyi ja ohjelma tulosti tekstiä joka kertoi, ettei kasvini tarvitse kastelua! Kiitos norsu avustasi <3



Sensorin pitäisi tosin yltää syvemmälle, jos haluaisin tietää kasvini todellisen kastelutarpeen. Pienet sensorit kertovat isojen ruukkujen mullan kosteuden vain pinnasta mitattuna, kun taas kasvin juuret ovat syvällä. Eri sivuilla myös kerrottiin tai oltiin kommentoitu, että jos sensoria pitää toiminnassa pitkään, korroosio tuhoaa sen. Ehkä siihen on olemassa jo jokin ratkaisu, pitää ottaa selvää! Mutta pääasia on, että kasvini on nyt onnellinen. Loppu hyvin, kaikki hyvin.