lauantai 4. maaliskuuta 2017

Kikki hiiri ja muita kuulumisia

Muistin juuri, että minullahan on blogi. En ole juuri kerennyt tänne kirjoitella, vaikka aiheeseen liittyvää asiaa olisi ollut enemmän kuin koskaan. Opinnot ovat edenneet siihen vaiheeseen, että meillä on lukujärjestyksessä enimmäkseen ohjelmointia ja sehän on varsin mukavaa hommaa. Olen oppinut tosi paljon uutta C, C++ ja C# -ohjelmoinnista. mikrokontrollereita ja prosessoreista. Ehkäpä mielenkiintoisin kurssi tällä hetkellä on Mikroprosessoriohjelmoinnin perusteet, jossa kirjoitamme kokonaan itse Arduino -yhteensopivan kirjaston Atmel -kontrollereille C++:lla.

Noin niinkuin harrastusten saralla olen innostunut Android-ohjelmoinnista ja facebookia seuraavat ovatkin kenties huomanneet, että julkaisin ensimmäisen sovellukseni Play Storessa.


Kikki Watch Facen kanssa kaikki ei ole kuitenkaan mennyt ihan niinkuin elokuvissa. Applikaation ohjelmoinnissa ei esiintynyt suuria hankaluuksia, vaikka Javalla en juuri olekaan koodannut. Kellotaulu toimii mainiosti omassa Huawei Watchissani (sekä emulaattoreissa) kun siirrän debug-version piuhaa pitkin kelloon.

Homma menee monimutkaiseksi siinä vaiheessa, kun pitää tehdä tosielämässä (a.k.a. Play Storessa) toimiva versio, jonka asiakas lataa ensin puhelimeensa Play Storesta, ja puhelin työntää sen jälkeen kellotaulusovelluksen yhdistettyyn älykelloon. Minulla on ilmeisesti joku bugi koodissani, sillä vaikka puhelin asentaa sovelluksen, se ei koskaan pääse kelloon saakka. Ongelmaa on ollut hyvin hankala paikallistaa, sillä Android studiossa ei tule build erroreita.

Hankalammaksi asian tekee vielä se, että Wear - API:sta on tällä hetkellä kaksi hyvin pitkälti erilaista versiota, 1.X sekä uudemmissa kelloissa toimiva 2.0. Kehitän sovellusta 1.x -versiota käyttäviin kelloihin, joissa asennus tapahtuu edellä kuvatun kaltaisesti siten, että projektiin tehdään kaksi APK-pakettia, toinen puhelimeen ja toinen kelloon. Kelloon työnnettävä paketti sisällytetään puhelimen APK:hon joka ladataan Play Storeen ja kaikki on vähintäänkin sekavaa. Wear API 2 on paljon selkeämmän tuntuinen, mutta tuettujen kellojen määrä putoaa murto-osaan.

Olen nyt kokeillut buildata tosi monella eri versiolla Android SDK:sta, play servicesistä ja wearable support librarystä, mutta homma tuntuu menevän vain enemmän solmuun. Minulla on melkein pakkomielle saada tuo toimimaan mahdollisimman äkkiä, mutta otin vaimoni neuvosta vaarin ja vietin koko eilisillan poissa ruudun äärestä. Tai, no siihen asti kun hän meni nukkumaan, jolloin rentouduin vähän asentamalla Tonic C++ audiosynteesikirjaston ja leikkimällä sen kanssa :D. Ehkäpä teen niin, että otan vielä päivän pari etäisyyttä projektiin, ja kokeilen sitten uudestaan. Jos ei muuten niin rakennan koko projektin uudelleen, kun olen lukenut koko Android developers training -ohjeistuksen ajatuksella läpi.

Koska rakastan edelleen myös graafista suunnittelua, tein itselleni Illustratorin voimin kehittäjäbrändin nimeltä Null Mode (käy tykkäämässä). Itselleen on kiva tehdä logoja, sillä asiakas on aina oikeassa :)


sunnuntai 23. lokakuuta 2016

LEDimatriisi pähkinäpuukotelossa

Pahoitteluni, en ole tänä syksynä kerennyt puuhastelemaan juurikaan harrastusten parissa, joten blogikin on jäänyt orvoksi. Perustamani yritys, perhe-elämä, muutama työn alla oleva nettisivusto, järjestötoiminta ja opiskelu ovat vieneet kaiken aikani varsin tehokkaasti. Huomennakin olisi analogia- ja tehoelektroniikan tentti, mutta jotenkin kummasti löydän itseni kirjoittamasta tätä opiskelun sijaan :D

