Arduino TEKSTI, KUVAT JA KOODI: OLLI-PEKKA HEINISUO ALOITUSKUVA: JARI TOMMINEN Rakentelijan unelma Tekisikö mieli rakentaa vekotin, jota ei löydy kaupasta? Arduinosta voit tehdä melkein mitä vain. Kiinnostaisiko kauko-ohjattava kahvinkeitin, kukkien kastelumuistuttaja, lämpökamera tai kenties gps:llä itseohjautuva quadkopteri? Laite voi vaikka päivittää tilansa Twitteriin tai kertoa asiansa suoraan tekstiviestillä. Nämä kaikki laitteet voidaan toteuttaa täysin avoimella ja edullisella Arduinokehitysalustalla (www.arduino.cc), joka on villinnyt tee-se-itse-maailmaa jo muutamia vuosia. Arduinon avulla on helppo rakentaa omia vekottimia tai muokata jo olemassa olevia laitteita paremmiksi sekä omiin tarpeisiin sopivammiksi. Mikä Arduino on? Arduino on käytännössä piirilevy, joka pitää sisällään mikrokontrollerin ja muutamia ohjainpiirejä. Lisäksi levyllä on usb-liitin, virtaliitin sekä erilaisia pinnejä, joita käytetään ulkoisten laitteiden ohjaukseen. Kun Arduinon ympärille rakentaa jotakin, voitaneen puhua sulautetusta järjestelmästä. Sellaisia löytyy esimerkiksi kaukosäätimistä ja kaikista muistakin laitteista, joissa on sisäänrakennettuna monimutkaisempaa logiikkaa ja joita käytät todennäköisesti päivittäin. Näiden järjestelmien sydämenä sykkii mikrokontrolleri. Se on ohjelmoitava ic-piiri, jossa on usein nykymittapuulla naurettavan hidas prosessori sekä huvittavan vähän muistia. Arduinosta on olemassa useita eri versioita, mutta suosituimmassa Arduino Unossa tikittää Atmel AVR ATmega328P -mikrokontrolleri. Sen nopeus on 16 MHz ja sisäistä flash-muistia on 32 kilotavua. Arduinon eri variaatiot käyttävät Atmelin AVR -kontrollerien eri versioita. Arduino eroaa muista vastaavista alustoista helppokäyttöisyydellään, sillä se on helposti komennettavissa ja ohjelmoitavissa suoraan usb-liitännän kautta omasta kehitysympäristöstään windowsista, linuxista tai macista. Kyseessä on siis kokonainen valmis alusta ja ohjelmointiympäristö, ei pelkkä mikrokontrolleri. Arduinon etuna on myös monipuolisuus, sillä muun muassa ohjelmakirjastot kirjoitetaan lähes aina c++:lla. Tosin aivan kaikki kyseisen kielen ominaisuudet eivät ole tuettuja. Vielä suurempi valttikortti on valtava yhteisö, joka kehittää jatkuvasti uusia laitteita ja laajennoksia Arduinolle. Eikä loppua näy. Arduinon käyttäminen Tyypillisiä Arduino-projekteja ovat erilaiset ledeihin liittyvät rakennelmat, sensoreita eli tunnistimia hyödyntävät laitteet ja servoohjatut vekottimet. Näppärää rakentelijaa Arduinon lyhyt historia Italialaiset Massimo Banzi ja David Cuartielles käynnistivät vuonna 2005 projektin, joka tunnetaan nykyään nimellä Arduino. Tarkoituksena oli luoda opiskelijoille edullinen alusta, jonka avulla pystyisi luomaan ympäristön kanssa vuorovaikutuksessa olevia elektronisia laitteita nopeasti. Arduino pohjautuu avoimeen Wiring-alustaan, joka taas on kehitetty processing-kielen ja -kehitysympäristön pohjalta. Tämän vuoksi Arduinon ohjelmointiympäristö muistuttaa hyvin paljon processingin vastaavaa. Arduinosta on kehittynyt vähitellen tunnetuin ja käytetyin alusta harrastajien, opiskelijoiden ja muiden elektroniikasta ja rakentelusta kiinnostuneiden keskuudessa. Teese-itse-liike on nostanut päätään osittain juuri Arduinon ansiosta viime vuosien aikana huomattavasti. 30 MikroPC 10/2012 WWW.MIKROPC.NET
Juottamistaidot lisäävät Arduinorakentelijan mahdollisuuksia huomattavasti. WWW.MIKROPC.NET MikroPC 10/2012 31
Arduino Arduinon päälle voi pinota lisäkortteja eli shieldejä, joiden avulla laitteeseen saadaan lisätoimintoja, kuten nfc- tai ethernet-yhteydet. Valmiita shieldejä ajurikirjastoineen on olemassa satoja. Kuvan Arduino Uno on saanut selkäänsä lähiverkkoyhteydet mahdollistavan ethernet-shieldin. 32 MikroPC 10/2012 rajoitaa lähinnä mielikuvitus sekä ennen pitkää tietysti myös Arduinon laskentateho ja pinnien määrä. Internet on täynnä valmiita ohjeita ja neuvoja, kuinka jokin asia rakennetaan Arduinon ympärille. Yksinkertaiset ledijutut on hyvin helppo toteuttaa ohjelmoinnista ja elektroniikasta täysin tietämättömänkin, mutta vaikeusaste nousee melko jyrkästi eteenpäin mentäessä. Lisää komponentteja ja muita osia hankittaessa nousevat myös kustannukset. Arduino tarjoaa siis jokaiselle jotakin osaamistasosta riippumatta, vaikka sen alkuperäinen tarkoitus onkin ollut madaltaa kynnystä erilaisten ympäristön kanssa vuorovaikutuksessa olevien laitteiden rakentamiseen. Jotta aloittelija pääsee Arduinon ihmeelliseen maailmaan syvemmälle sisään, on hallittava ohjelmointia ja elektroniikkaa sillä tasolla, että ensimmäisen ehtolauseen tai vastuksen kohdalla asia ei mene yli ymmärryksen. Esimerkiksi pelkkä ledien vilkuttelu vaatii vastuksia, joten on myös hyvä ymmärtää, miten yksinkertaiset piirit toimivat virran, jännitteen ja muiden peruskäsitteiden osalta. Aloittelijan, ja miksei kokeneemmankin rakentelijan, on hyvä lähteä liikkeelle hankkimalla valmis komponenttikokoelma, Arduino Uno, koekytkentälevy, usb-kaapeli ja valitsemalla jokin helpohko projekti, jossa oppii käyttämään Arduinon ohjelmointiympäristöä sekä koekytkentälevyä. Sukua c++:lle Arduinon ohjelmointiympäristö käyttää kielenä c++:n johdannaista ja kyseinen kieli kulkee myös nimellä Arduino. Debuggaaminen eli virheiden etsintä tapahtuu ympäristön omassa sarjaporttimonitorissa, johon kaikki ohjelman tulostuskäskyt tulostuvat, jos ohjelmakoodissa on erikseen näin määritelty. Usb-liitännän kautta voi näin ollen myös lukea esimerkiksi sensoridataa kirjoittamalla vaikkapa pythonilla työkaluohjelman, joka tulkitsee ja järjestää Arduinon lähettämän datan mukavaan muotoon. Ohjelmointiympäristö sisältää valmiita koodiesimerkkejä ja kirjastoja. Ohjelman lataaminen ympäristöstä Arduinoon onnistuu nappia painamalla, mikäli kirjoitettu koodi kääntyy virheittä. Jos koodi ei käänny, virheet tulostuvat ympäristön alareunassa olevaan terminaali-ikkunaan. Arduinoa voi laajentaa niin kutsutuilla shieldeillä eli lisäkorteilla, jotka asettuvat Arduinon päälle. Niitä voi pinota käyttötarkoituksesta ja shieldistä riippuen useita päällekkäin. Mikä parasta, lähes kaikille shieldeille on olemassa valmiit koodikirjastot, jolloin aikaa ei tarvitse tuhlata omien rajapintojen tekemiseen. Esimerkiksi ethernet-shieldillä Arduinolla voi kytkeytyä internetiin. Lisäksi on olemassa muun muassa langattomaan tiedonsiirtoon kykeneviä sekä esimerkiksi nfc:llä varustettuja shieldejä. Shieldejä löytyy jo satoja erilaisia, joten pyörää ei tarvitse keksiä uudelleen. Käytännön sovellukset Arduinolla rakennetaan tyypillisesti prototyyppejä. Avoimuuden nimissä on suotavaa, että julkaisee netissä valmiin vekottimen lähdekoodin ja piirustukset, mutta se ei ole millään WWW.MIKROPC.NET
Intervalliajastimen prototyyppi kameraan kytkettynä. tasolla pakollista. Harrastelijat harvemmin viimeistelevät vekottimiaan kaupalliseen muotoon, mutta sekin on täysin mahdollista. Jos haluaa kaupallistaa tehdyn tuotteen, se vaatii todennäköisesti ainakin oman piirilevyn suunnittelun ja koteloinnin. Arduinossa on paljon ylimääräisiä komponentteja, joita ei tarvita enää valmiissa tuotteessa. Kunnolla viimeistellyssä tuotteessa ei ole oikeastaan mitään Arduinoon viittaavaa, sillä valmis ohjelma on mikrokontrollerissa sisällä ja kaikki ylimääräinen on karsittu pois. Harva kuitenkaan vie projekteja niin pitkälle. Intervalliajastimen rakentaminen Kuinka Arduinolla sitten oikeasti rakennetaan jotakin? Eräs mielenkiintoinen ja helposti eteenpäin kehitettävissä oleva käytännön sovellus on kameran intervalliajastin. Intervalliajastimia käytetään järjestelmäkameroissa valokuvien ottamiseen tietyin aikavälein, jonka jälkeen kuvasarjoista voidaan tehdä esimerkiksi timelapse-videoita. (Lisää aiheesta MikroPC 1/2012:ssa.) Ajastimet maksavat yleensä yli sata euroa, mutta miksi ostaa sellainen, jos voi tehdä omien mieltymysten mukaisen version halvemmalla? Rakentamiseen vaadittavat osat: Arduino Uno usb-kaapeli koekytkentälevy ja siihen hyppylankoja yksi 500 600 ohmin vastus yksi 4N35 optoerotin (tai vastaava, esimerkiksi 4N25) kameraan sopivalla liittimellä varustettu kaapeli, yleisin on 2,5 mm stereoplugi Kokoaminen Tärkein komponentti tässä esimerkissä on optoerotin. Kameralle ei saa viedä jännitettä, vaan se on eristettävä jollakin tavalla ohjaavasta virtapiiristä eli Arduinosta. Optoerotin toteuttaa tämän niin, että se välittää valolla signaalin toiselle virtapiirille. Kun optoerottimelle viedään jännite, sulkeutuu virtapiiri erottimen toisella puolella. Kun virtapiiri on suljettuna, kamera valottaa. Kun se on avoin, kamera ei valota. Optoerotin kytketään Arduinoon seuraavasti: kytke Arduinon pinnistä 13 hyppylanka 500 600 ohmin vastuksen kautta optoerottimen anodille. Anodin tunnistaa erottimen päällä olevasta pisteestä, sillä se on samassa kulmassa kuin anodi. Vastuksen tehtävä on varmistaa, että optoerottimelle ei vuoda häiriösignaaleja silloin, kun liitännän tila on nolla. Tämän takia vastusta kutsutaan alasvetovas- Esimerkkiprojekteja Arduinolla on rakennettu monia erilaisia pörrääviä, liikkuvia, lentäviä ja jopa äärimmäisen monimutkaisiakin laitteita: 3D-tulostin, jossa käytetään Arduinoa, MakerBot Thing-O-Matic: makerbot. com Noin sadan euron lämpökamera Arduinolla toteutettuna: hackaday. com/2011/03/09/arduino-thermo-cam Arduino-pohjainen baarimikko The Inebriator: www.theinebriator.com Quadkopterin autopilotti Arducopter: code.google.com/p/arducopter Arduinoa hyödyntävä avoin dna-analysaattori OpenPCR: openpcr.org Led-kuutio, jota ohjaa Arduino: hackaday.com/2011/03/18/512-led-cubeagain WWW.MIKROPC.NET MikroPC 10/2012 33
Arduino Rakentelua varten on hyvä hankkia valikoima peruskomponentteja, johtoa ja koekytkentälevy prototyypin virittelyyn. Varsinaista vimpainta varten tarvitset myös jonkinlaisen piirilevyn, tinaa ja juottimen. tukseksi. Anodin vieressä on katodi, kytke se Arduinon maahan. Kameran kytkeminen ei ole sen vaikeampaa, ensin on vain kuorittava käytössä oleva kaapeli toisesta päästä ja testattava, mikä johdoista on maa. Johtoja on kolme, joista yksi on maa ja kaksi muuta ohjaavat tarkennusta ja laukaisinta. Tarkennuksen voi kytkeä yhteen laukaisinjohdon kanssa, sillä tarkennus tehdään täysin manuaalisesti. Testaaminen onnistuu laittamalla piuha kiinni kameraan ja yhdistämällä johtoja kameran ollessa manuaalitilassa. Tämä on itse asiassa hyvin mielenkiintoista, sillä kameraa voi ohjata pelkällä johdonpätkälläkin. Jos ei halua uhrata johdon toista päätä, on ostettava stereojakki, johon voi kolvata esimerkiksi hyppylangat kiinni. Sen jälkeen johdon toisen stereoplugipään voi työntää jakkiin toisen mennessä kameraan. Kalliimmissa kameroissa käytetään joskus valmistajien omia erikoisliittimiä, mutta ne toimivat aivan samalla tavalla kuin halvempien mallien vastaavat. Maan voi kytkeä kaukaisimpaan kulmaan anodiin nähden ja laukaisimen sekä tarkennuksen maan vieressä olevaan jalkaan. Näiden järjestyksellä ei ole väliä, koska olemme luomassa pelkkää kytkintä. Kunhan käyttää kyseisiä jalkoja eikä sotke jännitettä missään vaiheessa kamerasta tuleviin johtoihin, kaikki on kunnossa ohjelmaosuutta varten. Ohjelmointi Ajastimen fyysisen osuuden rakentaminen ei ole ollenkaan vaikeata, mutta koodipuoli vaatii hiukan perehtymistä. Ohjelma koostuu muutamasta ehtolauseesta ja ikuisesti pyörivästä silmukasta. Ohjelman lähdekoodi on ladattavissa MikroPC.netistä: mpc.fi/71 Aluksi määritetään pinni, jota käytetään ohjaukseen. Optoerotin on kytketty pinniin 13, joten ohjelmassa määritetään #define:llä arvo, joka sijoitetaan koodin kääntövaiheessa kaikkiin niihin paikkoihin, joissa sitä tarvitaan. Lisäksi tarvitaan muutamia apumuuttujia ehtolauseita varten, jotta tiedetään, mikä vaihe milloinkin on kesken. Aikamuuttujaan tallennetaan aina kunkin intervallin aloitusajankohta. Intervalli- ja valotusmuuttujiin määritetään halutut ajat millisekunteina (1/1000 s), koska käytössä on Arduinon kirjastoissa oleva valmis millis()-funktio. Kyseinen funktio juoksee ajastimen tavoin millisekunnin tarkkuudella aina siitä hetkestä eteenpäin, kun sitä kutsutaan ohjelmassa ensimmäisen kerran. Arduinolla ohjelmointi muistuttaa hyvin paljon c++:aa. Suurimmat erot löytyvät ohjelmien rakenteesta: ne koostuvat setup()- ja loop()-rutiinista. Ensimmäiseen määritetään kaikki alustusarvot, kuten pinnien tilat. Setup()-rutiini ajetaan vain kerran; aina, kun Arduino käynnistyy. Loop()-rutiinia ajetaan uudestaan ja uudestaan ympäri loputtomasti, eli kaikki toiminnallisuus on sen sisällä. Setup():ssa avataan myös sarjaportti bugien etsimistä varten. Ohjelma tulostaa sarjaporttimonitoriin jokaisen vaiheen kohdalla sen, mitä tapahtuu ja mihin aikaan. Tämä selventää huomattavasti ohjelman toimintaa. Sarjaporttimonitori avautuu valikosta Tools > Serial Monitor, ja se toimii vain Arduinon ollessa kytkettynä usb-liitännällä tietokoneeseen. Valitse tiedonsiirtonopeudeksi (baud rate) monitorin vetovalikosta arvo 9600. Lopullisesta ohjelmasta kannattaa poistaa debuggaukseen käytetyt rivit, sillä ne vievät turhaan tilaa ja tehoa Arduinosta. Valotuksen ohjausta Ensimmäinen ehtolause tarkistaa, voiko intervallin ja valotuksen aloittaa. Jos voi, asetetaan kaikki tarvittavat arvot muuttujiin ja pinni 13 päälle eli sen looginen tila on ykkönen (kameran suljin avautuu). Seuraavan sekunnin aikana ei tapahdu yhtään mitään, ohjelma juoksee vain samaa silmukkaa ympäri, koska minkään ehtolauseen ehdot eivät toteudu. Seuraava tapahtuma on tasan sekunnin kohdalla, jolloin valotus lopetetaan toisen ehtolauseen ehtojen täyttyessä. Pinni 13 asetetaan pois päältä eli sen looginen tila on nolla (kameran suljin sulkeutuu). Tämän jälkeen on taas sekunti tyhjää, koska uutta intervallia ei voida vielä aloittaa. Intervalli aloitetaan vasta, kun kolmannen ehtolauseen ehdot täyttyvät. Tämä tapahtuu toisen sekunnin kohdalla, jolloin uuden intervallin aloituksen kieltävä muuttuja (voiko_valottaa) asetetaan taas tilaan (true), jossa ensimmäinen ehtolause voi aloittaa jälleen uuden intervallin ja valotuksen. Ohjelman voi todeta toimivan ilman kummempia kikkailujakin, sillä Arduinon pinni 13 on kytketty levyllä olevaan valmiiseen lediin. Se syttyy aina sekunniksi tai muuksi määritellyksi ajaksi, kun ohjelmaa ajetaan. Jatkokehitysmahdollisuuksia Ohjelma on karkea runko intervalliajastimelle. Käytettävyyden ja mukavuuden kannalta koodia kannattaa laajentaa siten, että lisää sinne aloitus- ja lopetusominaisuudet. Se vaatii toki myös fyysisten nappien lisäämistä ja mahdollisesti jopa näyttöä, jos haluaa kunnolla toiminnallisuutta. Koodin voi myös muokata toimimaan ilman täysin manuaalista tilaa, kuten aukon tai valotusajan esivalintatilassa. Arduinossa on myös sisäänrakennettu delay()-komento, jota käyttämällä ohjelmasta olisi saanut selkeämmän mutta huomattavasti hankalammin laajennettavan. Kyseinen komento pysäyttää koko ohjelman suorituksen, kun taas millisekuntilaskurilla ohjatut ehtolauseet eivät vaikuta ohjelman etenemiseen, vaan taustalla voidaan suorittaa muutakin. Nukkumiskomennon tapauksessa ei siis voi suorittaa muuta koodia silloin, kun Arduino nukkuu. 34 MikroPC 10/2012 WWW.MIKROPC.NET
Intervalliajastimen lähdekoodi // pinni, joka menee optoerottimelle bool voiko_valottaa = true; // boolean-muuttuja kertoo, // onko intervalliaika kulunut vai ei int intervalli = 2000; // aika kuvien ottamisen välillä, millisekunteja // valotusaika, millisekunteja int tila = LOW; // tilamuuttuja kertoo pinnin senhetkisen // tilan (HIGH tai LOW) unsigned long aika = 0; // muuttuja ajastimelle, unsigned tarkoittaa // positiivisia kokonaislukuja // asetetaan tarvittavat alustustiedot Mistä saa ja mitä maksaa? ARDUINO UNO maksaa noin 23 30 euroa kaupasta riippuen. Eri versiot Arduinosta vaihtelevat hinnaltaan, joten versiosta riippuen hintahaarukka asettuu noin 19 50 euron välille. Arduinon avoimen luonteen takia siitä on olemassa monenlaisia muitakin kolmannen osapuolen kehittämiä versioita, jotka saattavat olla halvempia tai kalliimpia. Arduinoa myyvät Suomessa useat eri verkkokaupat. Koska kaikki elektroniikan komponentit kulkevat Arduinon kanssa käsi kädessä, myös useilla komponenttiliikkeillä on Arduino valikoimissaan. Suomalaisia verkkokauppoja www.partco.fi paeae.com store.mansteri.com www.robomaa.com Elektroniikan komponentit www.vekoy.com www.spelektroniikka.fi www.bebek.fi Ulkomaisia www.sparkfun.com www.adafruit.com www.seeedstudio.com fi.farnell.com www.dealextreme.com void setup() { // asetetaan tila ulostuloksi Serial.begin(9600); // avataan sarjaportti debuggausta varten // pääohjelma, nimensä mukaisesti pyörii ikuista silmukkaa // ehtolausekkeet toteutetaan, mikäli niiden ehdot täyttyvät silmukan pyöriessä void loop() { // jos muuttuja voiko_valottaa kertoo intervalliajan täyttyneen, // voidaan valottaa -> avaa siis kameran sulkimen if (voiko_valottaa == true) { // tämä asettaa pinnin tilan päälle tila = HIGH; // muuttuja kertoo pinnin tilan aika = millis(); // tallennetaan ajastimen aika uuteen muuttujaan voiko_valottaa = false; // muuttuja kertoo nyt, että uutta valotusta ei // voida aloittaa ennen kuin nykyinen intervalli // on päättynyt tulostaa infoa sarjamonitoriin Serial.println(aika); // tämä lopettaa kameran valotuksen eli sulkee kameran sulkimen // jolloin myös toisen ehdon täyttyessä lopetetaan valotus else if ( millis() - aika >= valotus && tila == HIGH) { // asetetaan pinni pois päältä, // eli kamera lopettaa valotuksen tila = LOW; // asetaan myös tila vastaavaksi Serial.println( Lopetetaan valotus. ); Serial.println(millis()); // asettaa intervallin tilan, jos 2000 ms kulunut -> voidaan aloittaa uusi valotus else if ( millis() - aika >= intervalli) { voiko_valottaa = true; // kertoo, että uusi valotus voidaan aloittaa Serial.println( Intervallin loppu. ); Serial.println(millis()); Serial.println(); Lataa koodi netistä: mpc.fi/71 WWW.MIKROPC.NET MikroPC 10/2012 35