Alun perin mittaristossa on kello ja se ajaa asiansa varsin hyvin. Joskus olen kuitenkin ajatellut mitä muuta siinä voisi olla. Niinpä olen suunnitellut uuden kellon seuraavilla ominaisuuksilla: Kello, lämpömittari, ajettua aika, jännite, moottorinlämpötila ja seossuhde.
Näyttönä käytän 2×16 merkkistä LCD näyttöä koska sain sellaisen joskus asennettua kellon tilalle. Näytön pari ensimmäistä ja viimeistä merkkiä jää piiloon, joten käytännössä näyttö on 2×12 merkkinen. Siinä on kuitenkin kylliksi tilaa halutuille ominaisuuksille.
Kuitenkin joku kysyy että miten sää tällaisia teet, niin laitetaas nyt juurta jaksain suunnittelu prosessista valmiiseen tuotteeseen. Sivutaan nyt samalla tuota Arduino Uno kehitysalustaa ja mistä se koostuu. Sitä ei sellaisenaan viitsi laitta kokonsa vuoksi tuonne, joten käydään myös läpi miten tuollaisen pelkän piirin saa toimimaan, eli mitä se tarviii ympärilleen toimiakseen. Mahtaa aika järkäle tulla tästä artikkelista.
Lähdetääs lohkomaan tämä pala kerrallaan, että mitä se vaatii että pääsee tähän pisteeseen ja miten minkäkin asian olen toteuttanut. Toivottavasti muutkin vanhat ukkelit kiinnostuvat elektroniikasta jos eivät sitä vielä ole.
NÄYTTÖJEN SUUNNITTELU
Itse saan ajatukseni selkeäksi parhaiten paperilla. Tietokoneeseen ei kannata koskea ennen kuin on jokin visio mitä aikoo tehdä. Muuten sitä havahtuu jonkin ajan kuluttua kun katsoo jotain älytöntä videota jostain joka ei liity mitenkään aiheeseen.
Ruutupaperille on helppo laskea joka merkille paikka ja mikä mahtuu mihinkin.

Ensimmäisellä sivulla olisi kellonaika, lämpötila ja ajettu aika. Kello olisi isommalla fontilla vasemmalla laidalla, jotta se erottuisi selvemmin ja lämpötila ja ajettu aika olisi omilla riveillään oikeassa laidassa. Näyttöön voi tehdä 8 kpl omia merkkejä joilla voisi toteuttaa tuon isomman fontin kellolle ja ne riittäisi tuohon käyttöön.

Toisella sivulla olisi moottorin lämpötila asteikolla ja lukemalla ilmoitettuna ja sen alapuolella samanlainen kokonaisuus jännitteelle. Puolivälin nurkilla voisi olla suunnilleen normaalit arvot normikelillä. Kylmällä kone vähän viileämpi ja alle puolen välin ja kaupungissa helteellä taas toisinpäin. Tässäkin 8 omaa merkkiä mahdollistaisi tuollaisen asteikon tekemisen.