Matriisia pitäisi saada laskettua alemmas, että hiottu pleksi taittaisi valoa kivemmin. Vähän ahdasta rasiassa on, mutta kyllä se onnistunee jos taivuttaa pinnejä 90 asteen kulmaan.

torstai 11. elokuuta 2016

TankkiBotti - ensimmäisen version ohjelma ja kytkentäkaavio



Edellisessä artikkelissa kertoilin uudesta robottiprojektistani TankkiBotista (Nimi ehkä muutettava, alkaa ärsyttämään jo nyt :D). Kokeilin tänään minulle uutta ohjelmaa nimeltä Fritzing, jolla tein botin tämänhetkisestä tilasta kytkentäkaavion:

tiistai 9. elokuuta 2016

TankkiBotti

Oh yeah! Maadoitusmittaukset Inspectalla on nyt tämän kesän osalta tehty, joten minulla on muutama viikko kesälomaa ennen Tekuun palaamista. Mikäpä sen mukavampi tapa viettää kesälomaa, kuin rakennella elektroniikkaa neljän seinän sisällä! No käyn minä joskus ulkonakin.

Kuten minut tuntevat tietävät, minulla on päällekkäin ja limittäin monia projekteja, joista osa valmistuu ja osa valmistuu aika tavalla hitaammin, jos silloinkaan. Jälkimmäiseen kategoriaan taitaa kuulua sääasema, jolla aloitin tämän blogin. Mutta hyvästä syystä: Kesän aikana päässäni kytenyt ajatelma telaketjuilla varustetusta robotista on lähes huomaamatta edennyt jo tekemisen asteelle. Saanko esitellä, TankkiBotti:



TankkiBotti, versio alfa piste Jägermaister. Huomaa ultraäänisensorin professionaalinen ripustus. Yritin selittää Ninalle että ei, en leiki Legoilla vaan teen tuotekehitystä. Ei tainnut uskoa.

lauantai 23. heinäkuuta 2016

Commodoreongelmia


Suurena syntetisaattori- ja retrotietokoneintoilijana tilasin itselleni Ruotsista synttärilahjaksi MSSIAH - moduulin Commodore 64:lle. Kyseessä oleva palikka sisältää midiportin ja erilaisia musiikkisoftia Commodoren legendaarisen SID-äänipiirin ohjaukseen:


Minulla oli ennestään yksi C64, jonka toimivuudesta ei ollut tietoa, sillä siitä puuttui virtalähde ja videopiuha. Kuusnelosen virtalähde on sen verran erikoinen viritelmä 9V AC, 12V DC ja 5V DC -jännitesyötöillään, että en viitsinyt alkaa askartelemaan sellaista itse. Huuto.netissä ja Tori.fissä on silloin tällöin myytävänä 64:n osia ja varusteita, mutta hinnat ovat yleensä aivan käsittämättömiä. Minulla kävi kuitenkin tuuri, kun selasin Toria, sillä joku myi rikkinäistä Commodorea ja virtalähdettä hintaan 15€ ja vieläpä kotikunnassani.

sunnuntai 26. kesäkuuta 2016

Tee-se-itse-palvelin sensoridatalle Node.js:llä

Internetiin yhdistetyt sensorit tuottavat hirmuisen määrän dataa, ja koko hommassa ei ole mitään järkeä jos tietoa ei saa tallennettua tietokantaan ja haettua ja suodatettua tarvittaessa. Tätä varten on pilvipalveluja, mutta olen jo pitkään halunnut viritellä oman serverin kotiin. Lisäksi kiinnostuin vähän aikaa sitten node.js:stä, joten päätin tehdä koko homman itse.

Teinkö todella vuokaavion? Taisinpa tehdä. Verkkoon liitetty valoisuussensorini lähettää kerran minuutissa lukemansa wifin kautta node.js -serverille, joka tallentaa sen MongoDB-tietokantaan. Dataa voi katsella ja muokata webbikäyttöliittymän kautta.


Olen asentanut muutaman kerran perinteisen LAMP -stackin (Linux, Apache, MySQL, PHP), ja sellaisenkin päälle olisin toki voinut dataa keräävän serverini rakentaa. Olen kuitenkin taustaltani huomattavasti enemmän front- kuin backendkoodaaja, joten mahdollisuus käyttää tutumpaa JavaScriptiä serverin puolella sai minut valitsemaan node.js:n. Tyhjensin siis vanhan media-PC:n serveriksi ja asensin siihen Ubuntu 16.04 -käyttiksen. Tietokantana toimii MongoDB ja serverinä node.js:n ja express.js:n voimin ohjelmoitu tee-se-itse -palvelin.

