Tein tammikuun Mikrobitissä julkaistavaa mikrokontrolleritestiä varten pienen koodaus- ja kasausprojektin, jossa kasasin Arduinon ympärille sääaseman. Ideana oli mitata lämpötila ja kosteusprosentti anturilla sekä näyttää lämpötila nelinumeroisella seitsensegmenttinäytöllä ja kosteusprosentti led-valoilla. Helppoa ja yksinkertaista.

Tarkoitusta varten hain paikallisesta elektroniikkaliikkeestä viiden euron hintaisen nelinumeroisen seitsensegmenttinäytön. Kaupan sivuilta löytyi myös tekniset tiedot, joten projektin pystyttäminen valmiin esimerkkikoodin avulla piti olla todella helppoa.

Viiden euron murheenkryyni. Oikean reunan liittimen nastajärjestystä ei kerrottu missään – ja siitä soppa vasta sakeni... Antti Mannermaa

Paitsi että ennen kuin pääsin edes koodaamaan, näyttö piti saada kytkettyä Arduinoon. Näytössä oli nelinastainen liitin, mutta missään ei kerrottu, mikä nasta teki mitäkin.

Ei muuta kuin debuggaamaan laitetasolla.

Googlella löytyi lähikuva vastaavan näytön piirilevystä, johon oli merkitty valmiiksi nastojen järjestys. Harmi vaan, että se ei hirveästi auttanut, kun tiedossa ei ollut noudattiko ostamani näyttö tismalleen samaa pinnijärjestystä, päinvastaista pinnijärjestystä, vai jotain aivan muuta.

Näytön piirilevyn takapuolta tutkailemalla selvisi, että kaksi nastoista oli varustettu vastuksella, yksi kondensaattorilla ja neljännessä nastassa ei ollut komponenttia perässä lainkaan.

Vastukset paljastavat nastat. Vasemman yläkulman datanastoissa SCL ja SDA on perässä vastukset. Kaksi piirilevylle menevää johtoa sisälsivät myös vastukset, joten datanastat oli helppo bongata.

Näytön ohjainpiirin teknisiä tietoja kaivelemalla selvisi, että vastukset olivat i2c-väylän datanastoissa sda (serial data) ja scl (serial clock) ja maanastassa oli kondensaattori. Näillä tiedoin oli helppo kytkeä käyttöjännite neljänteen nastaan ja maa viereiseen kondensaattorilla varustettuun nastaan. Datapinnien järjestyksen päättelin yllä linkkaamani esimerkkikuvan avulla, sda maanastan viereen ja scl reunimmaiseen. Oikeaan osui.

Kun piuhat oli kytketty oikein, ei muuta kuin esimerkkikoodi tulille, helppoa kuin heinänteko.

Paitsi että esimerkkikoodi piirteli näytölle aivan mitä sattuu. Osa numeroista osui melkein oikeaan, valtaosa ei sinne päinkään. Selvästi 7-segmenttinäyttö ei sytyttänyt lohkojaan samassa järjestyksessä kuin se näyttö, jolle esimerkkikoodi oli tehty. Ohjainpiiri kuitenkin oli sama, muuta varsinaista tietoa näytöstä ei sitten ollutkaan.

Näin sen piti toimia. Esimerkiksi bittijonon 0110 0000 piti sytyttää lohkot b ja c, eli näytölle piti piirtyä ykkönen. Todellisuudessa nämä bitit sytyttivät hankkimamme 7-segmenttinäytön keskimmäisen ja alimman vaakalohkon. Bittijärjestys ei siis pitänyt paikkaansa.

Ei muuta kuin debuggaamaan, nyt softapuolta.

Elektroniikkakauppa oli ystävällisesti julkaissut bittitason ohjeet siitä, mikä bitti sytyttää minkäkin osan 7-segmenttinäytön numerosta. Kunhan bittikuvioita ja desimaalilukuja pyöritteli hetken, koodi oli valmista, joten ei muuta kuin laite taas tulille.

Jooei. Tilanne ei korjaantunut. Ilmeisesti elektroniikkaliikkeen julkaisemat speksit koskivat myös jotain muuta näyttöä, tai kenties saman näytön vanhempaa valmistusversiota. Valot syttyivät aivan eri järjestyksessä mitä spekseissä luki.

Ei muuta kuin debuggaamaan, nyt bittitasolla.

Yritys ja erehdys -menetelmä toimii varmasti. Kun näytölle syötti peräkkäin arvot 1, 2, 4, 8, 16, 32, 64 ja 128, eli kävin läpi jokaisen yksittäisen bitin välillä 1000 0000, 0100 0000 ... 0000 0001, 7-segmenttinäytön jokainen osa syttyi yksitellen, ja pystyin merkitsemään mikä bitti vastasi mitäkin 7-segmenttinäytön lohkoa. Edistystä.