Kolmannella sivulla olisi seosmittari. Todennäköisesti toteutan tämän laajakaista lambda-anturilla. Se olisi sitten valmiina jos joskus innostun tämän muuttamaan ruiskulla toimivaksi kaasareiden sijaan. En tiedä riittäisikö kaasarivehkeelle viisi kohtainen asteikko: Lean, Eco, Stockhiometrinen, Power ja Rich. Varmaan riittäisi. Voihan siihen sitten vielä laittaa laitaan Lambda-arvon. Passaisikin aika hienosti kun molemmat tarvii sen 5 merkkiä leveyttä ja tässäkin 8 merkkiä riittäisi isommalle fontille tai voisi käyttää samaa kuin kellossa.
Näyttöjen selaus tapahtuisi nappia painamalla, kolmannen jälkeen palattaisiin ensimmäiseen ja kellon saisi asetettua nappi pohjassa virrat päälle laittamalla. Lambdanäyttö voisi olla pois käytöstä jos se ei saisi sopivaa signaalia analogia pinnille tai olisi kytketty maihin tms.
Kuinkas siihen sitten päästäisiin. Katsotaan vaihe kerrallaan, miten mikäkin asia mitataan ja tehdään kullekin mittaukselle omat funktiot joita on sitten myöhemmin helppo kutsua ja jos haluaa hifistellä niin muokata myöhemmin. Mutta ensin pikainen katsaus tuohon Unoon jolla on hyvä aloittaa kokeilemaan.
ARDUINO UNO
Arduino Uno on tuollainen varsin kätevä kehitysalusta erilaisten laitteiden rakentelun pohjaksi. Hyväähän tuossa on se että voit tehdä kytkennän koekytkentäalustalle hyppyjohdoin ja alkaa kehittelemään koodia omiin tarpeisiisi sopivaksi.
Uno perustuu Atmega328P piiriin ja rullaa 16mhz kellotaajuudella. 14 i/o pinniä joista kuutta voi käyttää analogisina pinneinä.
Pelkästä piiristä voi tehdä peruskytkennällä toimivan laitteen ilman ylimääräisiä osia ja sille piirilevyn. Jonkinlaisen vakavoidun 5V virtalähteen se tarvii. Kiteen ja sille kondensaattorit ja muistaakseni 10k vastuksen johonkin pinniin. Sitten voit ohjelmoida mikropiirin Arduino Unoa käyttäen.
Näitä saa jalallisena ja pintaliitosmallina. Nyt käytän jalallista mallia koska niitä on itsellä hyllyssä ja toisekseen saan ne paremmin tinailtua paikalleen. Ehkä myöhemmin teen SMD version.
LCD-NÄYTTÖ
Toimiaksen 2×16 merkkinen näyttö tarvitsee muutaman pinnin käyttöönsä:
1 +5V
2 GND
3 kontrastin säätö 10k trimmeriltä
4 RS -> UNO 12
5 R/W kytkettynä maihin
6 ENABLE -> UNO 11
7 –
8 –
9 –
10 –
11 D4 – UNO 5
12 D5 – UNO 4
13 D6 – UNO 3
14 D7 – UNO 2
15 Taustavalon +5V
16 Taustavalon GND
Kannattaa opetella kirjaston käyttöä ensin. Esimerkkejä löytyy examples kohdasta Arduino IDE:ssä.
JÄNNITTEEN MITTAAMINEN
Arduinon A/D muuntimelle kelpaa jännitteeksi 0-5V. Moottoripyörän akussa on taas jotain alle 16V tai ainakin pitäisi olla. Mitattava jännite pitää siis laskea alemmas tuohon alle 5V haarukkaan ja sen teen yksinkertaisella jännitteen jakajalla.
Jännitteenjakaja koostuu kahdesta vastuksesta jotka on kytketty maan ja jännitteen välille. Mitattava jännite saadaan vastusten välistä. Jos A/D muunninta käyttää 10 bittisenä, se voi saada arvon 0-1023 välillä, jolloin resoluutio on noin 4.88mV eli 0,00488V. Tämä riittää tarkkuudeksi kun valitaan sopivat vastusarvot. Näyttöön on tarkoitus saada jännite 0,1V tarkkuudella ja käytännössä välillä 0-20V joten laitoin vastuksiksi R ja R.
Aikani laskeskeltuani ja kokeiltuani päädyin vastuksissa arvoihin 150k ja 56k. Näillä saadaan mitattua reiluun 18V asti, siinä vaiheessa on jo jotain pahasti pielessä jos akkua tuolla jännitteellä latailee.
Kerroin analogiapinnin arvon 0,0048828125:llä saadakseni pinnille tulevan jännitteen selville. Sitten laskin siitä vastusarvoja käyttäen mitattavan jännitteen kaavalla:
float jannite = (mitattu * (150+56)/ 56);
Tuntuu pitävän paikkansa ainakin Unon 5V ja 3.3V pinneistä mittaamalla.
LÄMPÖTILAN MITTAAMINEN
Lämpötilan mittaukseen on mahdollista käyttää useampaa erilaista anturia. Nyt kuitenkin halpa hinta ja tarvittava tarkkuus johtaa valitsemaan yksinkertaisen PTC tai NTC anturin. Nämä maksaa jonkun 0,05-0,15€ ja muuttavat vastusarvoaan lämpötilan mukaan.
Tiettyä yhtäläisyyttä on havaittavissa tuon jännitteen mittauksen kanssa. Päädyin kuitenkin LM35 lämpötila-anturiin. Siinä jokaista celsiusastetta vastaa 10mV jännite. Lämpötila-alue sopii myös tarkoitukseen, eli on -40C – 150C. Kytkentä oli myös helppoa, +5V ja maa ja keskipinnistä saa lämpötilan mitattua.
Käytin niitä ilman ja moottorin lämpötilan mittaamiseen.
TOSIAIKAKELLO eli RTC (Real Time Clock)
Kellon virkaa ajaa DS1307 piiri joka toimii i2C väylän kautta osoitteessa 0x68. kide tulee kylkeen ja nappiparisto joka pitää asetetun ajan noin 10 vuotta.
Käyttö on sinänsä helppoa. Ajan asettaminen tapahtuu kirjoittamalla tunnit tiettyyn muistipaikkaan ja minuutit toiseen. Sieltä niitä sitten luetaan joka kierroksella. Kellon pisteiden välkkyminen hoituu sekuntien jakojäännöstä hyväksikäyttäen. Jos jämä on 1, pisteet näkyy ja jos 0 niin ei näy.
Koodin loppupuolella on funktiot toteutukselle.
SEOSSUHTEEN MITTAAMINEN
Seossuhteita varten lähdin selailemaan nettiä ja löysin jonkinlaisen kaavion josta ilmenee anturilta saatava jännite suhteessa seoksiin. Katsoin lambda-arvot ja selkeät jännitearvot kaaviosta. Puuttuvia kahden desimaalin arvoja sain jakamalla sopivasti analogiapinnin arvojen välille. Kenttäkokeet sitten näyttää miten onnistuin.
OMIEN MERKKIEN SUUNNITTELU NÄYTTÖÖN
Merkin koko näytöllä on 5×8 pistettä. Tällaisia numeroita olen ajatellut kelloon. Minun mielestä niistä tuli ihan helkkarin selkeät, jopa hienot!