En ole ikinä koodannut serveriä enkä ajatellut sitä nytkään tekeväni, mutta löysin vaativan mutta mainion tutoriaalin aiheesta. En ala tässä käymään sen tarkemmin läpi pitkähköä ja teknistä asennus- ja koodaussessiota, mutta asiasta kiinnostunut löytää paljon lisätietoa edellä olevasta linkistä. Lyhyesti kuvattuna Express.js loi valmiin luurangon, jonka päälle on nopea kehittää monenlaisia node.js -sovelluksia. Serveri oli valmis muutaman illan koodailun tuloksena (voi juhannuksen näinkin viettää :D). Se sisältää kirjautumisen, autentikoinnin, salasanojen hashauksen, käyttäjien hallinnan, datasettien luomisen ja yksilöllisten API-avaimien generoinnin.

Hyödyllisemmän sensorin puuttuessa liitin NodeMCU -mikrokontrolleriin valovastuksen sarjaan 12k vastuksen kanssa 3.3 voltin ja ainokaisen analogisen pinnin väliin, ja kirjoitin ohjelman joka lähettää kerran minuutissa luetun arvon tuliterälle palvelimelleni GET-metodilla. Jotta tietokantaan voi kirjoittaa arvoja, ko. datasetin täytyy olla ensin asetettu julkiseksi ja lähettävän ohjelman täytyy tietää oikea API-avain.

Vasemmalla MacGyveroidun sensorini lukemat muutaman tunnin ajalta, oikealla serverin loki. Datasta voimme päätellä että a) aurinko menee välillä pilveen ja b) valon määrä tuvan puolella taloa kasvaa iltaa kohti. Onpahan nyt faktatietoa asiasta.


sunnuntai 19. kesäkuuta 2016

verkko-ohjattu LED

Ekskursioni Lua-ohjelmointiin NodeMCU:lla edistyy. Kirjoitin lähiverkossa toimivan serverin, jonka kautta voi ohjata RGB-LEDiä puhelimella, tabletilla tai millä vain laitteella jossa on selain. Kytkentä ei voisi olla simppelimpi, sillä NodeMCU toimii 3.3 voltin jännitteellä, joka on tarpeeksi lähellä LEDin käyttöjännitettä. Kytkin yhteisen katodin maahan ja jokaisen värin anodin omaan ulostulopinniinsä. Pitempiaikaiseen installaatioon olisi ehkä silti syytä laittaa virtaa rajoittavat vastukset anodeihin, sillä valo on melko kirkas.


NodeMCU-firmwaren tehokkuus näkyy hyvin koodin pituudessa: koko ohjelma on vain noin sata riviä pitkä ja siitäkin suurimman osan muodostaa asiakaslaitteelle tarjoiltava HTML. Vastaavan serverin ohjelmointi pelkällä C:llä vaatisi jäätävän paljon enemmän koodia. Lua on kuitenkin rakennettu C:n päälle ja tukee tarvittaessa C-kielen funktioita kun halutaan suorituskykyä.

Ohjelma avaa lähiverkkoon yksinkertaisen serverin, joka kuuntelee TCP-yhteyksiä portissa 80 ja lähettää asiakkaalle nettisivun joka sisältää punaisen, sinisen ja vihreän neliön, joita klikkaamalla lähetetään palvelimelle get-metodilla avain/arvopari (esim ?vari=PUNAINEN). Ohjelma tulkkaa avaimen ja arvon URL:n perästä saadessaan get-komennon, ja sytyttää halutun LEDin.

Alla oleva listaus toimii, mutta se on yksinkertaisempi mitä aluksi koodasin. Jostain syystä merkkijonoksi tallennettu bufferi ei voi olla suurempi kuin 1460 tavua, ja jouduin poistamaan HTML-koodista noin puolet. Tutkimukset aiheesta jatkuvat, sillä mitään tämän monimutkaisempaa ei niin minimaaliseen tilaan mahdu. Tuli mieleen ainakin koodin pätkiminen alle 1460 tavun paketteihin ja niiden lähettäminen asiakkaalle yksi kerrallaan, mutta toivoisin jotain vähemmän monimutkaista ratkaisua.