Selvisi, että sekä valmis Arduino-lähdekoodi että myyjän sivuillaan oleva datalehdykkä eivät täsmänneet ostamaani näyttöön, vaan näyttö toden totta sytytti lohkot aivan eri järjestyksessä mitä piti. Alla oikea järjestys.

Oikea bittijärjestys. Ensimmäinen bitti vasemmalta (1000 0000 eli lukuarvo 1) sytyttää oikean yläkulman lohkon, seuraava bitti desimaalierottimen (0100 0000 eli 2), kolmas (0010 0000 eli 4) yläreunan lohkon, neljäs (0001 eli 8) oikean alakulman lohkon ja niin edelleen. Jos haluamme esimerkiksi numeron 3 näkymään, pitää sytyttää lohkot 1, 3, 4, 6 ja 7. Nämä bitit ovat siis ykkösiä, ja muut bitit nollia, eli 1011 0110 = 1 + 4 + 8 + 32 + 64 = 109. Antti Mannermaa

Kun oikea järjestys oli selvitetty, oli helppo laskea oikeat arvot jokaiselle numerolle. Kynällä ja paperilla piirtelemällä homma sujui muutamassa minuutissa.

Kynä ja paperi. Debuggauksessa tuli otettua vanhat keinot käyttöön, piirtelemällä ja bittijonoja laskemalla 7-segmenttinäytön sai vihdoin toimimaan.

Esimerkiksi jos haluamme esittää 7-segmenttinäytöllä numeron 3, pitää sytyttää lohkot 1, 3, 4, 6 ja 7. Nämä bitit ovat siis ykkösiä, ja bitit 8 ovat nollia. Bittijono on siis 1011 0110 eli desimaalilukuna vasemmalta oikealle biteittäin laskettuna 1 + 4 + 8 + 32 + 64 = 109.

Kas näin. Spekseistä ja alkuperäisistä lähdekoodeista viis, oikea bittijono oli 1011 0110, desimaalilukuna 109, ja sillä saimme näytön näyttämään numeron 3. Helppoa, eikö? Antti Mannermaa
Numero 7-segmenttinäytölläSytytettävät lohkot bitteinäBitit desimaaleinaDesimaaliluku
01011 11011 + 4 + 8 + 16 + 32 +128189
11001 00001 + 89
21010 11101 + 4 + 16 + 32 + 64117
31011 01101 + 4 + 8 + 32 + 64109
41001 00111 + 8 + 64 + 128201
50011 01114 + 8 + 32 + 64 + 128236
60011 11114 + 8 + 16 + 32 + 64 + 128252
71011 00011 + 4 + 8 + 128141
81011 11111 + 4 + 8 + 16 + 32 + 64 + 128253
91011 01111 + 4 + 8 + 32 + 64 + 128237

Yhdistämällä nämä desimaalilukuarvot valmiin esimerkkilähdekoodin desimaaliarvojen tilalle homma lähti toimimaan, ja näytölle sai piirrettyä haluamansa numerot vihdoinkin.

Toimii vihdoinkin. Jahka softaa ja rautaa oli bittitasolla debugannut, seitsensegmenttinäyttö toimi kiltisti.

Tämä oli vain yksi askel kohti itse tehtyä sääasemaa. Valmiista projektista voit lukea lisää 24. tammikuuta ilmestyvästä Mikrobitistä, jonka yhteydessä julkaisemme sääaseman täyden lähdekoodin ja infografiikan siitä, miten elektroniikka ja lähdekoodi toimivat yhdessä Arduinon kanssa sekä tietenkin 12 mikrokontrollerin laajan vertailutestin.

Lue lisää mikrokontrollereista:

Mikrokontrollerien testi paljastaa: megahertsit eivät takaa suorituskykyä

Testin erikoisin mikrokontrolleri: erikoisvarustellussa laitteessa on vaihdettava prosessori, mp3-soitin ja hipaisukytkimet

Testissä mikrokontrollerit: tallennustilan nopeudessa jopa 16-kertainen ero

Näin yhdistät Raspberry Pin Arduinoon

Mitä rakenteluun tarvitaan? Esittelyssä mikrokontrollerin anturit, elektroniikkakomponentit ja lisätarvikkeet

Esittelyssä Arduino-ohjelmointiympäristö

Yleismittari ja muut hyödylliset työkalut Arduinon kaveriksi