Nuo minä tein ihan Paintilla jolla tein yhtä merkkiä varten 5×8 ruudukon harmaalla ja täyttelin sitten pisteet niin että sain kunkin numeron mieleisekseni.

Sitten vain täyttää tuon harmaan valkoisella niin se poistuu ja jäljelle jää nuo merkit tuossa edellisessä kuvassa. Nuo on mun mielestä sen verran selkeät että niiltä voisi käyttää siihen seosmittariinkin. Mutta noitahan voi itse tehdä mieleisekseen.
Mutta kuinka saa nuo kaikki ruutuun kun omia merkkejä pystyi suunnittelemaan vain kahdeksan. Juju onkin siinä että nuo sekä ne asteikot laitetaan datana taulukkoon josta tarpeen tullen haetaan omille merkeille oma muoto. Toinen hyvä puoli tuossa on että niillä voi myös animoida numeron vaihtumisen.
Yksittäinen merkki määritellään luomalla taulukko jossa on 8 arvoa, ensimmäinen on ylärivi niin että kaikki ykköset ovat päällä ja nollat eivät.
byte newChar[8] = {
B11111,
B10001,
B10101,
B10101,
B10101,
B10101,
B10001,
B11111,
};
Taulukon luvut ovat binäärinä jota ilmaisee alussa oleva B-kirjain, mutta itse tykkään kirjoittaa ne ihan lukuina ja muuttaminen on sinänsä yksinkertaista. Oikealta päin ensimmäinen on 1, toinen on 2, kolmas on 4, neljäs on 8 ja viides on 16. Sitten lasketaan vain yhteen ne joissa on ykkönen. Eli edellinen binääri taulukko voidaan kirjoittaa myös näin.
int newChar[8] = {31, 17, 21, 21, 21, 21, 17, 31};
Laiton numerot alekkain ja tein koodin pätkän joka käytännössä hakee tietystä kohtaa ylemmän merkin ja alemman sitten sopivasti alempaa.
sitten vain kerroin aloituspisteen niin että varsinaisella arvolla kerrotaan aloituspistettä sopivasti ja saadaan arvon yläosa paikalleen, alempi löytyykin sitten 8 arvoa myöhemmin.
NÄYTTÖJEN TOTEUTTAMINEN
Koodissa on setup luuppi ja sitten toinen luuppi jossa pyöritään koko ajan. Tein muuttujan tila joka määrää mikä näyttö on milloinkin esillä.
Tässä näkymät joista ensimmäinen on ajossa yleensä näkyvillä:

Eli isolla näkyy kellon aika ja pisteet vilkkuvat sekuntien tahtiin. Päivän lyhenne näkyy kellon vieressä. Oikealla on ilman lämpötila joka alkaa vilkkumaan kun lämpötila laskee 2 asteeseen. Silloin tie voi jo olla jäätymään päin ja se varoittaa asiasta sillä tavalla.
Oikealla alhaalla on ajettu aika lähdön jälkeen . Sekin alkaa vilkkua kahden tunnin kuluttua. Katsoopa nyt millainen aika siihen olisi sopiva. Kai se kahden tunnin jälkeen on syytä pitää pieni tauko ainakin.

Toisella sivulla on akun jännite joka on toteutettu tuollaisella täyttyvällä palkilla ja numeronäytöllä. Sen alapuolella on moottorin lämpötilan näyttö. Näihin on tulossa vielä raja-arvot jolloin esimerkiksi moottorin kuumentuessa liikaa tai jännitteen tippuessa liian alas, vaihtuu näyttö automaattisesti tänne kiinnittäen huomion pielessä olevaan asiaan.

Seuraavalta näytöltä näkyy seoksen Lambda arvo ja onko laihalla, ekonomilla, juuri kohdalla, tehoalueella vai rikkaalla.

AFR arvon näyttää seuraava näyttö. Se kai on makuasia kumpaa haluaa katsoa. Teen vielä sen niin että jos anturin tulo on kytketty +5V, kyseiset näytöt eivät ole näkyvillä. Voi olla etten anturia jaksa heti laittaa paikalleen niin sitten ei tarvitse muokata koodia anturin asentamisen jälkeen. Näytöt tulevat vain sitten esille.
NAPILLA VAIHTUVAT NÄYTÖT
Napille tein sellaisen funktion jolle voi antaa parametriksi ajan jolloin painallus tulkitaan pitkäksi. Silloin funktio antaa arvon 2, alle parametrin oleva painallus on lyhyt ja palauttaa arvon 1 ja jos nappia ei paineta ollenkaan, palauttaa se arvoa 0.
Sopivasti edellistä ja nykyistä arvoa vertaamalla saadaan laite tunnistamaan painallukset. Toinen juttu mitä odotellaan on napin päästäminen pitkän painalluksen jälkeen. Esimerkiksi kellon aikaa asetettaessa siirrytään seuraavaan kohtaan, muttei tehdä mitään ennen kuin nappi on vapautettu välissä.
KELLON AJAN ASETUS
Nyt kun käytössä on vain yksi nappi. On hieman ongelmallinen juttu kuinka kellonaika asetetaan. Tietysti sen voisi tehdä ykkösnäytössä pitkällä painalluksella, mutta ajattelin sen toteuttaa niin että asetuksiin pääsee kun kääntää virran päälle nappi pohjassa. Silloin se menisi kellonajan asettamiseen.
UNON KORVAAMINEN ATMEGA328P PIIRILLÄ
Unon tilalle laitan toisen koekytkentäalustan ja ATMega 328P piirin kiteineen, jännitelähteen 7805 regulaattorilla ja koitan saada sen vielä toimimaankin.
Tosiaan muutama ominaisuus vielä tuohon ja sen kellonajan asettamisen valikot vielä niin eiköhän siitä hyvä tule.
Osassa 2 käsitellään piirilevyn suunnittelua KiCAD ohjelmalla ja piirilevyjen teettämistä.
Osassa 3 Asennetaan koko komeus moottoripyörään ja todetaan ajotietokoneen toimivuus.